defs.h revision 97e5996105e72d021abfb82d2bec4a077646e6ad
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 *symbol;
399	unsigned long code;
400} struct_ioctlent;
401
402/* Trace Control Block */
403struct tcb {
404	int flags;		/* See below for TCB_ values */
405	int pid;		/* If 0, this tcb is free */
406	int qual_flg;		/* qual_flags[scno] or DEFAULT_QUAL_FLAGS + RAW */
407	int u_error;		/* Error code */
408	long scno;		/* System call number */
409	long u_arg[MAX_ARGS];	/* System call arguments */
410#if defined(LINUX_MIPSN32) || defined(X32)
411	long long ext_arg[MAX_ARGS];
412	long long u_lrval;	/* long long return value */
413#endif
414	long u_rval;		/* Return value */
415#if SUPPORTED_PERSONALITIES > 1
416	unsigned int currpers;	/* Personality at the time of scno update */
417#endif
418	int curcol;		/* Output column for this process */
419	FILE *outf;		/* Output file for this process */
420	const char *auxstr;	/* Auxiliary info from syscall (see RVAL_STR) */
421	const struct_sysent *s_ent; /* sysent[scno] or dummy struct for bad scno */
422	struct timeval stime;	/* System time usage as of last process wait */
423	struct timeval dtime;	/* Delta for system time usage */
424	struct timeval etime;	/* Syscall entry time */
425				/* Support for tracing forked processes: */
426	long inst[2];		/* Saved clone args (badly named) */
427
428#ifdef USE_LIBUNWIND
429	struct UPT_info* libunwind_ui;
430	struct mmap_cache_t* mmap_cache;
431	unsigned int mmap_cache_size;
432	unsigned int mmap_cache_generation;
433	struct queue_t* queue;
434#endif
435};
436
437/* TCB flags */
438/* We have attached to this process, but did not see it stopping yet */
439#define TCB_STARTUP		0x01
440#define TCB_IGNORE_ONE_SIGSTOP	0x02	/* Next SIGSTOP is to be ignored */
441/*
442 * Are we in system call entry or in syscall exit?
443 *
444 * This bit is set after all syscall entry processing is done.
445 * Therefore, this bit will be set when next ptrace stop occurs,
446 * which should be syscall exit stop. Other stops which are possible
447 * directly after syscall entry (death, ptrace event stop)
448 * are simpler and handled without calling trace_syscall(), therefore
449 * the places where TCB_INSYSCALL can be set but we aren't in syscall stop
450 * are limited to trace(), this condition is never observed in trace_syscall()
451 * and below.
452 * The bit is cleared after all syscall exit processing is done.
453 * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary
454 * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered.
455 * TCB_WAITEXECVE bit is used for this purpose (see below).
456 *
457 * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable.
458 */
459#define TCB_INSYSCALL	0x04
460#define TCB_ATTACHED	0x08	/* We attached to it already */
461#define TCB_BPTSET	0x10	/* "Breakpoint" set after fork(2) */
462#define TCB_REPRINT	0x20	/* We should reprint this syscall on exit */
463#define TCB_FILTERED	0x40	/* This system call has been filtered out */
464/*
465 * x86 does not need TCB_WAITEXECVE.
466 * It can detect post-execve SIGTRAP by looking at eax/rax.
467 * See "not a syscall entry (eax = %ld)\n" message.
468 *
469 * Note! On new kernels (about 2.5.46+), we use PTRACE_O_TRACEEXEC, which
470 * suppresses post-execve SIGTRAP. If you are adding a new arch which is
471 * only supported by newer kernels, you most likely don't need to define
472 * TCB_WAITEXECVE!
473 */
474#if defined(ALPHA) \
475 || defined(SPARC) || defined(SPARC64) \
476 || defined(POWERPC) \
477 || defined(IA64) \
478 || defined(HPPA) \
479 || defined(SH) || defined(SH64) \
480 || defined(S390) || defined(S390X) \
481 || defined(ARM) \
482 || defined(MIPS)
483/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP
484 * to happen. (When it is detected, tracee is continued and this bit is cleared.)
485 */
486# define TCB_WAITEXECVE	0x80
487#endif
488
489/* qualifier flags */
490#define QUAL_TRACE	0x001	/* this system call should be traced */
491#define QUAL_ABBREV	0x002	/* abbreviate the structures of this syscall */
492#define QUAL_VERBOSE	0x004	/* decode the structures of this syscall */
493#define QUAL_RAW	0x008	/* print all args in hex for this syscall */
494#define QUAL_SIGNAL	0x010	/* report events with this signal */
495#define QUAL_READ	0x020	/* dump data read on this file descriptor */
496#define QUAL_WRITE	0x040	/* dump data written to this file descriptor */
497typedef uint8_t qualbits_t;
498#define UNDEFINED_SCNO	0x100	/* Used only in tcp->qual_flg */
499
500#define DEFAULT_QUAL_FLAGS (QUAL_TRACE | QUAL_ABBREV | QUAL_VERBOSE)
501
502#define entering(tcp)	(!((tcp)->flags & TCB_INSYSCALL))
503#define exiting(tcp)	((tcp)->flags & TCB_INSYSCALL)
504#define syserror(tcp)	((tcp)->u_error != 0)
505#define verbose(tcp)	((tcp)->qual_flg & QUAL_VERBOSE)
506#define abbrev(tcp)	((tcp)->qual_flg & QUAL_ABBREV)
507#define filtered(tcp)	((tcp)->flags & TCB_FILTERED)
508
509struct xlat {
510	unsigned int val;
511	const char *str;
512};
513#define XLAT(x) { x, #x }
514#define XLAT_END { 0, NULL }
515
516extern const struct xlat addrfams[];
517extern const struct xlat at_flags[];
518extern const struct xlat open_access_modes[];
519extern const struct xlat open_mode_flags[];
520extern const struct xlat whence_codes[];
521
522/* Format of syscall return values */
523#define RVAL_DECIMAL	000	/* decimal format */
524#define RVAL_HEX	001	/* hex format */
525#define RVAL_OCTAL	002	/* octal format */
526#define RVAL_UDECIMAL	003	/* unsigned decimal format */
527#if defined(LINUX_MIPSN32) || defined(X32)
528# if 0 /* unused so far */
529#  define RVAL_LDECIMAL	004	/* long decimal format */
530#  define RVAL_LHEX	005	/* long hex format */
531#  define RVAL_LOCTAL	006	/* long octal format */
532# endif
533# define RVAL_LUDECIMAL	007	/* long unsigned decimal format */
534#endif
535#define RVAL_FD		010	/* file descriptor */
536#define RVAL_MASK	017	/* mask for these values */
537
538#define RVAL_STR	020	/* Print `auxstr' field after return val */
539#define RVAL_NONE	040	/* Print nothing */
540
541#define TRACE_FILE	001	/* Trace file-related syscalls. */
542#define TRACE_IPC	002	/* Trace IPC-related syscalls. */
543#define TRACE_NETWORK	004	/* Trace network-related syscalls. */
544#define TRACE_PROCESS	010	/* Trace process-related syscalls. */
545#define TRACE_SIGNAL	020	/* Trace signal-related syscalls. */
546#define TRACE_DESC	040	/* Trace file descriptor-related syscalls. */
547#define TRACE_MEMORY	0100	/* Trace memory mapping-related syscalls. */
548#define SYSCALL_NEVER_FAILS	0200	/* Syscall is always successful. */
549#define STACKTRACE_INVALIDATE_CACHE 0400  /* Trigger proc/maps cache updating */
550#define STACKTRACE_CAPTURE_ON_ENTER 01000 /* Capture stacktrace on "entering" stage */
551#define TRACE_INDIRECT_SUBCALL	02000	/* Syscall is an indirect socket/ipc subcall. */
552
553#if defined(ARM) || defined(AARCH64) \
554 || defined(I386) || defined(X32) || defined(X86_64) \
555 || defined(BFIN) \
556 || defined(M68K) \
557 || defined(MICROBLAZE) \
558 || defined(S390) \
559 || defined(SH) || defined(SH64) \
560 || defined(SPARC) || defined(SPARC64) \
561 /**/
562# define NEED_UID16_PARSERS 1
563#else
564# define NEED_UID16_PARSERS 0
565#endif
566
567typedef enum {
568	CFLAG_NONE = 0,
569	CFLAG_ONLY_STATS,
570	CFLAG_BOTH
571} cflag_t;
572extern cflag_t cflag;
573extern bool debug_flag;
574extern bool Tflag;
575extern bool iflag;
576extern bool count_wallclock;
577extern unsigned int qflag;
578extern bool not_failing_only;
579extern unsigned int show_fd_path;
580extern bool hide_log_until_execve;
581/* are we filtering traces based on paths? */
582extern const char **paths_selected;
583#define tracing_paths (paths_selected != NULL)
584extern bool need_fork_exec_workarounds;
585extern unsigned xflag;
586extern unsigned followfork;
587#ifdef USE_LIBUNWIND
588/* if this is true do the stack trace for every system call */
589extern bool stack_trace_enabled;
590#endif
591extern unsigned ptrace_setoptions;
592extern unsigned max_strlen;
593extern unsigned os_release;
594#undef KERNEL_VERSION
595#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
596
597enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 };
598
599void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
600void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2)));
601void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
602void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2)));
603void die_out_of_memory(void) __attribute__ ((noreturn));
604
605#if USE_CUSTOM_PRINTF
606/*
607 * See comment in vsprintf.c for allowed formats.
608 * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u.
609 */
610int strace_vfprintf(FILE *fp, const char *fmt, va_list args);
611#else
612# define strace_vfprintf vfprintf
613#endif
614
615extern void set_sortby(const char *);
616extern void set_overhead(int);
617extern void qualify(const char *);
618extern void print_pc(struct tcb *);
619extern int trace_syscall(struct tcb *);
620extern void count_syscall(struct tcb *, const struct timeval *);
621extern void call_summary(FILE *);
622
623#if defined(AVR32) \
624 || defined(I386) \
625 || defined(X86_64) || defined(X32) \
626 || defined(AARCH64) \
627 || defined(ARM) \
628 || defined(SPARC) || defined(SPARC64) \
629 || defined(TILE) \
630 || defined(OR1K) \
631 || defined(METAG) \
632 || defined(ARC) \
633 || defined(POWERPC)
634extern long get_regs_error;
635# define clear_regs()  (get_regs_error = -1)
636extern void get_regs(pid_t pid);
637#else
638# define get_regs_error 0
639# define clear_regs()  ((void)0)
640# define get_regs(pid) ((void)0)
641#endif
642extern int umoven(struct tcb *, long, unsigned int, char *);
643#define umove(pid, addr, objp)	\
644	umoven((pid), (addr), sizeof(*(objp)), (char *) (objp))
645extern int umovestr(struct tcb *, long, unsigned int, char *);
646extern int upeek(int pid, long, long *);
647#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH)
648extern long getrval2(struct tcb *);
649#endif
650/*
651 * On Linux, "setbpt" is a misnomer: we don't set a breakpoint
652 * (IOW: no poking in user's text segment),
653 * instead we change fork/vfork/clone into clone(CLONE_PTRACE).
654 * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead.
655 */
656extern int setbpt(struct tcb *);
657extern int clearbpt(struct tcb *);
658
659extern const char *signame(const int);
660extern void pathtrace_select(const char *);
661extern int pathtrace_match(struct tcb *);
662extern int getfdpath(struct tcb *, int, char *, unsigned);
663
664extern const char *xlookup(const struct xlat *, const unsigned int);
665extern const char *xlat_search(const struct xlat *, const size_t, const unsigned int);
666
667extern int string_to_uint(const char *str);
668extern int string_quote(const char *, char *, long, int);
669extern int next_set_bit(const void *bit_array, unsigned cur_bit, unsigned size_bits);
670
671/* a refers to the lower numbered u_arg,
672 * b refers to the higher numbered u_arg
673 */
674#if HAVE_LITTLE_ENDIAN_LONG_LONG
675# define LONG_LONG(a,b) \
676	((long long)((unsigned long long)(unsigned)(a) | ((unsigned long long)(b)<<32)))
677#else
678# define LONG_LONG(a,b) \
679	((long long)((unsigned long long)(unsigned)(b) | ((unsigned long long)(a)<<32)))
680#endif
681extern int getllval(struct tcb *, unsigned long long *, int);
682extern int printllval(struct tcb *, const char *, int);
683
684extern void printxval(const struct xlat *, const unsigned int, const char *);
685extern int printargs(struct tcb *);
686extern int printargs_lu(struct tcb *);
687extern int printargs_ld(struct tcb *);
688extern void addflags(const struct xlat *, int);
689extern int printflags(const struct xlat *, int, const char *);
690extern const char *sprintflags(const char *, const struct xlat *, int);
691extern const char *sprintmode(int);
692extern const char *sprinttime(time_t);
693extern void dumpiov_in_msghdr(struct tcb *, long);
694extern void dumpiov_in_mmsghdr(struct tcb *, long);
695extern void dumpiov(struct tcb *, int, long);
696extern void dumpstr(struct tcb *, long, int);
697extern void printstr(struct tcb *, long, long);
698extern void printnum(struct tcb *, long, const char *);
699extern void printnum_int(struct tcb *, long, const char *);
700extern void printpath(struct tcb *, long);
701extern void printpathn(struct tcb *, long, unsigned int);
702#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}"))
703#define TIMEVAL_TEXT_BUFSIZE  TIMESPEC_TEXT_BUFSIZE
704extern void printtv_bitness(struct tcb *, long, enum bitness_t, int);
705#define printtv(tcp, addr)	\
706	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0)
707#define printtv_special(tcp, addr)	\
708	printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1)
709extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special);
710extern void print_timespec(struct tcb *, long);
711extern void sprint_timespec(char *, struct tcb *, long);
712#ifdef HAVE_SIGINFO_T
713extern void printsiginfo(siginfo_t *, int);
714extern void printsiginfo_at(struct tcb *tcp, long addr);
715#endif
716extern void printfd(struct tcb *, int);
717extern bool print_sockaddr_by_inode(const unsigned long, const char *);
718extern void print_dirfd(struct tcb *, int);
719extern void printsock(struct tcb *, long, int);
720extern void print_sock_optmgmt(struct tcb *, long, int);
721extern void printrusage(struct tcb *, long);
722#ifdef ALPHA
723extern void printrusage32(struct tcb *, long);
724#endif
725extern void printuid(const char *, const unsigned int);
726extern void print_sigset_addr_len(struct tcb *, long, long);
727extern void printsignal(int);
728extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov);
729extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long);
730extern void tprint_open_modes(int);
731extern const char *sprint_open_modes(int);
732extern void print_loff_t(struct tcb *, long);
733
734extern const struct_ioctlent *ioctl_lookup(unsigned long);
735extern const struct_ioctlent *ioctl_next_match(const struct_ioctlent *);
736extern int ioctl_decode(struct tcb *, long, long);
737extern int term_ioctl(struct tcb *, long, long);
738extern int sock_ioctl(struct tcb *, long, long);
739extern int proc_ioctl(struct tcb *, int, int);
740extern int rtc_ioctl(struct tcb *, long, long);
741extern int scsi_ioctl(struct tcb *, long, long);
742extern int block_ioctl(struct tcb *, long, long);
743extern int v4l2_ioctl(struct tcb *, unsigned long, long);
744extern int mtd_ioctl(struct tcb *, long, long);
745extern int ubi_ioctl(struct tcb *, long, long);
746extern int loop_ioctl(struct tcb *, long, long);
747extern int ptp_ioctl(struct tcb *, long, long);
748
749extern int tv_nz(const struct timeval *);
750extern int tv_cmp(const struct timeval *, const struct timeval *);
751extern double tv_float(const struct timeval *);
752extern void tv_add(struct timeval *, const struct timeval *, const struct timeval *);
753extern void tv_sub(struct timeval *, const struct timeval *, const struct timeval *);
754extern void tv_mul(struct timeval *, const struct timeval *, int);
755extern void tv_div(struct timeval *, const struct timeval *, int);
756
757#ifdef USE_LIBUNWIND
758extern void unwind_init(void);
759extern void unwind_tcb_init(struct tcb *tcp);
760extern void unwind_tcb_fin(struct tcb *tcp);
761extern void unwind_cache_invalidate(struct tcb* tcp);
762extern void unwind_print_stacktrace(struct tcb* tcp);
763extern void unwind_capture_stacktrace(struct tcb* tcp);
764#endif
765
766/* Strace log generation machinery.
767 *
768 * printing_tcp: tcb which has incomplete line being printed right now.
769 * NULL if last line has been completed ('\n'-terminated).
770 * printleader(tcp) examines it, finishes incomplete line if needed,
771 * the sets it to tcp.
772 * line_ended() clears printing_tcp and resets ->curcol = 0.
773 * tcp->curcol == 0 check is also used to detect completeness
774 * of last line, since in -ff mode just checking printing_tcp for NULL
775 * is not enough.
776 *
777 * If you change this code, test log generation in both -f and -ff modes
778 * using:
779 * strace -oLOG -f[f] test/threaded_execve
780 * strace -oLOG -f[f] test/sigkill_rain
781 * strace -oLOG -f[f] -p "`pidof web_browser`"
782 */
783extern struct tcb *printing_tcp;
784extern void printleader(struct tcb *);
785extern void line_ended(void);
786extern void tabto(void);
787extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
788extern void tprints(const char *str);
789
790#if SUPPORTED_PERSONALITIES > 1
791extern void set_personality(int personality);
792extern unsigned current_personality;
793#else
794# define set_personality(personality) ((void)0)
795# define current_personality 0
796#endif
797
798#if SUPPORTED_PERSONALITIES == 1
799# define current_wordsize PERSONALITY0_WORDSIZE
800#else
801# if SUPPORTED_PERSONALITIES == 2 && PERSONALITY0_WORDSIZE == PERSONALITY1_WORDSIZE
802#  define current_wordsize PERSONALITY0_WORDSIZE
803# else
804extern unsigned current_wordsize;
805# endif
806#endif
807
808/* In many, many places we play fast and loose and use
809 * tprintf("%d", (int) tcp->u_arg[N]) to print fds, pids etc.
810 * We probably need to use widen_to_long() instead:
811 */
812#if SUPPORTED_PERSONALITIES > 1 && SIZEOF_LONG > 4
813# define widen_to_long(v) (current_wordsize == 4 ? (long)(int32_t)(v) : (long)(v))
814#else
815# define widen_to_long(v) ((long)(v))
816#endif
817
818extern const struct_sysent sysent0[];
819extern const char *const errnoent0[];
820extern const char *const signalent0[];
821extern const struct_ioctlent ioctlent0[];
822extern qualbits_t *qual_vec[SUPPORTED_PERSONALITIES];
823#define qual_flags (qual_vec[current_personality])
824#if SUPPORTED_PERSONALITIES > 1
825extern const struct_sysent *sysent;
826extern const char *const *errnoent;
827extern const char *const *signalent;
828extern const struct_ioctlent *ioctlent;
829#else
830# define sysent     sysent0
831# define errnoent   errnoent0
832# define signalent  signalent0
833# define ioctlent   ioctlent0
834#endif
835extern unsigned nsyscalls;
836extern unsigned nerrnos;
837extern unsigned nsignals;
838extern unsigned nioctlents;
839extern unsigned num_quals;
840
841/*
842 * If you need non-NULL sysent[scno].sys_func and sysent[scno].sys_name
843 */
844#define SCNO_IS_VALID(scno) \
845	((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func)
846
847/* Only ensures that sysent[scno] isn't out of range */
848#define SCNO_IN_RANGE(scno) \
849	((unsigned long)(scno) < nsyscalls)
850