]> granicus.if.org Git - strace/blobdiff - defs.h
Move device number printing code into a separate routine
[strace] / defs.h
diff --git a/defs.h b/defs.h
index 61a5e1200232c676cd4aab78c5f48ed6a6f8881c..1e056068ce3be39a2e1794fcea615184dcec9ff2 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -217,7 +217,8 @@ typedef struct ioctlent {
 struct fault_opts {
        uint16_t first;
        uint16_t step;
-       uint16_t err;
+       int16_t err;
+       uint16_t signo;
 };
 
 /* Trace Control Block */
@@ -439,7 +440,7 @@ extern int read_int_from_file(const char *, int *);
 extern void set_sortby(const char *);
 extern void set_overhead(int);
 extern void print_pc(struct tcb *);
-extern int trace_syscall(struct tcb *);
+extern int trace_syscall(struct tcb *, unsigned int *);
 extern void count_syscall(struct tcb *, const struct timeval *);
 extern void call_summary(FILE *);
 
@@ -580,6 +581,7 @@ extern const char *sprinttime(time_t);
 extern void print_symbolic_mode_t(unsigned int);
 extern void print_numeric_umode_t(unsigned short);
 extern void print_numeric_long_umask(unsigned long);
+extern void print_dev_t(unsigned long long dev);
 
 extern void
 dumpiov_in_msghdr(struct tcb *, kernel_ulong_t addr, kernel_ulong_t data_size);
@@ -597,51 +599,6 @@ extern void
 printstr_ex(struct tcb *, kernel_ulong_t addr, kernel_ulong_t len,
            unsigned int user_style);
 
-#define DECL_PRINTNUM(name)                                            \
-extern bool                                                            \
-printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)  \
-       ATTRIBUTE_FORMAT((printf, 3, 0))
-DECL_PRINTNUM(short);
-DECL_PRINTNUM(int);
-DECL_PRINTNUM(int64);
-#undef DECL_PRINTNUM
-
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-extern bool
-printnum_long_int(struct tcb *, kernel_ulong_t addr,
-                 const char *fmt_long, const char *fmt_int)
-       ATTRIBUTE_FORMAT((printf, 3, 0))
-       ATTRIBUTE_FORMAT((printf, 4, 0));
-# define printnum_slong(tcp, addr) \
-       printnum_long_int((tcp), (addr), "%" PRId64, "%d")
-# define printnum_ulong(tcp, addr) \
-       printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
-# define printnum_ptr(tcp, addr) \
-       printnum_long_int((tcp), (addr), "%#" PRIx64, "%#x")
-#elif SIZEOF_LONG > 4
-# define printnum_slong(tcp, addr) \
-       printnum_int64((tcp), (addr), "%" PRId64)
-# define printnum_ulong(tcp, addr) \
-       printnum_int64((tcp), (addr), "%" PRIu64)
-# define printnum_ptr(tcp, addr) \
-       printnum_int64((tcp), (addr), "%#" PRIx64)
-#else
-# define printnum_slong(tcp, addr) \
-       printnum_int((tcp), (addr), "%d")
-# define printnum_ulong(tcp, addr) \
-       printnum_int((tcp), (addr), "%u")
-# define printnum_ptr(tcp, addr) \
-       printnum_int((tcp), (addr), "%#x")
-#endif
-
-#define DECL_PRINTPAIR(name)                                           \
-extern bool                                                            \
-printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
-       ATTRIBUTE_FORMAT((printf, 3, 0))
-DECL_PRINTPAIR(int);
-DECL_PRINTPAIR(int64);
-#undef DECL_PRINTPAIR
-
 extern void
 printpathn(struct tcb *, kernel_ulong_t addr, unsigned int n);
 
@@ -841,24 +798,101 @@ extern unsigned current_klongsize;
 # endif
 #endif
 
-/* In many, many places we play fast and loose and use
- * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
- * We probably need to use widen_to_long() instead:
- */
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
-#else
-# define widen_to_long(v) ((long)(v))
+#define ANY_WORDSIZE_LESS_THAN_KERNEL_LONG     \
+       (SIZEOF_KERNEL_LONG_T > 4               \
+        && (SIZEOF_LONG < SIZEOF_KERNEL_LONG_T || !defined(current_wordsize)))
+
+#define DECL_PRINTNUM(name)                                            \
+extern bool                                                            \
+printnum_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt)  \
+       ATTRIBUTE_FORMAT((printf, 3, 0))
+DECL_PRINTNUM(short);
+DECL_PRINTNUM(int);
+DECL_PRINTNUM(int64);
+#undef DECL_PRINTNUM
+
+#define DECL_PRINTNUM_ADDR(name)                                       \
+extern bool                                                            \
+printnum_addr_ ## name(struct tcb *, kernel_ulong_t addr)
+DECL_PRINTNUM_ADDR(int);
+DECL_PRINTNUM_ADDR(int64);
+#undef DECL_PRINTNUM_ADDR
+
+#ifndef current_wordsize
+extern bool
+printnum_long_int(struct tcb *, kernel_ulong_t addr,
+                 const char *fmt_long, const char *fmt_int)
+       ATTRIBUTE_FORMAT((printf, 3, 0))
+       ATTRIBUTE_FORMAT((printf, 4, 0));
+extern bool printnum_addr_long_int(struct tcb *, kernel_ulong_t addr);
+# define printnum_slong(tcp, addr) \
+       printnum_long_int((tcp), (addr), "%" PRId64, "%d")
+# define printnum_ulong(tcp, addr) \
+       printnum_long_int((tcp), (addr), "%" PRIu64, "%u")
+# define printnum_ptr(tcp, addr) \
+       printnum_addr_long_int((tcp), (addr))
+#elif current_wordsize > 4
+# define printnum_slong(tcp, addr) \
+       printnum_int64((tcp), (addr), "%" PRId64)
+# define printnum_ulong(tcp, addr) \
+       printnum_int64((tcp), (addr), "%" PRIu64)
+# define printnum_ptr(tcp, addr) \
+       printnum_addr_int64((tcp), (addr))
+#else /* current_wordsize == 4 */
+# define printnum_slong(tcp, addr) \
+       printnum_int((tcp), (addr), "%d")
+# define printnum_ulong(tcp, addr) \
+       printnum_int((tcp), (addr), "%u")
+# define printnum_ptr(tcp, addr) \
+       printnum_addr_int((tcp), (addr))
 #endif
 
-#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
-# define widen_to_ulong(v) \
-       (current_wordsize == 4 ? (unsigned long) (uint32_t) (v) : \
-               (unsigned long) (v))
-#else
-# define widen_to_ulong(v) ((unsigned long)(v))
+#ifndef current_klongsize
+extern bool printnum_addr_klong_int(struct tcb *, kernel_ulong_t addr);
+# define printnum_kptr(tcp, addr) \
+       printnum_addr_klong_int((tcp), (addr))
+#elif current_klongsize > 4
+# define printnum_kptr(tcp, addr) \
+       printnum_addr_int64((tcp), (addr))
+#else /* current_klongsize == 4 */
+# define printnum_kptr(tcp, addr) \
+       printnum_addr_int((tcp), (addr))
 #endif
 
+#define DECL_PRINTPAIR(name)                                           \
+extern bool                                                            \
+printpair_ ## name(struct tcb *, kernel_ulong_t addr, const char *fmt) \
+       ATTRIBUTE_FORMAT((printf, 3, 0))
+DECL_PRINTPAIR(int);
+DECL_PRINTPAIR(int64);
+#undef DECL_PRINTPAIR
+
+static inline kernel_long_t
+truncate_klong_to_current_wordsize(const kernel_long_t v)
+{
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+       if (current_wordsize < sizeof(v)) {
+               return (int) v;
+       } else
+#endif
+       {
+               return v;
+       }
+}
+
+static inline kernel_ulong_t
+truncate_kulong_to_current_wordsize(const kernel_ulong_t v)
+{
+#if ANY_WORDSIZE_LESS_THAN_KERNEL_LONG
+       if (current_wordsize < sizeof(v)) {
+               return (unsigned int) v;
+       } else
+#endif
+       {
+               return v;
+       }
+}
+
 /*
  * Cast a pointer or a pointer-sized integer to kernel_ulong_t.
  */