1/*
2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 *    derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#ifdef HAVE_CONFIG_H
31# include "config.h"
32#endif
33
34#ifdef MIPS
35# include <sgidefs.h>
36# if _MIPS_SIM == _MIPS_SIM_ABI64
37#  define LINUX_MIPSN64
38# elif _MIPS_SIM == _MIPS_SIM_NABI32
39#  define LINUX_MIPSN32
40# elif _MIPS_SIM == _MIPS_SIM_ABI32
41#  define LINUX_MIPSO32
42# else
43#  error Unsupported _MIPS_SIM
44# endif
45#endif
46
47#include <features.h>
48#ifdef HAVE_STDBOOL_H
49# include <stdbool.h>
50#endif
51#include <stdint.h>
52#include <inttypes.h>
53#include <sys/types.h>
54#ifdef STDC_HEADERS
55# include <stddef.h>
56#endif
57#include <unistd.h>
58#include <stdlib.h>
59#include <stdio.h>
60/* Open-coding isprint(ch) et al proved more efficient than calling
61 * generalized libc interface. We don't *want* to do non-ASCII anyway.
62 */
63/* #include <ctype.h> */
64#include <string.h>
65#include <errno.h>
66#include <signal.h>
67#include <time.h>
68#include <sys/time.h>
69#include <sys/syscall.h>
70
71#ifndef HAVE_STRERROR
72const char *strerror(int);
73#endif
74#ifndef HAVE_STPCPY
75/* Some libc have stpcpy, some don't. Sigh...
76 * Roll our private implementation...
77 */
78#undef stpcpy
79#define stpcpy strace_stpcpy
80extern char *stpcpy(char *dst, const char *src);
81#endif
82
83#if !defined __GNUC__
84# define __attribute__(x) /*nothing*/
85#endif
86
87#ifndef offsetof
88# define offsetof(type, member)	\
89	(((char *) &(((type *) NULL)->member)) - ((char *) (type *) NULL))
90#endif
91
92#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
93
94/* macros */
95#ifndef MAX
96# define MAX(a, b)		(((a) > (b)) ? (a) : (b))
97#endif
98#ifndef MIN
99# define MIN(a, b)		(((a) < (b)) ? (a) : (b))
100#endif
101#define CLAMP(val, min, max) MIN(MAX(min, val), max)
102
103/* Glibc has an efficient macro for sigemptyset
104 * (it just does one or two assignments of 0 to internal vector of longs).
105 */
106#if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset)
107# define sigemptyset __sigemptyset
108#endif
109
110/* Configuration section */
111#ifndef DEFAULT_STRLEN
112/* default maximum # of bytes printed in `printstr', change with -s switch */
113# define DEFAULT_STRLEN	32
114#endif
115#ifndef DEFAULT_ACOLUMN
116# define DEFAULT_ACOLUMN	40	/* default alignment column for results */
117#endif
118/*
119 * Maximum number of args to a syscall.
120 *
121 * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS!
122 * linux/<ARCH>/syscallent*.h:
123 * 	all have nargs <= 6 except mips o32 which has nargs <= 7.
124 */
125#ifndef MAX_ARGS
126# ifdef LINUX_MIPSO32
127#  define MAX_ARGS	7
128# else
129#  define MAX_ARGS	6
130# endif
131#endif
132/* default sorting method for call profiling */
133#ifndef DEFAULT_SORTBY
134# define DEFAULT_SORTBY "time"
135#endif
136/*
137 * Experimental code using PTRACE_SEIZE can be enabled here.
138 * This needs Linux kernel 3.4.x or later to work.
139 */
140#define USE_SEIZE 1
141/* To force NOMMU build, set to 1 */
142#define NOMMU_SYSTEM 0
143/*
144 * Set to 1 to use speed-optimized vfprintf implementation.
145 * It results in strace using about 5% less CPU in user space
146 * (compared to glibc version).
147 * But strace spends a lot of time in kernel space,
148 * so overall it does not appear to be a significant win.
149 * Thus disabled by default.
150 */
151#define USE_CUSTOM_PRINTF 0
152
153#ifdef NEED_PTRACE_PROTOTYPE_WORKAROUND
154# define ptrace xptrace
155# include <sys/ptrace.h>
156# undef ptrace
157extern long ptrace(int, int, char *, long);
158#else
159# include <sys/ptrace.h>
160#endif
161
162#if defined(POWERPC)
163# include <asm/ptrace.h>
164#endif
165
166#if defined(TILE)
167# include <asm/ptrace.h>  /* struct pt_regs */
168#endif
169
170#ifndef ERESTARTSYS
171# define ERESTARTSYS    512
172#endif
173#ifndef ERESTARTNOINTR
174# define ERESTARTNOINTR 513
175#endif
176#ifndef ERESTARTNOHAND
177# define ERESTARTNOHAND 514
178#endif
179#ifndef ERESTART_RESTARTBLOCK
180# define ERESTART_RESTARTBLOCK 516
181#endif
182
183#if !HAVE_DECL_PTRACE_SETOPTIONS
184# define PTRACE_SETOPTIONS	0x4200
185#endif
186#if !HAVE_DECL_PTRACE_GETEVENTMSG
187# define PTRACE_GETEVENTMSG	0x4201
188#endif
189#if !HAVE_DECL_PTRACE_GETSIGINFO
190# define PTRACE_GETSIGINFO	0x4202
191#endif
192
193#if !HAVE_DECL_PTRACE_O_TRACESYSGOOD
194# define PTRACE_O_TRACESYSGOOD	0x00000001
195#endif
196#if !HAVE_DECL_PTRACE_O_TRACEFORK
197# define PTRACE_O_TRACEFORK	0x00000002
198#endif
199#if !HAVE_DECL_PTRACE_O_TRACEVFORK
200# define PTRACE_O_TRACEVFORK	0x00000004
201#endif
202#if !HAVE_DECL_PTRACE_O_TRACECLONE
203# define PTRACE_O_TRACECLONE	0x00000008
204#endif
205#if !HAVE_DECL_PTRACE_O_TRACEEXEC
206# define PTRACE_O_TRACEEXEC	0x00000010
207#endif
208#if !HAVE_DECL_PTRACE_O_TRACEEXIT
209# define PTRACE_O_TRACEEXIT	0x00000040
210#endif
211
212#if !HAVE_DECL_PTRACE_EVENT_FORK
213# define PTRACE_EVENT_FORK	1
214#endif
215#if !HAVE_DECL_PTRACE_EVENT_VFORK
216# define PTRACE_EVENT_VFORK	2
217#endif
218#if !HAVE_DECL_PTRACE_EVENT_CLONE
219# define PTRACE_EVENT_CLONE	3
220#endif
221#if !HAVE_DECL_PTRACE_EVENT_EXEC
222# define PTRACE_EVENT_EXEC	4
223#endif
224#if !HAVE_DECL_PTRACE_EVENT_VFORK_DONE
225# define PTRACE_EVENT_VFORK_DONE	5
226#endif
227#if !HAVE_DECL_PTRACE_EVENT_EXIT
228# define PTRACE_EVENT_EXIT	6
229#endif
230
231#if !HAVE_DECL_PTRACE_PEEKUSER
232# define PTRACE_PEEKUSER PTRACE_PEEKUSR
233#endif
234#if !HAVE_DECL_PTRACE_POKEUSER
235# define PTRACE_POKEUSER PTRACE_POKEUSR
236#endif
237
238#undef PTRACE_SEIZE
239#define PTRACE_SEIZE		0x4206
240#undef PTRACE_INTERRUPT
241#define PTRACE_INTERRUPT	0x4207
242#undef PTRACE_LISTEN
243#define PTRACE_LISTEN		0x4208
244#undef PTRACE_EVENT_STOP
245#define PTRACE_EVENT_STOP	128
246
247#ifdef ALPHA
248# define REG_R0 0
249# define REG_A0 16
250# define REG_A3 19
251# define REG_FP 30
252# define REG_PC 64
253#endif /* ALPHA */
254#ifdef MIPS
255# define REG_V0 2
256# define REG_A0 4
257# define REG_A3 7
258# define REG_SP 29
259# define REG_EPC 64
260#endif /* MIPS */
261#ifdef HPPA
262# define PT_GR20 (20*4)
263# define PT_GR26 (26*4)
264# define PT_GR28 (28*4)
265# define PT_IAOQ0 (106*4)
266# define PT_IAOQ1 (107*4)
267#endif /* HPPA */
268#ifdef SH64
269   /* SH64 Linux - this code assumes the following kernel API for system calls:
270          PC           Offset 0
271          System Call  Offset 16 (actually, (syscall no.) | (0x1n << 16),
272                       where n = no. of parameters.
273          Other regs   Offset 24+
274
275          On entry:    R2-7 = parameters 1-6 (as many as necessary)
276          On return:   R9   = result. */
277
278   /* Offset for peeks of registers */
279# define REG_OFFSET         (24)
280# define REG_GENERAL(x)     (8*(x)+REG_OFFSET)
281# define REG_PC             (0*8)
282# define REG_SYSCALL        (2*8)
283#endif /* SH64 */
284#ifdef AARCH64
285struct arm_pt_regs {
286        int uregs[18];
287};
288# define ARM_cpsr       uregs[16]
289# define ARM_pc         uregs[15]
290# define ARM_lr         uregs[14]
291# define ARM_sp         uregs[13]
292# define ARM_ip         uregs[12]
293# define ARM_fp         uregs[11]
294# define ARM_r10        uregs[10]
295# define ARM_r9         uregs[9]
296# define ARM_r8         uregs[8]
297# define ARM_r7         uregs[7]
298# define ARM_r6         uregs[6]
299# define ARM_r5         uregs[5]
300# define ARM_r4         uregs[4]
301# define ARM_r3         uregs[3]
302# define ARM_r2         uregs[2]
303# define ARM_r1         uregs[1]
304# define ARM_r0         uregs[0]
305# define ARM_ORIG_r0    uregs[17]
306#endif /* AARCH64 */
307
308#if defined(SPARC) || defined(SPARC64)
309/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off
310 * by 1 and use Ix instead of Ox.  These work for both 32 and 64 bit Linux. */
311# define U_REG_G1 0
312# define U_REG_O0 7
313# define U_REG_O1 8
314# define PERSONALITY0_WORDSIZE 4
315# define PERSONALITY1_WORDSIZE 4
316# if defined(SPARC64)
317#  include <asm/psrcompat.h>
318#  define SUPPORTED_PERSONALITIES 3
319#  define PERSONALITY2_WORDSIZE 8
320# else
321#  include <asm/psr.h>
322#  define SUPPORTED_PERSONALITIES 2
323# endif /* SPARC64 */
324#endif /* SPARC[64] */
325
326#ifdef X86_64
327# define SUPPORTED_PERSONALITIES 3
328# define PERSONALITY0_WORDSIZE 8
329# define PERSONALITY1_WORDSIZE 4
330# define PERSONALITY2_WORDSIZE 4
331#endif
332
333#ifdef X32
334# define SUPPORTED_PERSONALITIES 2
335# define PERSONALITY0_WORDSIZE 4
336# define PERSONALITY1_WORDSIZE 4
337#endif
338
339#ifdef ARM
340/* one personality */
341#endif
342
343#ifdef AARCH64
344/* The existing ARM personality, then AArch64 */
345# define SUPPORTED_PERSONALITIES 2
346# define PERSONALITY0_WORDSIZE 4
347# define PERSONALITY1_WORDSIZE 8
348# define DEFAULT_PERSONALITY 1
349#endif
350
351#ifdef POWERPC64
352# define SUPPORTED_PERSONALITIES 2
353# define PERSONALITY0_WORDSIZE 8
354# define PERSONALITY1_WORDSIZE 4
355#endif
356
357#ifdef TILE
358# define SUPPORTED_PERSONALITIES 2
359# define PERSONALITY0_WORDSIZE 8
360# define PERSONALITY1_WORDSIZE 4
361# ifdef __tilepro__
362#  define DEFAULT_PERSONALITY 1
363# endif
364#endif
365
366#ifndef SUPPORTED_PERSONALITIES
367# define SUPPORTED_PERSONALITIES 1
368#endif
369#ifndef DEFAULT_PERSONALITY
370# define DEFAULT_PERSONALITY 0
371#endif
372#ifndef PERSONALITY0_WORDSIZE
373# define PERSONALITY0_WORDSIZE SIZEOF_LONG
374#endif
375
376#if defined(I386) || defined(X86_64)
377extern uint32_t *const i386_esp_ptr;
378#elif defined(IA64)
379extern bool ia64_ia32mode;
380#elif defined(SPARC) || defined(SPARC64)
381extern struct pt_regs sparc_regs;
382#elif defined(ARM)
383extern struct pt_regs arm_regs;
384#elif defined(TILE)
385extern struct pt_regs tile_regs;
386#elif defined(POWERPC)
387extern struct pt_regs ppc_regs;
388#endif
389
390typedef struct sysent {
391	unsigned nargs;
392	int	sys_flags;
393	int	(*sys_func)();
394	const char *sys_name;
395} struct_sysent;
396
397typedef struct ioctlent {
398	const char *doth;
399	const char *symbol;
400	unsigned long code;
401} struct_ioctlent;
402
403/* Trace Control Block */
404struct tcb {
405	int flags;		/* See below for TCB_ values */
406	int pid;		/* If 0, this tcb is free */
407	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
408	int u_error;		/* Error code */
409	long scno;		/* System call number */
410	long u_arg[MAX_ARGS];	/* System call arguments */
411#if defined(LINUX_MIPSN32) || defined(X32)
412	long long ext_arg[MAX_ARGS];
413	long long u_lrval;	/* long long return value */
414#endif
415	long u_rval;		/* Return value */
416#if SUPPORTED_PERSONALITIES > 1
417	int currpers;		/* Personality at the time of scno update */
418#endif
419	int curcol;		/* Output column for this process */
420	FILE *outf;		/* Output file for this process */
421	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
422	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
423	struct timeval stime;	/* System time usage as of last process wait */
424	struct timeval dtime;	/* Delta for system time usage */
425	struct timeval etime;	/* Syscall entry time */
426				/* Support for tracing forked processes: */
427	long inst[2];		/* Saved clone args (badly named) */
428
429#ifdef USE_LIBUNWIND
430	struct UPT_info* libunwind_ui;
431	struct mmap_cache_t* mmap_cache;
432	unsigned int mmap_cache_size;
433	unsigned int mmap_cache_generation;
434	struct queue_t* queue;
435#endif
436};
437
438/* TCB flags */
439/* We have attached to this process, but did not see it stopping yet */
440#define TCB_STARTUP		0x01
441#define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
442/*
443 * Are we in system call entry or in syscall exit?
444 *
445 * This bit is set after all syscall entry processing is done.
446 * Therefore, this bit will be set when next ptrace stop occurs,
447 * which should be syscall exit stop. Other stops which are possible
448 * directly after syscall entry (death, ptrace event stop)
449 * are simpler and handled without calling trace_syscall(), therefore
450 * the places where TCB_INSYSCALL can be set but we aren't in syscall stop
451 * are limited to trace(), this condition is never observed in trace_syscall()
452 * and below.
453 * The bit is cleared after all syscall exit processing is done.
454 * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary
455 * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered.
456 * TCB_WAITEXECVE bit is used for this purpose (see below).
457 *
458 * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable.
459 */
460#define TCB_INSYSCALL	0x04
461#define TCB_ATTACHED	0x08	/* We attached to it already */
462#define TCB_BPTSET	0x10	/* "Breakpoint" set after fork(2) */
463#define TCB_REPRINT	0x20	/* We should reprint this syscall on exit */
464#define TCB_FILTERED	0x40	/* This system call has been filtered out */
465/*
466 * x86 does not need TCB_WAITEXECVE.
467 * It can detect post-execve SIGTRAP by looking at eax/rax.
468 * See "not a syscall entry (eax = %ld)\n" message.
469 *
470 * Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACEEXEC, which
471 * suppresses post-execve SIGTRAP. If you are adding a new arch which is
472 * only supported by newer kernels, you most likely don't need to define
473 * TCB_WAITEXECVE!
474 */
475#if defined(ALPHA) \
476 || defined(SPARC) || defined(SPARC64) \
477 || defined(POWERPC) \
478 || defined(IA64) \
479 || defined(HPPA) \
480 || defined(SH) || defined(SH64) \
481 || defined(S390) || defined(S390X) \
482 || defined(ARM) \
483 || defined(MIPS)
484/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP
485 * to happen. (When it is detected, tracee is continued and this bit is cleared.)
486 */
487# define TCB_WAITEXECVE	0x80
488#endif
489
490/* qualifier flags */
491#define QUAL_TRACE	0x001	/* this system call should be traced */
492#define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
493#define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
494#define QUAL_RAW	0x008	/* print all args in hex for this syscall */
495#define QUAL_SIGNAL	0x010	/* report events with this signal */
496#define QUAL_READ	0x020	/* dump data read on this file descriptor */
497#define QUAL_WRITE	0x040	/* dump data written to this file descriptor */
498typedef uint8_t qualbits_t;
499#define UNDEFINED_SCNO	0x100	/* Used only in tcp->qual_flg */
500
501#define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
502
503#define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
504#define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
505#define syserror(tcp)	((tcp)->u_error != 0)
506#define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
507#define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
508#define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
509
510struct xlat {
511	int val;
512	const char *str;
513};
514#define XLAT(x) { x, #x }
515#define XLAT_END { 0, NULL }
516
517extern const struct xlat open_mode_flags[];
518extern const struct xlat addrfams[];
519extern const struct xlat struct_user_offsets[];
520extern const struct xlat open_access_modes[];
521extern const struct xlat whence_codes[];
522
523/* Format of syscall return values */
524#define RVAL_DECIMAL	000	/* decimal format */
525#define RVAL_HEX	001	/* hex format */
526#define RVAL_OCTAL	002	/* octal format */
527#define RVAL_UDECIMAL	003	/* unsigned decimal format */
528#if defined(LINUX_MIPSN32) || defined(X32)
529# if 0 /* unused so far */
530#  define RVAL_LDECIMAL	004	/* long decimal format */
531#  define RVAL_LHEX	005	/* long hex format */
532#  define RVAL_LOCTAL	006	/* long octal format */
533# endif
534# define RVAL_LUDECIMAL	007	/* long unsigned decimal format */
535#endif
536#define RVAL_FD		010	/* file descriptor */
537#define RVAL_MASK	017	/* mask for these values */
538
539#define RVAL_STR	020	/* Print `auxstr' field after return val */
540#define RVAL_NONE	040	/* Print nothing */
541
542#define TRACE_FILE	001	/* Trace file-related syscalls. */
543#define TRACE_IPC	002	/* Trace IPC-related syscalls. */
544#define TRACE_NETWORK	004	/* Trace network-related syscalls. */
545#define TRACE_PROCESS	010	/* Trace process-related syscalls. */
546#define TRACE_SIGNAL	020	/* Trace signal-related syscalls. */
547#define TRACE_DESC	040	/* Trace file descriptor-related syscalls. */
548#define TRACE_MEMORY	0100	/* Trace memory mapping-related syscalls. */
549#define SYSCALL_NEVER_FAILS	0200	/* Syscall is always successful. */
550#define STACKTRACE_INVALIDATE_CACHE 0400  /* Trigger proc/maps cache updating */
551#define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
552
553typedef enum {
554	CFLAG_NONE = 0,
555	CFLAG_ONLY_STATS,
556	CFLAG_BOTH
557} cflag_t;
558extern cflag_t cflag;
559extern bool debug_flag;
560extern bool Tflag;
561extern bool iflag;
562extern bool count_wallclock;
563extern unsigned int qflag;
564extern bool not_failing_only;
565extern bool show_fd_path;
566extern bool hide_log_until_execve;
567/* are we filtering traces based on paths? */
568extern const char **paths_selected;
569#define tracing_paths (paths_selected != NULL)
570extern bool need_fork_exec_workarounds;
571extern unsigned xflag;
572extern unsigned followfork;
573#ifdef USE_LIBUNWIND
574/* if this is true do the stack trace for every system call */
575extern bool stack_trace_enabled;
576#endif
577extern unsigned ptrace_setoptions;
578extern unsigned max_strlen;
579extern unsigned os_release;
580#undef KERNEL_VERSION
581#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
582
583enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 };
584
585void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
586void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
587void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
588void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
589void die_out_of_memory(void) __attribute__ ((noreturn));
590
591#if USE_CUSTOM_PRINTF
592/*
593 * See comment in vsprintf.c for allowed formats.
594 * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u.
595 */
596int strace_vfprintf(FILE *fp, const char *fmt, va_list args);
597#else
598# define strace_vfprintf vfprintf
599#endif
600
601extern void set_sortby(const char *);
602extern void set_overhead(int);
603extern void qualify(const char *);
604extern void print_pc(struct tcb *);
605extern int trace_syscall(struct tcb *);
606extern void count_syscall(struct tcb *, const struct timeval *);
607extern void call_summary(FILE *);
608
609#if defined(AVR32) \
610 || defined(I386) \
611 || defined(X86_64) || defined(X32) \
612 || defined(AARCH64) \
613 || defined(ARM) \
614 || defined(SPARC) || defined(SPARC64) \
615 || defined(TILE) \
616 || defined(OR1K) \
617 || defined(METAG) \
618 || defined(ARC) \
619 || defined(POWERPC)
620extern long get_regs_error;
621# define clear_regs()  (get_regs_error = -1)
622extern void get_regs(pid_t pid);
623#else
624# define get_regs_error 0
625# define clear_regs()  ((void)0)
626# define get_regs(pid) ((void)0)
627#endif
628extern int umoven(struct tcb *, long, int, char *);
629#define umove(pid, addr, objp)	\
630	umoven((pid), (addr), sizeof(*(objp)), (char *) (objp))
631extern int umovestr(struct tcb *, long, int, char *);
632extern int upeek(int pid, long, long *);
633#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH)
634extern long getrval2(struct tcb *);
635#endif
636/*
637 * On Linux, "setbpt" is a misnomer: we don't set a breakpoint
638 * (IOW: no poking in user's text segment),
639 * instead we change fork/vfork/clone into clone(CLONE_PTRACE).
640 * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead.
641 */
642extern int setbpt(struct tcb *);
643extern int clearbpt(struct tcb *);
644
645extern const char *signame(int);
646extern void pathtrace_select(const char *);
647extern int pathtrace_match(struct tcb *);
648extern int getfdpath(struct tcb *, int, char *, unsigned);
649
650extern const char *xlookup(const struct xlat *, int);
651
652extern int string_to_uint(const char *str);
653extern int string_quote(const char *, char *, long, int);
654extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
655
656/* a refers to the lower numbered u_arg,
657 * b refers to the higher numbered u_arg
658 */
659#if HAVE_LITTLE_ENDIAN_LONG_LONG
660# define LONG_LONG(a,b) \
661	((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
662#else
663# define LONG_LONG(a,b) \
664	((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
665#endif
666extern int printllval(struct tcb *, const char *, int, bool);
667#define printllval_aligned(tcp, fmt, arg)	\
668	printllval((tcp), (fmt), (arg), true)
669#define printllval_unaligned(tcp, fmt, arg)	\
670	printllval((tcp), (fmt), (arg), false)
671
672extern void printxval(const struct xlat *, int, const char *);
673extern int printargs(struct tcb *);
674extern int printargs_lu(struct tcb *);
675extern int printargs_ld(struct tcb *);
676extern void addflags(const struct xlat *, int);
677extern int printflags(const struct xlat *, int, const char *);
678extern const char *sprintflags(const char *, const struct xlat *, int);
679extern void dumpiov(struct tcb *, int, long);
680extern void dumpstr(struct tcb *, long, int);
681extern void printstr(struct tcb *, long, long);
682extern void printnum(struct tcb *, long, const char *);
683extern void printnum_int(struct tcb *, long, const char *);
684extern void printpath(struct tcb *, long);
685extern void printpathn(struct tcb *, long, int);
686#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
687#define TIMEVAL_TEXT_BUFSIZE  TIMESPEC_TEXT_BUFSIZE
688extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
689#define printtv(tcp, addr)	\
690	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0)
691#define printtv_special(tcp, addr)	\
692	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1)
693extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
694extern void print_timespec(struct tcb *, long);
695extern void sprint_timespec(char *, struct tcb *, long);
696#ifdef HAVE_SIGINFO_T
697extern void printsiginfo(siginfo_t *, int);
698extern void printsiginfo_at(struct tcb *tcp, long addr);
699#endif
700extern void printfd(struct tcb *, int);
701extern void print_dirfd(struct tcb *, int);
702extern void printsock(struct tcb *, long, int);
703extern void print_sock_optmgmt(struct tcb *, long, int);
704extern void printrusage(struct tcb *, long);
705#ifdef ALPHA
706extern void printrusage32(struct tcb *, long);
707#endif
708extern void printuid(const char *, unsigned long);
709extern void print_sigset_addr_len(struct tcb *, long, long);
710extern void printsignal(int);
711extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
712extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
713extern void tprint_open_modes(mode_t);
714extern const char *sprint_open_modes(mode_t);
715extern void print_loff_t(struct tcb *, long);
716
717extern const struct_ioctlent *ioctl_lookup(long);
718extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
719extern int ioctl_decode(struct tcb *, long, long);
720extern int term_ioctl(struct tcb *, long, long);
721extern int sock_ioctl(struct tcb *, long, long);
722extern int proc_ioctl(struct tcb *, int, int);
723extern int rtc_ioctl(struct tcb *, long, long);
724extern int scsi_ioctl(struct tcb *, long, long);
725extern int block_ioctl(struct tcb *, long, long);
726extern int mtd_ioctl(struct tcb *, long, long);
727extern int ubi_ioctl(struct tcb *, long, long);
728extern int loop_ioctl(struct tcb *, long, long);
729extern int ptp_ioctl(struct tcb *, long, long);
730
731extern int tv_nz(const struct timeval *);
732extern int tv_cmp(const struct timeval *, const struct timeval *);
733extern double tv_float(const struct timeval *);
734extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *);
735extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *);
736extern void tv_mul(struct timeval *, const struct timeval *, int);
737extern void tv_div(struct timeval *, const struct timeval *, int);
738
739#ifdef USE_LIBUNWIND
740extern void unwind_init(void);
741extern void unwind_tcb_init(struct tcb *tcp);
742extern void unwind_tcb_fin(struct tcb *tcp);
743extern void unwind_cache_invalidate(struct tcb* tcp);
744extern void unwind_print_stacktrace(struct tcb* tcp);
745extern void unwind_capture_stacktrace(struct tcb* tcp);
746#endif
747
748/* Strace log generation machinery.
749 *
750 * printing_tcp: tcb which has incomplete line being printed right now.
751 * NULL if last line has been completed ('\n'-terminated).
752 * printleader(tcp) examines it, finishes incomplete line if needed,
753 * the sets it to tcp.
754 * line_ended() clears printing_tcp and resets ->curcol = 0.
755 * tcp->curcol == 0 check is also used to detect completeness
756 * of last line, since in -ff mode just checking printing_tcp for NULL
757 * is not enough.
758 *
759 * If you change this code, test log generation in both -f and -ff modes
760 * using:
761 * strace -oLOG -f[f] test/threaded_execve
762 * strace -oLOG -f[f] test/sigkill_rain
763 * strace -oLOG -f[f] -p "`pidof web_browser`"
764 */
765extern struct tcb *printing_tcp;
766extern void printleader(struct tcb *);
767extern void line_ended(void);
768extern void tabto(void);
769extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
770extern void tprints(const char *str);
771
772#if SUPPORTED_PERSONALITIES > 1
773extern void set_personality(int personality);
774extern unsigned current_personality;
775#else
776# define set_personality(personality) ((void)0)
777# define current_personality 0
778#endif
779
780#if SUPPORTED_PERSONALITIES == 1
781# define current_wordsize PERSONALITY0_WORDSIZE
782#else
783# if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
784#  define current_wordsize PERSONALITY0_WORDSIZE
785# else
786extern unsigned current_wordsize;
787# endif
788#endif
789
790/* In many, many places we play fast and loose and use
791 * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
792 * We probably need to use widen_to_long() instead:
793 */
794#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
795# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
796#else
797# define widen_to_long(v) ((long)(v))
798#endif
799
800extern const struct_sysent sysent0[];
801extern const char *const errnoent0[];
802extern const char *const signalent0[];
803extern const struct_ioctlent ioctlent0[];
804extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
805#define qual_flags (qual_vec[current_personality])
806#if SUPPORTED_PERSONALITIES > 1
807extern const struct_sysent *sysent;
808extern const char *const *errnoent;
809extern const char *const *signalent;
810extern const struct_ioctlent *ioctlent;
811#else
812# define sysent     sysent0
813# define errnoent   errnoent0
814# define signalent  signalent0
815# define ioctlent   ioctlent0
816#endif
817extern unsigned nsyscalls;
818extern unsigned nerrnos;
819extern unsigned nsignals;
820extern unsigned nioctlents;
821extern unsigned num_quals;
822
823/*
824 * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
825 */
826#define SCNO_IS_VALID(scno) \
827	((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func)
828
829/* Only ensures that sysent[scno] isn't out of range */
830#define SCNO_IN_RANGE(scno) \
831	((unsigned long)(scno) < nsyscalls)
832