X-Git-Url: https://granicus.if.org/sourcecode?a=blobdiff_plain;f=defs.h;h=6fcb5186a025fa9d9bcf94898235d19e711745fd;hb=044eef21867521a9d0340015dc673f2f5909e804;hp=3b027e8472c393abace0a7b9b11f030178b5e2ef;hpb=4793221a53fb69aa519bc91ab19a79524c0df097;p=strace diff --git a/defs.h b/defs.h index 3b027e84..6fcb5186 100644 --- a/defs.h +++ b/defs.h @@ -30,25 +30,6 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#ifdef _LARGEFILE64_SOURCE -/* This is the macro everything checks before using foo64 names. */ -# ifndef _LFS64_LARGEFILE -# define _LFS64_LARGEFILE 1 -# endif -#endif - -#ifdef MIPS -# include -# if _MIPS_SIM == _MIPS_SIM_ABI64 -# define LINUX_MIPSN64 -# elif _MIPS_SIM == _MIPS_SIM_NABI32 -# define LINUX_MIPSN32 -# elif _MIPS_SIM == _MIPS_SIM_ABI32 -# define LINUX_MIPSO32 -# else -# error Unsupported _MIPS_SIM -# endif -#endif #include #ifdef HAVE_STDBOOL_H @@ -86,8 +67,46 @@ const char *strerror(int); extern char *stpcpy(char *dst, const char *src); #endif -#if !defined __GNUC__ -# define __attribute__(x) /*nothing*/ +#if defined __GNUC__ && defined __GNUC_MINOR__ +# define GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else +# define __attribute__(x) /* empty */ +# define GNUC_PREREQ(maj, min) 0 +#endif + +#if GNUC_PREREQ(2, 5) +# define ATTRIBUTE_NORETURN __attribute__((__noreturn__)) +#else +# define ATTRIBUTE_NORETURN /* empty */ +#endif + +#if GNUC_PREREQ(2, 7) +# define ATTRIBUTE_FORMAT(args) __attribute__((__format__ args)) +# define ATTRIBUTE_ALIGNED(arg) __attribute__((__aligned__(arg))) +# define ATTRIBUTE_PACKED __attribute__((__packed__)) +#else +# define ATTRIBUTE_FORMAT(args) /* empty */ +# define ATTRIBUTE_ALIGNED(arg) /* empty */ +# define ATTRIBUTE_PACKED /* empty */ +#endif + +#if GNUC_PREREQ(3, 0) +# define ATTRIBUTE_MALLOC __attribute__((__malloc__)) +#else +# define ATTRIBUTE_MALLOC /* empty */ +#endif + +#if GNUC_PREREQ(3, 1) +# define ATTRIBUTE_NOINLINE __attribute__((__noinline__)) +#else +# define ATTRIBUTE_NOINLINE /* empty */ +#endif + +#if GNUC_PREREQ(4, 3) +# define ATTRIBUTE_ALLOC_SIZE(args) __attribute__((__alloc_size__ args)) +#else +# define ATTRIBUTE_ALLOC_SIZE(args) /* empty */ #endif #ifndef offsetof @@ -146,33 +165,15 @@ extern char *stpcpy(char *dst, const char *src); #define USE_SEIZE 1 /* To force NOMMU build, set to 1 */ #define NOMMU_SYSTEM 0 - -#if (defined(SPARC) || defined(SPARC64) \ - || defined(I386) || defined(X32) || defined(X86_64) \ - || defined(ARM) || defined(AARCH64) \ - || defined(AVR32) \ - || defined(OR1K) \ - || defined(METAG) \ - || defined(TILE) \ - || defined(XTENSA) \ - ) && defined(__GLIBC__) -# include -#else -/* Work around awkward prototype in ptrace.h. */ -# define ptrace xptrace -# include -# undef ptrace -# ifdef POWERPC -# define __KERNEL__ -# include -# undef __KERNEL__ -# endif -extern long ptrace(int, int, char *, long); -#endif - -#if defined(TILE) -# include /* struct pt_regs */ -#endif +/* + * Set to 1 to use speed-optimized vfprintf implementation. + * It results in strace using about 5% less CPU in user space + * (compared to glibc version). + * But strace spends a lot of time in kernel space, + * so overall it does not appear to be a significant win. + * Thus disabled by default. + */ +#define USE_CUSTOM_PRINTF 0 #ifndef ERESTARTSYS # define ERESTARTSYS 512 @@ -187,146 +188,13 @@ extern long ptrace(int, int, char *, long); # define ERESTART_RESTARTBLOCK 516 #endif -#if !HAVE_DECL_PTRACE_SETOPTIONS -# define PTRACE_SETOPTIONS 0x4200 -#endif -#if !HAVE_DECL_PTRACE_GETEVENTMSG -# define PTRACE_GETEVENTMSG 0x4201 -#endif -#if !HAVE_DECL_PTRACE_GETSIGINFO -# define PTRACE_GETSIGINFO 0x4202 -#endif - -#if !HAVE_DECL_PTRACE_O_TRACESYSGOOD -# define PTRACE_O_TRACESYSGOOD 0x00000001 -#endif -#if !HAVE_DECL_PTRACE_O_TRACEFORK -# define PTRACE_O_TRACEFORK 0x00000002 -#endif -#if !HAVE_DECL_PTRACE_O_TRACEVFORK -# define PTRACE_O_TRACEVFORK 0x00000004 -#endif -#if !HAVE_DECL_PTRACE_O_TRACECLONE -# define PTRACE_O_TRACECLONE 0x00000008 -#endif -#if !HAVE_DECL_PTRACE_O_TRACEEXEC -# define PTRACE_O_TRACEEXEC 0x00000010 -#endif -#if !HAVE_DECL_PTRACE_O_TRACEEXIT -# define PTRACE_O_TRACEEXIT 0x00000040 -#endif - -#if !HAVE_DECL_PTRACE_EVENT_FORK -# define PTRACE_EVENT_FORK 1 -#endif -#if !HAVE_DECL_PTRACE_EVENT_VFORK -# define PTRACE_EVENT_VFORK 2 -#endif -#if !HAVE_DECL_PTRACE_EVENT_CLONE -# define PTRACE_EVENT_CLONE 3 -#endif -#if !HAVE_DECL_PTRACE_EVENT_EXEC -# define PTRACE_EVENT_EXEC 4 -#endif -#if !HAVE_DECL_PTRACE_EVENT_VFORK_DONE -# define PTRACE_EVENT_VFORK_DONE 5 -#endif -#if !HAVE_DECL_PTRACE_EVENT_EXIT -# define PTRACE_EVENT_EXIT 6 -#endif - -#if !defined(__GLIBC__) -# define PTRACE_PEEKUSER PTRACE_PEEKUSR -# define PTRACE_POKEUSER PTRACE_POKEUSR -#endif - -#undef PTRACE_SEIZE -#define PTRACE_SEIZE 0x4206 -#undef PTRACE_INTERRUPT -#define PTRACE_INTERRUPT 0x4207 -#undef PTRACE_LISTEN -#define PTRACE_LISTEN 0x4208 -#undef PTRACE_EVENT_STOP -#define PTRACE_EVENT_STOP 128 - -#ifdef ALPHA -# define REG_R0 0 -# define REG_A0 16 -# define REG_A3 19 -# define REG_FP 30 -# define REG_PC 64 -#endif /* ALPHA */ -#ifdef MIPS -# define REG_V0 2 -# define REG_A0 4 -# define REG_A3 7 -# define REG_SP 29 -# define REG_EPC 64 -#endif /* MIPS */ -#ifdef HPPA -# define PT_GR20 (20*4) -# define PT_GR26 (26*4) -# define PT_GR28 (28*4) -# define PT_IAOQ0 (106*4) -# define PT_IAOQ1 (107*4) -#endif /* HPPA */ -#ifdef SH64 - /* SH64 Linux - this code assumes the following kernel API for system calls: - PC Offset 0 - System Call Offset 16 (actually, (syscall no.) | (0x1n << 16), - where n = no. of parameters. - Other regs Offset 24+ - - On entry: R2-7 = parameters 1-6 (as many as necessary) - On return: R9 = result. */ - - /* Offset for peeks of registers */ -# define REG_OFFSET (24) -# define REG_GENERAL(x) (8*(x)+REG_OFFSET) -# define REG_PC (0*8) -# define REG_SYSCALL (2*8) -#endif /* SH64 */ -#ifdef AARCH64 -struct arm_pt_regs { - int uregs[18]; -}; -# define ARM_cpsr uregs[16] -# define ARM_pc uregs[15] -# define ARM_lr uregs[14] -# define ARM_sp uregs[13] -# define ARM_ip uregs[12] -# define ARM_fp uregs[11] -# define ARM_r10 uregs[10] -# define ARM_r9 uregs[9] -# define ARM_r8 uregs[8] -# define ARM_r7 uregs[7] -# define ARM_r6 uregs[6] -# define ARM_r5 uregs[5] -# define ARM_r4 uregs[4] -# define ARM_r3 uregs[3] -# define ARM_r2 uregs[2] -# define ARM_r1 uregs[1] -# define ARM_r0 uregs[0] -# define ARM_ORIG_r0 uregs[17] -#endif /* AARCH64 */ - #if defined(SPARC) || defined(SPARC64) -/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off - * by 1 and use Ix instead of Ox. These work for both 32 and 64 bit Linux. */ -# define U_REG_G1 0 -# define U_REG_O0 7 -# define U_REG_O1 8 # define PERSONALITY0_WORDSIZE 4 -# define PERSONALITY1_WORDSIZE 4 # if defined(SPARC64) -# include -# define SUPPORTED_PERSONALITIES 3 -# define PERSONALITY2_WORDSIZE 8 -# else -# include # define SUPPORTED_PERSONALITIES 2 -# endif /* SPARC64 */ -#endif /* SPARC[64] */ +# define PERSONALITY1_WORDSIZE 8 +# endif +#endif #ifdef X86_64 # define SUPPORTED_PERSONALITIES 3 @@ -375,21 +243,7 @@ struct arm_pt_regs { # define DEFAULT_PERSONALITY 0 #endif #ifndef PERSONALITY0_WORDSIZE -# define PERSONALITY0_WORDSIZE (int)(sizeof(long)) -#endif - -#if defined(I386) -extern struct user_regs_struct i386_regs; -#elif defined(IA64) -extern long ia32; -#elif defined(SPARC) || defined(SPARC64) -extern struct pt_regs sparc_regs; -#elif defined(ARM) -extern struct pt_regs arm_regs; -#elif defined(TILE) -extern struct pt_regs tile_regs; -#elif defined(POWERPC) -extern struct pt_regs ppc_regs; +# define PERSONALITY0_WORDSIZE SIZEOF_LONG #endif typedef struct sysent { @@ -400,9 +254,8 @@ typedef struct sysent { } struct_sysent; typedef struct ioctlent { - const char *doth; const char *symbol; - unsigned long code; + unsigned int code; } struct_ioctlent; /* Trace Control Block */ @@ -419,17 +272,24 @@ struct tcb { #endif long u_rval; /* Return value */ #if SUPPORTED_PERSONALITIES > 1 - int currpers; /* Personality at the time of scno update */ + unsigned int currpers; /* Personality at the time of scno update */ #endif int curcol; /* Output column for this process */ FILE *outf; /* Output file for this process */ const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */ const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */ + const struct_sysent *s_prev_ent; /* for "resuming interrupted SYSCALL" msg */ struct timeval stime; /* System time usage as of last process wait */ struct timeval dtime; /* Delta for system time usage */ struct timeval etime; /* Syscall entry time */ - /* Support for tracing forked processes: */ - long inst[2]; /* Saved clone args (badly named) */ + +#ifdef USE_LIBUNWIND + struct UPT_info* libunwind_ui; + struct mmap_cache_t* mmap_cache; + unsigned int mmap_cache_size; + unsigned int mmap_cache_generation; + struct queue_t* queue; +#endif }; /* TCB flags */ @@ -448,41 +308,13 @@ struct tcb { * are limited to trace(), this condition is never observed in trace_syscall() * and below. * The bit is cleared after all syscall exit processing is done. - * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary - * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered. - * TCB_WAITEXECVE bit is used for this purpose (see below). * * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable. */ #define TCB_INSYSCALL 0x04 #define TCB_ATTACHED 0x08 /* We attached to it already */ -#define TCB_BPTSET 0x10 /* "Breakpoint" set after fork(2) */ -#define TCB_REPRINT 0x20 /* We should reprint this syscall on exit */ -#define TCB_FILTERED 0x40 /* This system call has been filtered out */ -/* - * x86 does not need TCB_WAITEXECVE. - * It can detect post-execve SIGTRAP by looking at eax/rax. - * See "not a syscall entry (eax = %ld)\n" message. - * - * Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACEEXEC, which - * suppresses post-execve SIGTRAP. If you are adding a new arch which is - * only supported by newer kernels, you most likely don't need to define - * TCB_WAITEXECVE! - */ -#if defined(ALPHA) \ - || defined(SPARC) || defined(SPARC64) \ - || defined(POWERPC) \ - || defined(IA64) \ - || defined(HPPA) \ - || defined(SH) || defined(SH64) \ - || defined(S390) || defined(S390X) \ - || defined(ARM) \ - || defined(MIPS) -/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP - * to happen. (When it is detected, tracee is continued and this bit is cleared.) - */ -# define TCB_WAITEXECVE 0x80 -#endif +#define TCB_REPRINT 0x10 /* We should reprint this syscall on exit */ +#define TCB_FILTERED 0x20 /* This system call has been filtered out */ /* qualifier flags */ #define QUAL_TRACE 0x001 /* this system call should be traced */ @@ -505,14 +337,16 @@ typedef uint8_t qualbits_t; #define filtered(tcp) ((tcp)->flags & TCB_FILTERED) struct xlat { - int val; + unsigned int val; const char *str; }; +#define XLAT(x) { x, #x } +#define XLAT_END { 0, NULL } -extern const struct xlat open_mode_flags[]; extern const struct xlat addrfams[]; -extern const struct xlat struct_user_offsets[]; +extern const struct xlat at_flags[]; extern const struct xlat open_access_modes[]; +extern const struct xlat open_mode_flags[]; extern const struct xlat whence_codes[]; /* Format of syscall return values */ @@ -528,10 +362,11 @@ extern const struct xlat whence_codes[]; # endif # define RVAL_LUDECIMAL 007 /* long unsigned decimal format */ #endif -#define RVAL_MASK 007 /* mask for these values */ +#define RVAL_FD 010 /* file descriptor */ +#define RVAL_MASK 017 /* mask for these values */ -#define RVAL_STR 010 /* Print `auxstr' field after return val */ -#define RVAL_NONE 020 /* Print nothing */ +#define RVAL_STR 020 /* Print `auxstr' field after return val */ +#define RVAL_NONE 040 /* Print nothing */ #define TRACE_FILE 001 /* Trace file-related syscalls. */ #define TRACE_IPC 002 /* Trace IPC-related syscalls. */ @@ -541,6 +376,24 @@ extern const struct xlat whence_codes[]; #define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */ #define TRACE_MEMORY 0100 /* Trace memory mapping-related syscalls. */ #define SYSCALL_NEVER_FAILS 0200 /* Syscall is always successful. */ +#define STACKTRACE_INVALIDATE_CACHE 0400 /* Trigger proc/maps cache updating */ +#define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */ +#define TRACE_INDIRECT_SUBCALL 02000 /* Syscall is an indirect socket/ipc subcall. */ + +#if defined(ARM) || defined(AARCH64) \ + || defined(I386) || defined(X32) || defined(X86_64) \ + || defined(IA64) \ + || defined(BFIN) \ + || defined(M68K) \ + || defined(MICROBLAZE) \ + || defined(S390) \ + || defined(SH) || defined(SH64) \ + || defined(SPARC) || defined(SPARC64) \ + /**/ +# define NEED_UID16_PARSERS 1 +#else +# define NEED_UID16_PARSERS 0 +#endif typedef enum { CFLAG_NONE = 0, @@ -550,16 +403,21 @@ typedef enum { extern cflag_t cflag; extern bool debug_flag; extern bool Tflag; +extern bool iflag; +extern bool count_wallclock; extern unsigned int qflag; extern bool not_failing_only; -extern bool show_fd_path; +extern unsigned int show_fd_path; extern bool hide_log_until_execve; /* are we filtering traces based on paths? */ extern const char **paths_selected; #define tracing_paths (paths_selected != NULL) -extern bool need_fork_exec_workarounds; extern unsigned xflag; extern unsigned followfork; +#ifdef USE_LIBUNWIND +/* if this is true do the stack trace for every system call */ +extern bool stack_trace_enabled; +#endif extern unsigned ptrace_setoptions; extern unsigned max_strlen; extern unsigned os_release; @@ -568,23 +426,25 @@ extern unsigned os_release; enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 }; -void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); -void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); -void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); -void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); -void die_out_of_memory(void) __attribute__ ((noreturn)); - -#ifdef USE_CUSTOM_PRINTF +void error_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); +void perror_msg(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); +void error_msg_and_die(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; +void perror_msg_and_die(const char *fmt, ...) + ATTRIBUTE_FORMAT((printf, 1, 2)) ATTRIBUTE_NORETURN; +void die_out_of_memory(void) ATTRIBUTE_NORETURN; + +void *xmalloc(size_t size) ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1)); +void *xcalloc(size_t nmemb, size_t size) + ATTRIBUTE_MALLOC ATTRIBUTE_ALLOC_SIZE((1, 2)); +void *xreallocarray(void *ptr, size_t nmemb, size_t size) + ATTRIBUTE_ALLOC_SIZE((2, 3)); +char *xstrdup(const char *str) ATTRIBUTE_MALLOC; + +#if USE_CUSTOM_PRINTF /* - * Speed-optimized vfprintf implementation. * See comment in vsprintf.c for allowed formats. * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u. - * - * It results in strace using about 5% less CPU in user space - * (compared to glibc version). - * But strace spends a lot of time in kernel space, - * so overall it does not appear to be a significant win. - * Thus disabled by default. */ int strace_vfprintf(FILE *fp, const char *fmt, va_list args); #else @@ -594,81 +454,80 @@ int strace_vfprintf(FILE *fp, const char *fmt, va_list args); extern void set_sortby(const char *); extern void set_overhead(int); extern void qualify(const char *); +extern void print_pc(struct tcb *); extern int trace_syscall(struct tcb *); -extern void count_syscall(struct tcb *, struct timeval *); +extern void count_syscall(struct tcb *, const struct timeval *); extern void call_summary(FILE *); -#if defined(AVR32) \ - || defined(I386) \ - || defined(X86_64) || defined(X32) \ - || defined(AARCH64) \ - || defined(ARM) \ - || defined(SPARC) || defined(SPARC64) \ - || defined(TILE) \ - || defined(OR1K) \ - || defined(METAG) \ - || defined(POWERPC) -extern long get_regs_error; -# define clear_regs() (get_regs_error = -1) +extern void clear_regs(void); extern void get_regs(pid_t pid); -#else -# define get_regs_error 0 -# define clear_regs() ((void)0) -# define get_regs(pid) ((void)0) -#endif -extern int umoven(struct tcb *, long, int, char *); +extern int get_scno(struct tcb *tcp); + +extern int umoven(struct tcb *, long, unsigned int, void *); #define umove(pid, addr, objp) \ - umoven((pid), (addr), sizeof(*(objp)), (char *) (objp)) -extern int umovestr(struct tcb *, long, int, char *); + umoven((pid), (addr), sizeof(*(objp)), (void *) (objp)) +extern int umovestr(struct tcb *, long, unsigned int, char *); extern int upeek(int pid, long, long *); -#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH) + +#if defined ALPHA || defined IA64 || defined MIPS \ + || defined SH || defined SPARC || defined SPARC64 +# define HAVE_GETRVAL2 extern long getrval2(struct tcb *); +#else +# undef HAVE_GETRVAL2 #endif -/* - * On Linux, "setbpt" is a misnomer: we don't set a breakpoint - * (IOW: no poking in user's text segment), - * instead we change fork/vfork/clone into clone(CLONE_PTRACE). - * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead. - */ -extern int setbpt(struct tcb *); -extern int clearbpt(struct tcb *); -extern const char *signame(int); +extern const char *signame(const int); extern void pathtrace_select(const char *); extern int pathtrace_match(struct tcb *); extern int getfdpath(struct tcb *, int, char *, unsigned); -extern const char *xlookup(const struct xlat *, int); +extern const char *xlookup(const struct xlat *, const unsigned int); +extern const char *xlat_search(const struct xlat *, const size_t, const unsigned int); +extern unsigned long get_pagesize(void); extern int string_to_uint(const char *str); -extern int string_quote(const char *, char *, long, int); +extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits); + +#define QUOTE_0_TERMINATED 0x01 +#define QUOTE_OMIT_LEADING_TRAILING_QUOTES 0x02 + +extern int print_quoted_string(const char *, unsigned int, unsigned int); /* a refers to the lower numbered u_arg, * b refers to the higher numbered u_arg */ -#if HAVE_LITTLE_ENDIAN_LONG_LONG +#ifdef HAVE_LITTLE_ENDIAN_LONG_LONG # define LONG_LONG(a,b) \ ((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32))) #else # define LONG_LONG(a,b) \ ((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32))) #endif -extern int printllval(struct tcb *, const char *, int); +extern int getllval(struct tcb *, unsigned long long *, int); +extern int printllval(struct tcb *, const char *, int) + ATTRIBUTE_FORMAT((printf, 2, 0)); -extern void printxval(const struct xlat *, int, const char *); +extern void printxval(const struct xlat *, const unsigned int, const char *); extern int printargs(struct tcb *); extern int printargs_lu(struct tcb *); extern int printargs_ld(struct tcb *); extern void addflags(const struct xlat *, int); extern int printflags(const struct xlat *, int, const char *); extern const char *sprintflags(const char *, const struct xlat *, int); +extern const char *sprintmode(int); +extern const char *sprinttime(time_t); +extern void dumpiov_in_msghdr(struct tcb *, long); +extern void dumpiov_in_mmsghdr(struct tcb *, long); extern void dumpiov(struct tcb *, int, long); extern void dumpstr(struct tcb *, long, int); extern void printstr(struct tcb *, long, long); -extern void printnum(struct tcb *, long, const char *); -extern void printnum_int(struct tcb *, long, const char *); +extern void printnum_int(struct tcb *, long, const char *) + ATTRIBUTE_FORMAT((printf, 3, 0)); +extern void printnum_long(struct tcb *, long, const char *) + ATTRIBUTE_FORMAT((printf, 3, 0)); extern void printpath(struct tcb *, long); -extern void printpathn(struct tcb *, long, int); +extern void printpathn(struct tcb *, long, unsigned int); #define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}")) #define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE extern void printtv_bitness(struct tcb *, long, enum bitness_t, int); @@ -679,47 +538,58 @@ extern void printtv_bitness(struct tcb *, long, enum bitness_t, int); extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special); extern void print_timespec(struct tcb *, long); extern void sprint_timespec(char *, struct tcb *, long); -#ifdef HAVE_SIGINFO_T -extern void printsiginfo(siginfo_t *, int); +extern void printsiginfo(const siginfo_t *, bool); extern void printsiginfo_at(struct tcb *tcp, long addr); -#endif extern void printfd(struct tcb *, int); +extern bool print_sockaddr_by_inode(const unsigned long, const char *); +extern void print_dirfd(struct tcb *, int); extern void printsock(struct tcb *, long, int); extern void print_sock_optmgmt(struct tcb *, long, int); extern void printrusage(struct tcb *, long); #ifdef ALPHA extern void printrusage32(struct tcb *, long); #endif -extern void printuid(const char *, unsigned long); -extern void printcall(struct tcb *); -extern void print_sigset(struct tcb *, long, int); +extern void printuid(const char *, const unsigned int); +extern void print_sigset_addr_len(struct tcb *, long, long); +extern const char *sprintsigmask_n(const char *, const void *, unsigned int); +#define tprintsigmask_addr(prefix, mask) \ + tprints(sprintsigmask_n((prefix), (mask), sizeof(mask))) extern void printsignal(int); extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov); extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long); -extern void tprint_open_modes(mode_t); -extern const char *sprint_open_modes(mode_t); +extern void tprint_open_modes(int); +extern const char *sprint_open_modes(int); extern void print_loff_t(struct tcb *, long); - -extern const struct_ioctlent *ioctl_lookup(long); -extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *); -extern int ioctl_decode(struct tcb *, long, long); -extern int term_ioctl(struct tcb *, long, long); -extern int sock_ioctl(struct tcb *, long, long); -extern int proc_ioctl(struct tcb *, int, int); -extern int rtc_ioctl(struct tcb *, long, long); -extern int scsi_ioctl(struct tcb *, long, long); -extern int block_ioctl(struct tcb *, long, long); -extern int mtd_ioctl(struct tcb *, long, long); -extern int ubi_ioctl(struct tcb *, long, long); -extern int loop_ioctl(struct tcb *, long, long); - -extern int tv_nz(struct timeval *); -extern int tv_cmp(struct timeval *, struct timeval *); -extern double tv_float(struct timeval *); -extern void tv_add(struct timeval *, struct timeval *, struct timeval *); -extern void tv_sub(struct timeval *, struct timeval *, struct timeval *); -extern void tv_mul(struct timeval *, struct timeval *, int); -extern void tv_div(struct timeval *, struct timeval *, int); +extern void print_seccomp_filter(struct tcb *tcp, unsigned long); + +extern int block_ioctl(struct tcb *, const unsigned int, long); +extern int evdev_ioctl(struct tcb *, const unsigned int, long); +extern int loop_ioctl(struct tcb *, const unsigned int, long); +extern int mtd_ioctl(struct tcb *, const unsigned int, long); +extern int ptp_ioctl(struct tcb *, const unsigned int, long); +extern int rtc_ioctl(struct tcb *, const unsigned int, long); +extern int scsi_ioctl(struct tcb *, const unsigned int, long); +extern int sock_ioctl(struct tcb *, const unsigned int, long); +extern int term_ioctl(struct tcb *, const unsigned int, long); +extern int ubi_ioctl(struct tcb *, const unsigned int, long); +extern int v4l2_ioctl(struct tcb *, const unsigned int, long); + +extern int tv_nz(const struct timeval *); +extern int tv_cmp(const struct timeval *, const struct timeval *); +extern double tv_float(const struct timeval *); +extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *); +extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *); +extern void tv_mul(struct timeval *, const struct timeval *, int); +extern void tv_div(struct timeval *, const struct timeval *, int); + +#ifdef USE_LIBUNWIND +extern void unwind_init(void); +extern void unwind_tcb_init(struct tcb *tcp); +extern void unwind_tcb_fin(struct tcb *tcp); +extern void unwind_cache_invalidate(struct tcb* tcp); +extern void unwind_print_stacktrace(struct tcb* tcp); +extern void unwind_capture_stacktrace(struct tcb* tcp); +#endif /* Strace log generation machinery. * @@ -742,7 +612,7 @@ extern struct tcb *printing_tcp; extern void printleader(struct tcb *); extern void line_ended(void); extern void tabto(void); -extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); +extern void tprintf(const char *fmt, ...) ATTRIBUTE_FORMAT((printf, 1, 2)); extern void tprints(const char *str); #if SUPPORTED_PERSONALITIES > 1 @@ -805,3 +675,9 @@ extern unsigned num_quals; /* Only ensures that sysent[scno] isn't out of range */ #define SCNO_IN_RANGE(scno) \ ((unsigned long)(scno) < nsyscalls) + +#ifndef SYS_FUNC_NAME +# define SYS_FUNC_NAME(syscall_name) sys_ ## syscall_name +#endif + +#define SYS_FUNC(syscall_name) int SYS_FUNC_NAME(syscall_name)(struct tcb *tcp)