defs.h revision b5d43b81a8abdf17bc3aa585a66215ebe3ba3671
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#ifdef _LARGEFILE64_SOURCE 34/* This is the macro everything checks before using foo64 names. */ 35# ifndef _LFS64_LARGEFILE 36# define _LFS64_LARGEFILE 1 37# endif 38#endif 39#ifdef MIPS 40# include <sgidefs.h> 41#endif 42#include <features.h> 43#ifdef HAVE_STDBOOL_H 44# include <stdbool.h> 45#endif 46#include <stdint.h> 47#include <inttypes.h> 48#include <sys/types.h> 49#ifdef STDC_HEADERS 50# include <stddef.h> 51#endif 52#include <unistd.h> 53#include <stdlib.h> 54#include <stdio.h> 55#include <ctype.h> 56#include <string.h> 57#include <errno.h> 58#include <signal.h> 59#include <time.h> 60#include <sys/time.h> 61#include <sys/syscall.h> 62 63#ifndef HAVE_STRERROR 64const char *strerror(int); 65#endif 66#ifndef HAVE_STPCPY 67/* Some libc have stpcpy, some don't. Sigh... 68 * Roll our private implementation... 69 */ 70#undef stpcpy 71#define stpcpy strace_stpcpy 72extern char *stpcpy(char *dst, const char *src); 73#endif 74 75#if !defined __GNUC__ 76# define __attribute__(x) /*nothing*/ 77#endif 78 79#ifndef offsetof 80# define offsetof(type, member) \ 81 (((char *) &(((type *) NULL)->member)) - ((char *) (type *) NULL)) 82#endif 83 84#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 85 86/* Glibc has an efficient macro for sigemptyset 87 * (it just does one or two assignments of 0 to internal vector of longs). 88 */ 89#if defined(__GLIBC__) && defined(__sigemptyset) && !defined(sigemptyset) 90# define sigemptyset __sigemptyset 91#endif 92 93/* Configuration section */ 94#ifndef MAX_QUALS 95# if defined(MIPS) 96# define MAX_QUALS 7000 /* maximum number of syscalls, signals, etc. */ 97# else 98# define MAX_QUALS 2048 /* maximum number of syscalls, signals, etc. */ 99# endif 100#endif 101#ifndef DEFAULT_STRLEN 102/* default maximum # of bytes printed in `printstr', change with -s switch */ 103# define DEFAULT_STRLEN 32 104#endif 105#ifndef DEFAULT_ACOLUMN 106# define DEFAULT_ACOLUMN 40 /* default alignment column for results */ 107#endif 108/* 109 * Maximum number of args to a syscall. 110 * 111 * Make sure that all entries in all syscallent.h files have nargs <= MAX_ARGS! 112 * linux/<ARCH>/syscallent.h: all have nargs <= 6. 113 */ 114#ifndef MAX_ARGS 115# define MAX_ARGS 6 116#endif 117/* default sorting method for call profiling */ 118#ifndef DEFAULT_SORTBY 119# define DEFAULT_SORTBY "time" 120#endif 121 122#if defined(SPARC) || defined(SPARC64) 123# define LINUXSPARC 124#endif 125#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI32 126# define LINUX_MIPSO32 127#endif 128#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_NABI32 129# define LINUX_MIPSN32 130# define LINUX_MIPS64 131#endif 132#if defined(MIPS) && _MIPS_SIM == _MIPS_SIM_ABI64 133# define LINUX_MIPSN64 134# define LINUX_MIPS64 135#endif 136 137#if (defined(LINUXSPARC) || defined(X86_64) || defined(ARM) || defined(AVR32)) && defined(__GLIBC__) 138# include <sys/ptrace.h> 139#else 140/* Work around awkward prototype in ptrace.h. */ 141# define ptrace xptrace 142# include <sys/ptrace.h> 143# undef ptrace 144# ifdef POWERPC 145# define __KERNEL__ 146# include <asm/ptrace.h> 147# undef __KERNEL__ 148# endif 149extern long ptrace(int, int, char *, long); 150#endif 151 152#if !defined(__GLIBC__) 153# define PTRACE_PEEKUSER PTRACE_PEEKUSR 154# define PTRACE_POKEUSER PTRACE_POKEUSR 155#endif 156#if defined(X86_64) || defined(X32) || defined(I386) 157/* For struct pt_regs. x86 strace uses PTRACE_GETREGS. 158 * PTRACE_GETREGS returns registers in the layout of this struct. 159 */ 160# include <asm/ptrace.h> 161#endif 162#ifdef ALPHA 163# define REG_R0 0 164# define REG_A0 16 165# define REG_A3 19 166# define REG_FP 30 167# define REG_PC 64 168#endif /* ALPHA */ 169#ifdef MIPS 170# define REG_V0 2 171# define REG_A0 4 172# define REG_A3 7 173# define REG_SP 29 174# define REG_EPC 64 175#endif /* MIPS */ 176#ifdef HPPA 177# define PT_GR20 (20*4) 178# define PT_GR26 (26*4) 179# define PT_GR28 (28*4) 180# define PT_IAOQ0 (106*4) 181# define PT_IAOQ1 (107*4) 182#endif /* HPPA */ 183#ifdef SH64 184 /* SH64 Linux - this code assumes the following kernel API for system calls: 185 PC Offset 0 186 System Call Offset 16 (actually, (syscall no.) | (0x1n << 16), 187 where n = no. of parameters. 188 Other regs Offset 24+ 189 190 On entry: R2-7 = parameters 1-6 (as many as necessary) 191 On return: R9 = result. */ 192 193 /* Offset for peeks of registers */ 194# define REG_OFFSET (24) 195# define REG_GENERAL(x) (8*(x)+REG_OFFSET) 196# define REG_PC (0*8) 197# define REG_SYSCALL (2*8) 198#endif /* SH64 */ 199 200#define SUPPORTED_PERSONALITIES 1 201#define DEFAULT_PERSONALITY 0 202 203#ifdef LINUXSPARC 204/* Indexes into the pt_regs.u_reg[] array -- UREG_XX from kernel are all off 205 * by 1 and use Ix instead of Ox. These work for both 32 and 64 bit Linux. */ 206# define U_REG_G1 0 207# define U_REG_O0 7 208# define U_REG_O1 8 209# define PERSONALITY0_WORDSIZE 4 210# define PERSONALITY1_WORDSIZE 4 211# undef SUPPORTED_PERSONALITIES 212# if defined(SPARC64) 213# include <asm/psrcompat.h> 214# define SUPPORTED_PERSONALITIES 3 215# define PERSONALITY2_WORDSIZE 8 216# else 217# include <asm/psr.h> 218# define SUPPORTED_PERSONALITIES 2 219# endif /* SPARC64 */ 220#endif /* LINUXSPARC */ 221 222#ifdef X86_64 223# undef SUPPORTED_PERSONALITIES 224# define SUPPORTED_PERSONALITIES 3 225# define PERSONALITY0_WORDSIZE 8 226# define PERSONALITY1_WORDSIZE 4 227# define PERSONALITY2_WORDSIZE 4 228#endif 229 230#ifdef X32 231# undef SUPPORTED_PERSONALITIES 232# define SUPPORTED_PERSONALITIES 2 233# define PERSONALITY0_WORDSIZE 4 234# define PERSONALITY1_WORDSIZE 4 235#endif 236 237#ifdef ARM 238# undef SUPPORTED_PERSONALITIES 239# define SUPPORTED_PERSONALITIES 2 240# define PERSONALITY0_WORDSIZE 4 241# define PERSONALITY1_WORDSIZE 4 242#endif 243 244#ifdef POWERPC64 245# undef SUPPORTED_PERSONALITIES 246# define SUPPORTED_PERSONALITIES 2 247# define PERSONALITY0_WORDSIZE 8 248# define PERSONALITY1_WORDSIZE 4 249#endif 250 251#ifndef PERSONALITY0_WORDSIZE 252# define PERSONALITY0_WORDSIZE sizeof(long) 253#endif 254 255#if !HAVE_DECL_PTRACE_SETOPTIONS 256# define PTRACE_SETOPTIONS 0x4200 257#endif 258#if !HAVE_DECL_PTRACE_GETEVENTMSG 259# define PTRACE_GETEVENTMSG 0x4201 260#endif 261#if !HAVE_DECL_PTRACE_GETSIGINFO 262# define PTRACE_GETSIGINFO 0x4202 263#endif 264 265#if !HAVE_DECL_PTRACE_O_TRACESYSGOOD 266# define PTRACE_O_TRACESYSGOOD 0x00000001 267#endif 268#if !HAVE_DECL_PTRACE_O_TRACEFORK 269# define PTRACE_O_TRACEFORK 0x00000002 270#endif 271#if !HAVE_DECL_PTRACE_O_TRACEVFORK 272# define PTRACE_O_TRACEVFORK 0x00000004 273#endif 274#if !HAVE_DECL_PTRACE_O_TRACECLONE 275# define PTRACE_O_TRACECLONE 0x00000008 276#endif 277#if !HAVE_DECL_PTRACE_O_TRACEEXEC 278# define PTRACE_O_TRACEEXEC 0x00000010 279#endif 280#if !HAVE_DECL_PTRACE_O_TRACEEXIT 281# define PTRACE_O_TRACEEXIT 0x00000040 282#endif 283 284#if !HAVE_DECL_PTRACE_EVENT_FORK 285# define PTRACE_EVENT_FORK 1 286#endif 287#if !HAVE_DECL_PTRACE_EVENT_VFORK 288# define PTRACE_EVENT_VFORK 2 289#endif 290#if !HAVE_DECL_PTRACE_EVENT_CLONE 291# define PTRACE_EVENT_CLONE 3 292#endif 293#if !HAVE_DECL_PTRACE_EVENT_EXEC 294# define PTRACE_EVENT_EXEC 4 295#endif 296#if !HAVE_DECL_PTRACE_EVENT_VFORK_DONE 297# define PTRACE_EVENT_VFORK_DONE 5 298#endif 299#if !HAVE_DECL_PTRACE_EVENT_EXIT 300# define PTRACE_EVENT_EXIT 6 301#endif 302 303/* Experimental code using PTRACE_SEIZE can be enabled here: */ 304//# define USE_SEIZE 1 305 306#ifdef USE_SEIZE 307# undef PTRACE_SEIZE 308# define PTRACE_SEIZE 0x4206 309# undef PTRACE_INTERRUPT 310# define PTRACE_INTERRUPT 0x4207 311# undef PTRACE_LISTEN 312# define PTRACE_LISTEN 0x4208 313# undef PTRACE_SEIZE_DEVEL 314# define PTRACE_SEIZE_DEVEL 0x80000000 315# undef PTRACE_EVENT_STOP 316# define PTRACE_EVENT_STOP 7 317# define PTRACE_EVENT_STOP1 128 318#endif 319 320#if defined(I386) 321extern struct pt_regs i386_regs; 322#endif 323#if defined(IA64) 324extern long ia32; 325#endif 326 327/* Trace Control Block */ 328struct tcb { 329 int flags; /* See below for TCB_ values */ 330 int pid; /* Process Id of this entry */ 331 int u_nargs; /* System call argument count */ 332 int u_error; /* Error code */ 333 long scno; /* System call number */ 334 long u_arg[MAX_ARGS]; /* System call arguments */ 335#if defined(LINUX_MIPSN32) || defined(X32) 336 long long ext_arg[MAX_ARGS]; /* System call arguments */ 337#endif 338 long u_rval; /* return value */ 339#if defined(LINUX_MIPSN32) || defined(X32) 340 long long u_lrval; /* long long return value */ 341#endif 342#if SUPPORTED_PERSONALITIES > 1 343 int currpers; /* Personality at the time of scno update */ 344#endif 345 int curcol; /* Output column for this process */ 346 FILE *outf; /* Output file for this process */ 347 const char *auxstr; /* Auxiliary info from syscall (see RVAL_STR) */ 348 struct timeval stime; /* System time usage as of last process wait */ 349 struct timeval dtime; /* Delta for system time usage */ 350 struct timeval etime; /* Syscall entry time */ 351 /* Support for tracing forked processes: */ 352 long inst[2]; /* Saved clone args (badly named) */ 353}; 354 355/* TCB flags */ 356#define TCB_INUSE 00001 /* This table entry is in use */ 357/* We have attached to this process, but did not see it stopping yet */ 358#define TCB_STARTUP 00002 359#define TCB_IGNORE_ONE_SIGSTOP 00004 /* Next SIGSTOP is to be ignored */ 360/* 361 * Are we in system call entry or in syscall exit? 362 * 363 * This bit is set after all syscall entry processing is done. 364 * Therefore, this bit will be set when next ptrace stop occurs, 365 * which should be syscall exit stop. Other stops which are possible 366 * directly after syscall entry (death, ptrace event stop) 367 * are simpler and handled without calling trace_syscall(), therefore 368 * the places where TCB_INSYSCALL can be set but we aren't in syscall stop 369 * are limited to trace(), this condition is never observed in trace_syscall() 370 * and below. 371 * The bit is cleared after all syscall exit processing is done. 372 * User-generated SIGTRAPs and post-execve SIGTRAP make it necessary 373 * to be very careful and NOT set TCB_INSYSCALL bit when they are encountered. 374 * TCB_WAITEXECVE bit is used for this purpose (see below). 375 * 376 * Use entering(tcp) / exiting(tcp) to check this bit to make code more readable. 377 */ 378#define TCB_INSYSCALL 00010 379#define TCB_ATTACHED 00020 /* It is attached already */ 380/* Are we PROG from "strace PROG [ARGS]" invocation? */ 381#define TCB_STRACE_CHILD 0040 382#define TCB_BPTSET 00100 /* "Breakpoint" set after fork(2) */ 383#define TCB_REPRINT 00200 /* We should reprint this syscall on exit */ 384#define TCB_FILTERED 00400 /* This system call has been filtered out */ 385/* x86 does not need TCB_WAITEXECVE. 386 * It can detect SIGTRAP by looking at eax/rax. 387 * See "not a syscall entry (eax = %ld)\n" message 388 * in syscall_fixup_on_sysenter(). 389 */ 390#if defined(ALPHA) || defined(AVR32) || defined(SPARC) || defined(SPARC64) \ 391 || defined(POWERPC) || defined(IA64) || defined(HPPA) \ 392 || defined(SH) || defined(SH64) || defined(S390) || defined(S390X) \ 393 || defined(ARM) || defined(MIPS) || defined(BFIN) || defined(TILE) 394/* This tracee has entered into execve syscall. Expect post-execve SIGTRAP 395 * to happen. (When it is detected, tracee is continued and this bit is cleared.) 396 */ 397# define TCB_WAITEXECVE 01000 398#endif 399 400/* qualifier flags */ 401#define QUAL_TRACE 0001 /* this system call should be traced */ 402#define QUAL_ABBREV 0002 /* abbreviate the structures of this syscall */ 403#define QUAL_VERBOSE 0004 /* decode the structures of this syscall */ 404#define QUAL_RAW 0010 /* print all args in hex for this syscall */ 405#define QUAL_SIGNAL 0020 /* report events with this signal */ 406#define QUAL_FAULT 0040 /* report events with this fault */ 407#define QUAL_READ 0100 /* dump data read on this file descriptor */ 408#define QUAL_WRITE 0200 /* dump data written to this file descriptor */ 409 410#define entering(tcp) (!((tcp)->flags & TCB_INSYSCALL)) 411#define exiting(tcp) ((tcp)->flags & TCB_INSYSCALL) 412#define syserror(tcp) ((tcp)->u_error != 0) 413#define verbose(tcp) (qual_flags[(tcp)->scno] & QUAL_VERBOSE) 414#define abbrev(tcp) (qual_flags[(tcp)->scno] & QUAL_ABBREV) 415#define filtered(tcp) ((tcp)->flags & TCB_FILTERED) 416 417struct xlat { 418 int val; 419 const char *str; 420}; 421 422extern const struct xlat open_mode_flags[]; 423extern const struct xlat addrfams[]; 424extern const struct xlat struct_user_offsets[]; 425extern const struct xlat open_access_modes[]; 426 427/* Format of syscall return values */ 428#define RVAL_DECIMAL 000 /* decimal format */ 429#define RVAL_HEX 001 /* hex format */ 430#define RVAL_OCTAL 002 /* octal format */ 431#define RVAL_UDECIMAL 003 /* unsigned decimal format */ 432#if defined(LINUX_MIPSN32) || defined(X32) 433# if 0 /* unused so far */ 434# define RVAL_LDECIMAL 004 /* long decimal format */ 435# define RVAL_LHEX 005 /* long hex format */ 436# define RVAL_LOCTAL 006 /* long octal format */ 437# endif 438# define RVAL_LUDECIMAL 007 /* long unsigned decimal format */ 439#endif 440#define RVAL_MASK 007 /* mask for these values */ 441 442#define RVAL_STR 010 /* Print `auxstr' field after return val */ 443#define RVAL_NONE 020 /* Print nothing */ 444 445#define TRACE_FILE 001 /* Trace file-related syscalls. */ 446#define TRACE_IPC 002 /* Trace IPC-related syscalls. */ 447#define TRACE_NETWORK 004 /* Trace network-related syscalls. */ 448#define TRACE_PROCESS 010 /* Trace process-related syscalls. */ 449#define TRACE_SIGNAL 020 /* Trace signal-related syscalls. */ 450#define TRACE_DESC 040 /* Trace file descriptor-related syscalls. */ 451#define SYSCALL_NEVER_FAILS 0100 /* Syscall is always successful. */ 452 453typedef enum { 454 CFLAG_NONE = 0, 455 CFLAG_ONLY_STATS, 456 CFLAG_BOTH 457} cflag_t; 458extern cflag_t cflag; 459extern int *qual_flags; 460extern bool debug_flag; 461extern bool Tflag; 462extern bool qflag; 463extern bool not_failing_only; 464extern bool show_fd_path; 465extern bool tracing_paths; 466extern unsigned int xflag; 467extern unsigned int followfork; 468extern unsigned int ptrace_setoptions; 469extern unsigned int max_strlen; 470 471enum bitness_t { BITNESS_CURRENT = 0, BITNESS_32 }; 472 473void error_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); 474void perror_msg(const char *fmt, ...) __attribute__ ((format(printf, 1, 2))); 475void error_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 476void perror_msg_and_die(const char *fmt, ...) __attribute__ ((noreturn, format(printf, 1, 2))); 477void die_out_of_memory(void) __attribute__ ((noreturn)); 478 479#ifdef USE_CUSTOM_PRINTF 480/* 481 * Speed-optimized vfprintf implementation. 482 * See comment in vsprintf.c for allowed formats. 483 * Short version: %h[h]u, %zu, %tu are not allowed, use %[l[l]]u. 484 * 485 * It results in strace using about 5% less CPU in user space 486 * (compared to glibc version). 487 * But strace spends a lot of time in kernel space, 488 * so overall it does not appear to be a significant win. 489 * Thus disabled by default. 490 */ 491int strace_vfprintf(FILE *fp, const char *fmt, va_list args); 492#else 493# define strace_vfprintf vfprintf 494#endif 495 496extern void set_sortby(const char *); 497extern void set_overhead(int); 498extern void qualify(const char *); 499extern int trace_syscall(struct tcb *); 500extern void count_syscall(struct tcb *, struct timeval *); 501extern void call_summary(FILE *); 502 503extern int umoven(struct tcb *, long, int, char *); 504#define umove(pid, addr, objp) \ 505 umoven((pid), (addr), sizeof(*(objp)), (char *) (objp)) 506extern int umovestr(struct tcb *, long, int, char *); 507extern int upeek(struct tcb *, long, long *); 508#if defined(SPARC) || defined(SPARC64) || defined(IA64) || defined(SH) 509extern long getrval2(struct tcb *); 510#endif 511/* 512 * On Linux, "setbpt" is a misnomer: we don't set a breakpoint 513 * (IOW: no poking in user's text segment), 514 * instead we change fork/vfork/clone into clone(CLONE_PTRACE). 515 * On newer kernels, we use PTRACE_O_TRACECLONE/TRACE[V]FORK instead. 516 */ 517extern int setbpt(struct tcb *); 518extern int clearbpt(struct tcb *); 519 520extern const char *signame(int); 521extern int is_restart_error(struct tcb *); 522extern int pathtrace_select(const char *); 523extern int pathtrace_match(struct tcb *); 524extern const char *getfdpath(struct tcb *, int); 525 526extern const char *xlookup(const struct xlat *, int); 527 528extern int string_to_uint(const char *str); 529extern int string_quote(const char *, char *, long, int); 530 531#if HAVE_LONG_LONG 532/* _l refers to the lower numbered u_arg, 533 * _h refers to the higher numbered u_arg 534 */ 535# if HAVE_LITTLE_ENDIAN_LONG_LONG 536# define LONG_LONG(_l,_h) \ 537 ((long long)((unsigned long long)(unsigned)(_l) | ((unsigned long long)(_h)<<32))) 538# else 539# define LONG_LONG(_l,_h) \ 540 ((long long)((unsigned long long)(unsigned)(_h) | ((unsigned long long)(_l)<<32))) 541# endif 542extern int printllval(struct tcb *, const char *, int); 543#endif 544extern void printxval(const struct xlat *, int, const char *); 545extern int printargs(struct tcb *); 546extern int printargs_lu(struct tcb *); 547extern int printargs_ld(struct tcb *); 548extern void addflags(const struct xlat *, int); 549extern int printflags(const struct xlat *, int, const char *); 550extern const char *sprintflags(const char *, const struct xlat *, int); 551extern void dumpiov(struct tcb *, int, long); 552extern void dumpstr(struct tcb *, long, int); 553extern void printstr(struct tcb *, long, long); 554extern void printnum(struct tcb *, long, const char *); 555extern void printnum_int(struct tcb *, long, const char *); 556extern void printpath(struct tcb *, long); 557extern void printpathn(struct tcb *, long, int); 558#define TIMESPEC_TEXT_BUFSIZE (sizeof(long)*3 * 2 + sizeof("{%u, %u}")) 559#define TIMEVAL_TEXT_BUFSIZE TIMESPEC_TEXT_BUFSIZE 560extern void printtv_bitness(struct tcb *, long, enum bitness_t, int); 561#define printtv(tcp, addr) \ 562 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 0) 563#define printtv_special(tcp, addr) \ 564 printtv_bitness((tcp), (addr), BITNESS_CURRENT, 1) 565extern char *sprinttv(char *, struct tcb *, long, enum bitness_t, int special); 566extern void print_timespec(struct tcb *, long); 567extern void sprint_timespec(char *, struct tcb *, long); 568#ifdef HAVE_SIGINFO_T 569extern void printsiginfo(siginfo_t *, int); 570#endif 571extern void printfd(struct tcb *, int); 572extern void printsock(struct tcb *, long, int); 573extern void print_sock_optmgmt(struct tcb *, long, int); 574extern void printrusage(struct tcb *, long); 575#ifdef ALPHA 576extern void printrusage32(struct tcb *, long); 577#endif 578extern void printuid(const char *, unsigned long); 579extern void printcall(struct tcb *); 580extern void print_sigset(struct tcb *, long, int); 581extern void printsignal(int); 582extern void tprint_iov(struct tcb *, unsigned long, unsigned long, int decode_iov); 583extern void tprint_iov_upto(struct tcb *, unsigned long, unsigned long, int decode_iov, unsigned long); 584extern void tprint_open_modes(mode_t); 585extern const char *sprint_open_modes(mode_t); 586extern void print_loff_t(struct tcb *, long); 587 588extern const struct ioctlent *ioctl_lookup(long); 589extern const struct ioctlent *ioctl_next_match(const struct ioctlent *); 590extern int ioctl_decode(struct tcb *, long, long); 591extern int term_ioctl(struct tcb *, long, long); 592extern int sock_ioctl(struct tcb *, long, long); 593extern int proc_ioctl(struct tcb *, int, int); 594extern int rtc_ioctl(struct tcb *, long, long); 595extern int scsi_ioctl(struct tcb *, long, long); 596extern int block_ioctl(struct tcb *, long, long); 597extern int mtd_ioctl(struct tcb *, long, long); 598extern int loop_ioctl(struct tcb *, long, long); 599 600extern int tv_nz(struct timeval *); 601extern int tv_cmp(struct timeval *, struct timeval *); 602extern double tv_float(struct timeval *); 603extern void tv_add(struct timeval *, struct timeval *, struct timeval *); 604extern void tv_sub(struct timeval *, struct timeval *, struct timeval *); 605extern void tv_mul(struct timeval *, struct timeval *, int); 606extern void tv_div(struct timeval *, struct timeval *, int); 607 608/* Strace log generation machinery. 609 * 610 * printing_tcp: tcb which has incomplete line being printed right now. 611 * NULL if last line has been completed ('\n'-terminated). 612 * printleader(tcp) examines it, finishes incomplete line if needed, 613 * the sets it to tcp. 614 * line_ended() clears printing_tcp and resets ->curcol = 0. 615 * tcp->curcol == 0 check is also used to detect completeness 616 * of last line, since in -ff mode just checking printing_tcp for NULL 617 * is not enough. 618 * 619 * If you change this code, test log generation in both -f and -ff modes 620 * using: 621 * strace -oLOG -f[f] test/threaded_execve 622 * strace -oLOG -f[f] test/sigkill_rain 623 * strace -oLOG -f[f] -p "`pidof web_browser`" 624 */ 625extern struct tcb *printing_tcp; 626extern void printleader(struct tcb *); 627extern void line_ended(void); 628extern void tabto(void); 629extern void tprintf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); 630extern void tprints(const char *str); 631 632#if SUPPORTED_PERSONALITIES > 1 633extern void set_personality(int personality); 634extern int current_personality; 635extern const int personality_wordsize[]; 636# define current_wordsize (personality_wordsize[current_personality]) 637#else 638# define set_personality(personality) ((void)0) 639# define current_personality 0 640# define current_wordsize PERSONALITY0_WORDSIZE 641#endif 642 643struct sysent { 644 unsigned nargs; 645 int sys_flags; 646 int (*sys_func)(); 647 const char *sys_name; 648}; 649 650struct ioctlent { 651 const char *doth; 652 const char *symbol; 653 unsigned long code; 654}; 655 656extern const struct sysent *sysent; 657extern unsigned nsyscalls; 658extern const char *const *errnoent; 659extern unsigned nerrnos; 660extern const struct ioctlent *ioctlent; 661extern unsigned nioctlents; 662extern const char *const *signalent; 663extern unsigned nsignals; 664 665#define SCNO_IN_RANGE(scno) \ 666 ((unsigned long)(scno) < nsyscalls && sysent[scno].sys_func) 667