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