]> granicus.if.org Git - strace/blobdiff - defs.h
tests: move F_OFD_SETLK* checks from fcntl64.c to fcntl-common.c
[strace] / defs.h
diff --git a/defs.h b/defs.h
index 59eb04568954debc9db52cd982e78b4f7d936d3e..ea918017505f24b2d537317a00662ec7e367286f 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -464,11 +464,46 @@ static inline int set_tcb_priv_ulong(struct tcb *tcp, unsigned long val)
        return set_tcb_priv_data(tcp, (void *) val, 0);
 }
 
+/**
+ * @return 0 on success, -1 on error.
+ */
 extern int
 umoven(struct tcb *, kernel_ulong_t addr, unsigned int len, void *laddr);
 #define umove(pid, addr, objp) \
        umoven((pid), (addr), sizeof(*(objp)), (void *) (objp))
 
+/**
+ * @return true on success, false on error.
+ */
+extern bool
+tfetch_mem64(struct tcb *, uint64_t addr, unsigned int len, void *laddr);
+
+static inline bool
+tfetch_mem(struct tcb *tcp, const kernel_ulong_t addr,
+          unsigned int len, void *laddr)
+{
+       return tfetch_mem64(tcp, addr, len, laddr);
+}
+#define tfetch_obj(pid, addr, objp)    \
+       tfetch_mem((pid), (addr), sizeof(*(objp)), (void *) (objp))
+
+/**
+ * @return true on success, false on error.
+ */
+extern bool
+tfetch_mem64_ignore_syserror(struct tcb *, uint64_t addr,
+                            unsigned int len, void *laddr);
+
+static inline bool
+tfetch_mem_ignore_syserror(struct tcb *tcp, const kernel_ulong_t addr,
+                          unsigned int len, void *laddr)
+{
+       return tfetch_mem64_ignore_syserror(tcp, addr, len, laddr);
+}
+
+/**
+ * @return 0 on success, -1 on error (and print addr).
+ */
 extern int
 umoven_or_printaddr64(struct tcb *, uint64_t addr,
                      unsigned int len, void *laddr);
@@ -484,6 +519,9 @@ umoven_or_printaddr(struct tcb *tcp, const kernel_ulong_t addr,
 #define umove_or_printaddr(pid, addr, objp)    \
        umoven_or_printaddr((pid), (addr), sizeof(*(objp)), (void *) (objp))
 
+/**
+ * @return 0 on success, -1 on error (and print addr).
+ */
 extern int
 umoven_or_printaddr64_ignore_syserror(struct tcb *, uint64_t addr,
                                      unsigned int len, void *laddr);
@@ -501,30 +539,15 @@ umoven_or_printaddr_ignore_syserror(struct tcb *tcp, const kernel_ulong_t addr,
        umoven_or_printaddr_ignore_syserror((pid), (addr), sizeof(*(objp)), \
                                            (void *) (objp))
 
+/**
+ * @return strlen + 1 on success, 0 on success and no NUL seen, -1 on error.
+ */
 extern int
 umovestr(struct tcb *, kernel_ulong_t addr, unsigned int len, char *laddr);
 
 extern int upeek(struct tcb *tcp, unsigned long, kernel_ulong_t *);
 extern int upoke(struct tcb *tcp, unsigned long, kernel_ulong_t);
 
-extern bool print_uint64_array_member(struct tcb *tcp, void *elem_buf,
-                                     size_t elem_size, void *data);
-extern bool
-print_array(struct tcb *,
-           kernel_ulong_t start_addr,
-           size_t nmemb,
-           void *elem_buf,
-           size_t elem_size,
-           int (*umoven_func)(struct tcb *,
-                                    kernel_ulong_t,
-                                    unsigned int,
-                                    void *),
-           bool (*print_func)(struct tcb *,
-                                    void *elem_buf,
-                                    size_t elem_size,
-                                    void *opaque_data),
-           void *opaque_data);
-
 #if HAVE_ARCH_GETRVAL2
 extern long getrval2(struct tcb *);
 #endif
@@ -606,45 +629,16 @@ extern int printllval(struct tcb *, const char *, int)
        ATTRIBUTE_FORMAT((printf, 2, 0));
 
 extern void printaddr64(uint64_t addr);
-extern void printaddr(kernel_ulong_t addr);
 
-#define XLAT_STYLE_VERBOSITY_MASK (XLAT_STYLE_RAW | XLAT_STYLE_ABBREV)
-#define XLAT_STYLE_FORMAT_SHIFT   2
-#define XLAT_STYLE_FORMAT_MASK    (3 << XLAT_STYLE_FORMAT_SHIFT)
+static inline void
+printaddr(const kernel_ulong_t addr)
+{
+       printaddr64(addr);
+}
 
 #define xlat_verbose(style_) ((style_) & XLAT_STYLE_VERBOSITY_MASK)
 #define xlat_format(style_)  ((style_) & XLAT_STYLE_FORMAT_MASK)
 
-enum xlat_type {
-       XT_NORMAL,
-       XT_SORTED,
-       XT_INDEXED,
-};
-
-enum xlat_style {
-       /**
-        * Special value that is used for passing to *print{xval,flags}*_ex
-        * routines that indicates that no overriding of user-supplied xlat
-        * verbosity/formatting configuration is intended.
-        */
-       XLAT_STYLE_DEFAULT = 0,
-
-       /** Print xlat value as is without xlat processing */
-       XLAT_STYLE_RAW     = 1 << 0,
-       /**
-        * Historic strace style, process xlat and print the result (xlat
-        * constant name/combination of flags), raw number only if nothing is
-        * found.
-        */
-       XLAT_STYLE_ABBREV  = 1 << 1,
-       /** Always print both raw number and xlat processing result. */
-       XLAT_STYLE_VERBOSE = XLAT_STYLE_RAW | XLAT_STYLE_ABBREV,
-
-       XLAT_STYLE_FMT_X   = 0 << XLAT_STYLE_FORMAT_SHIFT,
-       XLAT_STYLE_FMT_U   = 1 << XLAT_STYLE_FORMAT_SHIFT,
-       XLAT_STYLE_FMT_D   = 2 << XLAT_STYLE_FORMAT_SHIFT,
-};
-
 extern enum xlat_style xlat_verbosity;
 
 extern int printxvals_ex(uint64_t val, const char *dflt,
@@ -753,6 +747,67 @@ extern void print_numeric_long_umask(unsigned long);
 extern void print_dev_t(unsigned long long dev);
 extern void print_abnormal_hi(kernel_ulong_t);
 
+extern bool print_int32_array_member(struct tcb *, void *elem_buf,
+                                    size_t elem_size, void *data);
+extern bool print_uint32_array_member(struct tcb *, void *elem_buf,
+                                     size_t elem_size, void *data);
+extern bool print_uint64_array_member(struct tcb *, void *elem_buf,
+                                     size_t elem_size, void *data);
+
+typedef bool (*tfetch_mem_fn)(struct tcb *, kernel_ulong_t addr,
+                             unsigned int size, void *dest);
+typedef bool (*print_fn)(struct tcb *, void *elem_buf,
+                        size_t elem_size, void *opaque_data);
+
+enum print_array_flag_bits {
+       PAF_PRINT_INDICES_BIT = XLAT_STYLE_SPEC_BITS + 1,
+       PAF_INDEX_XLAT_SORTED_BIT,
+       PAF_INDEX_XLAT_VALUE_INDEXED_BIT,
+};
+
+#define FLAG_(name_) name_ = 1 << name_##_BIT
+
+enum print_array_flags {
+       FLAG_(PAF_PRINT_INDICES),
+       FLAG_(PAF_INDEX_XLAT_SORTED),
+       FLAG_(PAF_INDEX_XLAT_VALUE_INDEXED),
+};
+
+#undef FLAG_
+
+/**
+ * @param flags Combination of xlat style settings and additional flags from
+ *              enum print_array_flags.
+ */
+extern bool
+print_array_ex(struct tcb *,
+              kernel_ulong_t start_addr,
+              size_t nmemb,
+              void *elem_buf,
+              size_t elem_size,
+              tfetch_mem_fn tfetch_mem_func,
+              print_fn print_func,
+              void *opaque_data,
+              unsigned int flags,
+              const struct xlat *index_xlat,
+              size_t index_xlat_size,
+              const char *index_dflt);
+
+static inline bool
+print_array(struct tcb *const tcp,
+           const kernel_ulong_t start_addr,
+           const size_t nmemb,
+           void *const elem_buf,
+           const size_t elem_size,
+           tfetch_mem_fn tfetch_mem_func,
+           print_fn print_func,
+           void *const opaque_data)
+{
+       return print_array_ex(tcp, start_addr, nmemb, elem_buf, elem_size,
+                             tfetch_mem_func, print_func, opaque_data,
+                             0, NULL, 0, NULL);
+}
+
 extern kernel_ulong_t *
 fetch_indirect_syscall_args(struct tcb *, kernel_ulong_t addr, unsigned int n_args);
 
@@ -840,6 +895,11 @@ print_struct_statfs(struct tcb *, kernel_ulong_t addr);
 extern void
 print_struct_statfs64(struct tcb *, kernel_ulong_t addr, kernel_ulong_t size);
 
+extern int
+fetch_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr);
+extern void
+print_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr);
+
 extern void print_ifindex(unsigned int);
 
 extern void print_bpf_filter_code(const uint16_t code, bool extended);
@@ -856,6 +916,7 @@ DECL_IOCTL(dm);
 DECL_IOCTL(evdev);
 DECL_IOCTL(file);
 DECL_IOCTL(fs_x);
+DECL_IOCTL(inotify);
 DECL_IOCTL(kvm);
 DECL_IOCTL(nsfs);
 DECL_IOCTL(ptp);
@@ -1029,6 +1090,12 @@ extern void tprints(const char *str);
 extern void tprintf_comment(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2));
 extern void tprints_comment(const char *str);
 
+static inline void
+printaddr_comment(const kernel_ulong_t addr)
+{
+       tprintf_comment("%#llx", (unsigned long long) addr);
+}
+
 static inline void
 print_mac_addr(const char *prefix, const uint8_t addr[], size_t size)
 {
@@ -1272,28 +1339,25 @@ truncate_kulong_to_current_wordsize(const kernel_ulong_t v)
         sizeof(v) == sizeof(long) ? (long long) (long) (v) : \
         (long long) (v))
 
+extern const char *const errnoent[];
+extern const char *const signalent[];
+extern const unsigned int nerrnos;
+extern const unsigned int nsignals;
+
 extern const struct_sysent sysent0[];
-extern const char *const errnoent0[];
-extern const char *const signalent0[];
 extern const struct_ioctlent ioctlent0[];
 
 extern const char *const personality_names[];
 
 #if SUPPORTED_PERSONALITIES > 1
 extern const struct_sysent *sysent;
-extern const char *const *errnoent;
-extern const char *const *signalent;
 extern const struct_ioctlent *ioctlent;
 #else
 # define sysent     sysent0
-# define errnoent   errnoent0
-# define signalent  signalent0
 # define ioctlent   ioctlent0
 #endif
 
 extern unsigned nsyscalls;
-extern unsigned nerrnos;
-extern unsigned nsignals;
 extern unsigned nioctlents;
 
 extern const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES];