Home | History | Annotate | Download | only in strace
      1 /*
      2  * Copyright (c) 1991, 1992 Paul Kranenburg <pk (at) cs.few.eur.nl>
      3  * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl>
      4  * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com>
      5  * Copyright (c) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl>
      6  * All rights reserved.
      7  *
      8  * Redistribution and use in source and binary forms, with or without
      9  * modification, are permitted provided that the following conditions
     10  * are met:
     11  * 1. Redistributions of source code must retain the above copyright
     12  *    notice, this list of conditions and the following disclaimer.
     13  * 2. Redistributions in binary form must reproduce the above copyright
     14  *    notice, this list of conditions and the following disclaimer in the
     15  *    documentation and/or other materials provided with the distribution.
     16  * 3. The name of the author may not be used to endorse or promote products
     17  *    derived from this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     20  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     21  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     22  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     24  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     28  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  *
     30  *	$Id$
     31  */
     32 
     33 #include "defs.h"
     34 
     35 #include <sys/types.h>
     36 #include <signal.h>
     37 #include <errno.h>
     38 #include <sys/param.h>
     39 #include <fcntl.h>
     40 #include <sys/resource.h>
     41 #include <sys/wait.h>
     42 #include <sys/stat.h>
     43 #include <pwd.h>
     44 #include <grp.h>
     45 #include <string.h>
     46 #include <limits.h>
     47 #include <dirent.h>
     48 
     49 #ifdef LINUX
     50 # include <asm/unistd.h>
     51 # if defined __NR_tgkill
     52 #  define my_tgkill(pid, tid, sig) syscall (__NR_tgkill, (pid), (tid), (sig))
     53 # elif defined __NR_tkill
     54 #  define my_tgkill(pid, tid, sig) syscall (__NR_tkill, (tid), (sig))
     55 # else
     56    /* kill() may choose arbitrarily the target task of the process group
     57       while we later wait on a that specific TID.  PID process waits become
     58       TID task specific waits for a process under ptrace(2).  */
     59 #  warning "Neither tkill(2) nor tgkill(2) available, risk of strace hangs!"
     60 #  define my_tgkill(pid, tid, sig) kill ((tid), (sig))
     61 # endif
     62 #endif
     63 
     64 #if defined(IA64) && defined(LINUX)
     65 # include <asm/ptrace_offsets.h>
     66 #endif
     67 
     68 #ifdef USE_PROCFS
     69 #include <poll.h>
     70 #endif
     71 
     72 #ifdef SVR4
     73 #include <sys/stropts.h>
     74 #ifdef HAVE_MP_PROCFS
     75 #ifdef HAVE_SYS_UIO_H
     76 #include <sys/uio.h>
     77 #endif
     78 #endif
     79 #endif
     80 extern char **environ;
     81 extern int optind;
     82 extern char *optarg;
     83 
     84 
     85 int debug = 0, followfork = 0;
     86 unsigned int ptrace_setoptions = 0;
     87 int dtime = 0, xflag = 0, qflag = 0;
     88 cflag_t cflag = CFLAG_NONE;
     89 static int iflag = 0, interactive = 0, pflag_seen = 0, rflag = 0, tflag = 0;
     90 /*
     91  * daemonized_tracer supports -D option.
     92  * With this option, strace forks twice.
     93  * Unlike normal case, with -D *grandparent* process exec's,
     94  * becoming a traced process. Child exits (this prevents traced process
     95  * from having children it doesn't expect to have), and grandchild
     96  * attaches to grandparent similarly to strace -p PID.
     97  * This allows for more transparent interaction in cases
     98  * when process and its parent are communicating via signals,
     99  * wait() etc. Without -D, strace process gets lodged in between,
    100  * disrupting parent<->child link.
    101  */
    102 static bool daemonized_tracer = 0;
    103 
    104 /* Sometimes we want to print only succeeding syscalls. */
    105 int not_failing_only = 0;
    106 
    107 static int exit_code = 0;
    108 static int strace_child = 0;
    109 
    110 static char *username = NULL;
    111 uid_t run_uid;
    112 gid_t run_gid;
    113 
    114 int acolumn = DEFAULT_ACOLUMN;
    115 int max_strlen = DEFAULT_STRLEN;
    116 static char *outfname = NULL;
    117 FILE *outf;
    118 static int curcol;
    119 struct tcb **tcbtab;
    120 unsigned int nprocs, tcbtabsize;
    121 const char *progname;
    122 extern char **environ;
    123 
    124 static int detach(struct tcb *tcp, int sig);
    125 static int trace(void);
    126 static void cleanup(void);
    127 static void interrupt(int sig);
    128 static sigset_t empty_set, blocked_set;
    129 
    130 #ifdef HAVE_SIG_ATOMIC_T
    131 static volatile sig_atomic_t interrupted;
    132 #else /* !HAVE_SIG_ATOMIC_T */
    133 static volatile int interrupted;
    134 #endif /* !HAVE_SIG_ATOMIC_T */
    135 
    136 #ifdef USE_PROCFS
    137 
    138 static struct tcb *pfd2tcb(int pfd);
    139 static void reaper(int sig);
    140 static void rebuild_pollv(void);
    141 static struct pollfd *pollv;
    142 
    143 #ifndef HAVE_POLLABLE_PROCFS
    144 
    145 static void proc_poll_open(void);
    146 static void proc_poller(int pfd);
    147 
    148 struct proc_pollfd {
    149 	int fd;
    150 	int revents;
    151 	int pid;
    152 };
    153 
    154 static int poller_pid;
    155 static int proc_poll_pipe[2] = { -1, -1 };
    156 
    157 #endif /* !HAVE_POLLABLE_PROCFS */
    158 
    159 #ifdef HAVE_MP_PROCFS
    160 #define POLLWANT	POLLWRNORM
    161 #else
    162 #define POLLWANT	POLLPRI
    163 #endif
    164 #endif /* USE_PROCFS */
    165 
    166 static void
    167 usage(ofp, exitval)
    168 FILE *ofp;
    169 int exitval;
    170 {
    171 	fprintf(ofp, "\
    172 usage: strace [-CdDffhiqrtttTvVxx] [-a column] [-e expr] ... [-o file]\n\
    173               [-p pid] ... [-s strsize] [-u username] [-E var=val] ...\n\
    174               [command [arg ...]]\n\
    175    or: strace -c [-D] [-e expr] ... [-O overhead] [-S sortby] [-E var=val] ...\n\
    176               [command [arg ...]]\n\
    177 -c -- count time, calls, and errors for each syscall and report summary\n\
    178 -C -- like -c but also print regular output while processes are running\n\
    179 -f -- follow forks, -ff -- with output into separate files\n\
    180 -F -- attempt to follow vforks, -h -- print help message\n\
    181 -i -- print instruction pointer at time of syscall\n\
    182 -q -- suppress messages about attaching, detaching, etc.\n\
    183 -r -- print relative timestamp, -t -- absolute timestamp, -tt -- with usecs\n\
    184 -T -- print time spent in each syscall, -V -- print version\n\
    185 -v -- verbose mode: print unabbreviated argv, stat, termio[s], etc. args\n\
    186 -x -- print non-ascii strings in hex, -xx -- print all strings in hex\n\
    187 -a column -- alignment COLUMN for printing syscall results (default %d)\n\
    188 -e expr -- a qualifying expression: option=[!]all or option=[!]val1[,val2]...\n\
    189    options: trace, abbrev, verbose, raw, signal, read, or write\n\
    190 -o file -- send trace output to FILE instead of stderr\n\
    191 -O overhead -- set overhead for tracing syscalls to OVERHEAD usecs\n\
    192 -p pid -- trace process with process id PID, may be repeated\n\
    193 -D -- run tracer process as a detached grandchild, not as parent\n\
    194 -s strsize -- limit length of print strings to STRSIZE chars (default %d)\n\
    195 -S sortby -- sort syscall counts by: time, calls, name, nothing (default %s)\n\
    196 -u username -- run command as username handling setuid and/or setgid\n\
    197 -E var=val -- put var=val in the environment for command\n\
    198 -E var -- remove var from the environment for command\n\
    199 " /* this is broken, so don't document it
    200 -z -- print only succeeding syscalls\n\
    201   */
    202 , DEFAULT_ACOLUMN, DEFAULT_STRLEN, DEFAULT_SORTBY);
    203 	exit(exitval);
    204 }
    205 
    206 #ifdef SVR4
    207 #ifdef MIPS
    208 void
    209 foobar()
    210 {
    211 }
    212 #endif /* MIPS */
    213 #endif /* SVR4 */
    214 
    215 /* Glue for systems without a MMU that cannot provide fork() */
    216 #ifdef HAVE_FORK
    217 # define strace_vforked 0
    218 #else
    219 # define strace_vforked 1
    220 # define fork()         vfork()
    221 #endif
    222 
    223 static int
    224 set_cloexec_flag(int fd)
    225 {
    226 	int     flags, newflags;
    227 
    228 	if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
    229 	{
    230 		fprintf(stderr, "%s: fcntl F_GETFD: %s\n",
    231 			progname, strerror(errno));
    232 		return -1;
    233 	}
    234 
    235 	newflags = flags | FD_CLOEXEC;
    236 	if (flags == newflags)
    237 		return 0;
    238 
    239 	if (fcntl(fd, F_SETFD, newflags) < 0)
    240 	{
    241 		fprintf(stderr, "%s: fcntl F_SETFD: %s\n",
    242 			progname, strerror(errno));
    243 		return -1;
    244 	}
    245 
    246 	return 0;
    247 }
    248 
    249 /*
    250  * When strace is setuid executable, we have to swap uids
    251  * before and after filesystem and process management operations.
    252  */
    253 static void
    254 swap_uid(void)
    255 {
    256 #ifndef SVR4
    257 	int euid = geteuid(), uid = getuid();
    258 
    259 	if (euid != uid && setreuid(euid, uid) < 0)
    260 	{
    261 		fprintf(stderr, "%s: setreuid: %s\n",
    262 			progname, strerror(errno));
    263 		exit(1);
    264 	}
    265 #endif
    266 }
    267 
    268 #if _LFS64_LARGEFILE
    269 # define fopen_for_output fopen64
    270 #else
    271 # define fopen_for_output fopen
    272 #endif
    273 
    274 static FILE *
    275 strace_fopen(const char *path, const char *mode)
    276 {
    277 	FILE *fp;
    278 
    279 	swap_uid();
    280 	if ((fp = fopen_for_output(path, mode)) == NULL)
    281 		fprintf(stderr, "%s: can't fopen '%s': %s\n",
    282 			progname, path, strerror(errno));
    283 	swap_uid();
    284 	if (fp && set_cloexec_flag(fileno(fp)) < 0)
    285 	{
    286 		fclose(fp);
    287 		fp = NULL;
    288 	}
    289 	return fp;
    290 }
    291 
    292 static int popen_pid = -1;
    293 
    294 #ifndef _PATH_BSHELL
    295 # define _PATH_BSHELL "/bin/sh"
    296 #endif
    297 
    298 /*
    299  * We cannot use standard popen(3) here because we have to distinguish
    300  * popen child process from other processes we trace, and standard popen(3)
    301  * does not export its child's pid.
    302  */
    303 static FILE *
    304 strace_popen(const char *command)
    305 {
    306 	int     fds[2];
    307 
    308 	swap_uid();
    309 	if (pipe(fds) < 0)
    310 	{
    311 		fprintf(stderr, "%s: pipe: %s\n",
    312 			progname, strerror(errno));
    313 		swap_uid();
    314 		return NULL;
    315 	}
    316 
    317 	if (set_cloexec_flag(fds[1]) < 0)
    318 	{
    319 		close(fds[0]);
    320 		close(fds[1]);
    321 		swap_uid();
    322 		return NULL;
    323 	}
    324 
    325 	if ((popen_pid = fork()) == -1)
    326 	{
    327 		fprintf(stderr, "%s: fork: %s\n",
    328 			progname, strerror(errno));
    329 		close(fds[0]);
    330 		close(fds[1]);
    331 		swap_uid();
    332 		return NULL;
    333 	}
    334 
    335 	if (popen_pid)
    336 	{
    337 		/* parent */
    338 		close(fds[0]);
    339 		swap_uid();
    340 		return fdopen(fds[1], "w");
    341 	} else
    342 	{
    343 		/* child */
    344 		close(fds[1]);
    345 		if (fds[0] && (dup2(fds[0], 0) || close(fds[0])))
    346 		{
    347 			fprintf(stderr, "%s: dup2: %s\n",
    348 				progname, strerror(errno));
    349 			_exit(1);
    350 		}
    351 		execl(_PATH_BSHELL, "sh", "-c", command, NULL);
    352 		fprintf(stderr, "%s: execl: %s: %s\n",
    353 			progname, _PATH_BSHELL, strerror(errno));
    354 		_exit(1);
    355 	}
    356 }
    357 
    358 static int
    359 newoutf(struct tcb *tcp)
    360 {
    361 	if (outfname && followfork > 1) {
    362 		char name[520 + sizeof(int) * 3];
    363 		FILE *fp;
    364 
    365 		sprintf(name, "%.512s.%u", outfname, tcp->pid);
    366 		if ((fp = strace_fopen(name, "w")) == NULL)
    367 			return -1;
    368 		tcp->outf = fp;
    369 	}
    370 	return 0;
    371 }
    372 
    373 static void
    374 startup_attach(void)
    375 {
    376 	int tcbi;
    377 	struct tcb *tcp;
    378 
    379 	/*
    380 	 * Block user interruptions as we would leave the traced
    381 	 * process stopped (process state T) if we would terminate in
    382 	 * between PTRACE_ATTACH and wait4 () on SIGSTOP.
    383 	 * We rely on cleanup () from this point on.
    384 	 */
    385 	if (interactive)
    386 		sigprocmask(SIG_BLOCK, &blocked_set, NULL);
    387 
    388 	if (daemonized_tracer) {
    389 		pid_t pid = fork();
    390 		if (pid < 0) {
    391 			_exit(1);
    392 		}
    393 		if (pid) { /* parent */
    394 			/*
    395 			 * Wait for child to attach to straced process
    396 			 * (our parent). Child SIGKILLs us after it attached.
    397 			 * Parent's wait() is unblocked by our death,
    398 			 * it proceeds to exec the straced program.
    399 			 */
    400 			pause();
    401 			_exit(0); /* paranoia */
    402 		}
    403 	}
    404 
    405 	for (tcbi = 0; tcbi < tcbtabsize; tcbi++) {
    406 		tcp = tcbtab[tcbi];
    407 		if (!(tcp->flags & TCB_INUSE) || !(tcp->flags & TCB_ATTACHED))
    408 			continue;
    409 #ifdef LINUX
    410 		if (tcp->flags & TCB_CLONE_THREAD)
    411 			continue;
    412 #endif
    413 		/* Reinitialize the output since it may have changed. */
    414 		tcp->outf = outf;
    415 		if (newoutf(tcp) < 0)
    416 			exit(1);
    417 
    418 #ifdef USE_PROCFS
    419 		if (proc_open(tcp, 1) < 0) {
    420 			fprintf(stderr, "trouble opening proc file\n");
    421 			droptcb(tcp);
    422 			continue;
    423 		}
    424 #else /* !USE_PROCFS */
    425 # ifdef LINUX
    426 		if (followfork && !daemonized_tracer) {
    427 			char procdir[sizeof("/proc/%d/task") + sizeof(int) * 3];
    428 			DIR *dir;
    429 
    430 			sprintf(procdir, "/proc/%d/task", tcp->pid);
    431 			dir = opendir(procdir);
    432 			if (dir != NULL) {
    433 				unsigned int ntid = 0, nerr = 0;
    434 				struct dirent *de;
    435 				int tid;
    436 				while ((de = readdir(dir)) != NULL) {
    437 					if (de->d_fileno == 0)
    438 						continue;
    439 					tid = atoi(de->d_name);
    440 					if (tid <= 0)
    441 						continue;
    442 					++ntid;
    443 					if (ptrace(PTRACE_ATTACH, tid, (char *) 1, 0) < 0)
    444 						++nerr;
    445 					else if (tid != tcbtab[tcbi]->pid) {
    446 						tcp = alloctcb(tid);
    447 						tcp->flags |= TCB_ATTACHED|TCB_CLONE_THREAD|TCB_FOLLOWFORK;
    448 						tcbtab[tcbi]->nchildren++;
    449 						tcbtab[tcbi]->nclone_threads++;
    450 						tcp->parent = tcbtab[tcbi];
    451 					}
    452 					if (interactive) {
    453 						sigprocmask(SIG_SETMASK, &empty_set, NULL);
    454 						if (interrupted)
    455 							return;
    456 						sigprocmask(SIG_BLOCK, &blocked_set, NULL);
    457 					}
    458 				}
    459 				closedir(dir);
    460 				ntid -= nerr;
    461 				if (ntid == 0) {
    462 					perror("attach: ptrace(PTRACE_ATTACH, ...)");
    463 					droptcb(tcp);
    464 					continue;
    465 				}
    466 				if (!qflag) {
    467 					fprintf(stderr, ntid > 1
    468 ? "Process %u attached with %u threads - interrupt to quit\n"
    469 : "Process %u attached - interrupt to quit\n",
    470 						tcbtab[tcbi]->pid, ntid);
    471 				}
    472 				continue;
    473 			} /* if (opendir worked) */
    474 		} /* if (-f) */
    475 # endif
    476 		if (ptrace(PTRACE_ATTACH, tcp->pid, (char *) 1, 0) < 0) {
    477 			perror("attach: ptrace(PTRACE_ATTACH, ...)");
    478 			droptcb(tcp);
    479 			continue;
    480 		}
    481 		/* INTERRUPTED is going to be checked at the top of TRACE.  */
    482 
    483 		if (daemonized_tracer) {
    484 			/*
    485 			 * It is our grandparent we trace, not a -p PID.
    486 			 * Don't want to just detach on exit, so...
    487 			 */
    488 			tcp->flags &= ~TCB_ATTACHED;
    489 			/*
    490 			 * Make parent go away.
    491 			 * Also makes grandparent's wait() unblock.
    492 			 */
    493 			kill(getppid(), SIGKILL);
    494 		}
    495 
    496 #endif /* !USE_PROCFS */
    497 		if (!qflag)
    498 			fprintf(stderr,
    499 				"Process %u attached - interrupt to quit\n",
    500 				tcp->pid);
    501 	}
    502 
    503 	if (interactive)
    504 		sigprocmask(SIG_SETMASK, &empty_set, NULL);
    505 }
    506 
    507 static void
    508 startup_child (char **argv)
    509 {
    510 	struct stat statbuf;
    511 	const char *filename;
    512 	char pathname[MAXPATHLEN];
    513 	int pid = 0;
    514 	struct tcb *tcp;
    515 
    516 	filename = argv[0];
    517 	if (strchr(filename, '/')) {
    518 		if (strlen(filename) > sizeof pathname - 1) {
    519 			errno = ENAMETOOLONG;
    520 			perror("strace: exec");
    521 			exit(1);
    522 		}
    523 		strcpy(pathname, filename);
    524 	}
    525 #ifdef USE_DEBUGGING_EXEC
    526 	/*
    527 	 * Debuggers customarily check the current directory
    528 	 * first regardless of the path but doing that gives
    529 	 * security geeks a panic attack.
    530 	 */
    531 	else if (stat(filename, &statbuf) == 0)
    532 		strcpy(pathname, filename);
    533 #endif /* USE_DEBUGGING_EXEC */
    534 	else {
    535 		const char *path;
    536 		int m, n, len;
    537 
    538 		for (path = getenv("PATH"); path && *path; path += m) {
    539 			if (strchr(path, ':')) {
    540 				n = strchr(path, ':') - path;
    541 				m = n + 1;
    542 			}
    543 			else
    544 				m = n = strlen(path);
    545 			if (n == 0) {
    546 				if (!getcwd(pathname, MAXPATHLEN))
    547 					continue;
    548 				len = strlen(pathname);
    549 			}
    550 			else if (n > sizeof pathname - 1)
    551 				continue;
    552 			else {
    553 				strncpy(pathname, path, n);
    554 				len = n;
    555 			}
    556 			if (len && pathname[len - 1] != '/')
    557 				pathname[len++] = '/';
    558 			strcpy(pathname + len, filename);
    559 			if (stat(pathname, &statbuf) == 0 &&
    560 			    /* Accept only regular files
    561 			       with some execute bits set.
    562 			       XXX not perfect, might still fail */
    563 			    S_ISREG(statbuf.st_mode) &&
    564 			    (statbuf.st_mode & 0111))
    565 				break;
    566 		}
    567 	}
    568 	if (stat(pathname, &statbuf) < 0) {
    569 		fprintf(stderr, "%s: %s: command not found\n",
    570 			progname, filename);
    571 		exit(1);
    572 	}
    573 	strace_child = pid = fork();
    574 	if (pid < 0) {
    575 		perror("strace: fork");
    576 		cleanup();
    577 		exit(1);
    578 	}
    579 	if ((pid != 0 && daemonized_tracer) /* parent: to become a traced process */
    580 	 || (pid == 0 && !daemonized_tracer) /* child: to become a traced process */
    581 	) {
    582 		pid = getpid();
    583 #ifdef USE_PROCFS
    584 		if (outf != stderr) close (fileno (outf));
    585 #ifdef MIPS
    586 		/* Kludge for SGI, see proc_open for details. */
    587 		sa.sa_handler = foobar;
    588 		sa.sa_flags = 0;
    589 		sigemptyset(&sa.sa_mask);
    590 		sigaction(SIGINT, &sa, NULL);
    591 #endif /* MIPS */
    592 #ifndef FREEBSD
    593 		pause();
    594 #else /* FREEBSD */
    595 		kill(pid, SIGSTOP); /* stop HERE */
    596 #endif /* FREEBSD */
    597 #else /* !USE_PROCFS */
    598 		if (outf!=stderr)
    599 			close(fileno (outf));
    600 
    601 		if (!daemonized_tracer) {
    602 			if (ptrace(PTRACE_TRACEME, 0, (char *) 1, 0) < 0) {
    603 				perror("strace: ptrace(PTRACE_TRACEME, ...)");
    604 				exit(1);
    605 			}
    606 			if (debug)
    607 				kill(pid, SIGSTOP);
    608 		}
    609 
    610 		if (username != NULL || geteuid() == 0) {
    611 			uid_t run_euid = run_uid;
    612 			gid_t run_egid = run_gid;
    613 
    614 			if (statbuf.st_mode & S_ISUID)
    615 				run_euid = statbuf.st_uid;
    616 			if (statbuf.st_mode & S_ISGID)
    617 				run_egid = statbuf.st_gid;
    618 
    619 			/*
    620 			 * It is important to set groups before we
    621 			 * lose privileges on setuid.
    622 			 */
    623 			if (username != NULL) {
    624 				if (initgroups(username, run_gid) < 0) {
    625 					perror("initgroups");
    626 					exit(1);
    627 				}
    628 				if (setregid(run_gid, run_egid) < 0) {
    629 					perror("setregid");
    630 					exit(1);
    631 				}
    632 				if (setreuid(run_uid, run_euid) < 0) {
    633 					perror("setreuid");
    634 					exit(1);
    635 				}
    636 			}
    637 		}
    638 		else
    639 			setreuid(run_uid, run_uid);
    640 
    641 		if (!daemonized_tracer) {
    642 			/*
    643 			 * Induce an immediate stop so that the parent
    644 			 * will resume us with PTRACE_SYSCALL and display
    645 			 * this execve call normally.
    646 			 * Unless of course we're on a no-MMU system where
    647 			 * we vfork()-ed, so we cannot stop the child.
    648 			 */
    649 			if (!strace_vforked)
    650 				kill(getpid(), SIGSTOP);
    651 		} else {
    652 			struct sigaction sv_sigchld;
    653 			sigaction(SIGCHLD, NULL, &sv_sigchld);
    654 			/*
    655 			 * Make sure it is not SIG_IGN, otherwise wait
    656 			 * will not block.
    657 			 */
    658 			signal(SIGCHLD, SIG_DFL);
    659 			/*
    660 			 * Wait for grandchild to attach to us.
    661 			 * It kills child after that, and wait() unblocks.
    662 			 */
    663 			alarm(3);
    664 			wait(NULL);
    665 			alarm(0);
    666 			sigaction(SIGCHLD, &sv_sigchld, NULL);
    667 		}
    668 #endif /* !USE_PROCFS */
    669 
    670 		execv(pathname, argv);
    671 		perror("strace: exec");
    672 		_exit(1);
    673 	}
    674 
    675 	/* We are the tracer.  */
    676 	tcp = alloctcb(daemonized_tracer ? getppid() : pid);
    677 	if (daemonized_tracer) {
    678 		/* We want subsequent startup_attach() to attach to it.  */
    679 		tcp->flags |= TCB_ATTACHED;
    680 	}
    681 #ifdef USE_PROCFS
    682 	if (proc_open(tcp, 0) < 0) {
    683 		fprintf(stderr, "trouble opening proc file\n");
    684 		cleanup();
    685 		exit(1);
    686 	}
    687 #endif /* USE_PROCFS */
    688 }
    689 
    690 #ifdef LINUX
    691 /*
    692  * Test whether the kernel support PTRACE_O_TRACECLONE et al options.
    693  * First fork a new child, call ptrace with PTRACE_SETOPTIONS on it,
    694  * and then see which options are supported by the kernel.
    695  */
    696 static int
    697 test_ptrace_setoptions(void)
    698 {
    699 	int pid, expected_grandchild = 0, found_grandchild = 0;
    700 	const unsigned int test_options = PTRACE_O_TRACECLONE |
    701 					  PTRACE_O_TRACEFORK |
    702 					  PTRACE_O_TRACEVFORK;
    703 
    704 	if ((pid = fork()) < 0)
    705 		return -1;
    706 	else if (pid == 0) {
    707 		if (ptrace(PTRACE_TRACEME, 0, (char *)1, 0) < 0)
    708 			_exit(1);
    709 		kill(getpid(), SIGSTOP);
    710 		_exit(fork() < 0);
    711 	}
    712 
    713 	while (1) {
    714 		int status, tracee_pid;
    715 
    716 		tracee_pid = wait(&status);
    717 		if (tracee_pid == -1) {
    718 			if (errno == EINTR)
    719 				continue;
    720 			else if (errno == ECHILD)
    721 				break;
    722 			perror("test_ptrace_setoptions");
    723 			return -1;
    724 		}
    725 		if (tracee_pid != pid) {
    726 			found_grandchild = tracee_pid;
    727 			if (ptrace(PTRACE_CONT, tracee_pid, 0, 0) < 0 &&
    728 			    errno != ESRCH)
    729 				kill(tracee_pid, SIGKILL);
    730 		}
    731 		else if (WIFSTOPPED(status)) {
    732 			switch (WSTOPSIG(status)) {
    733 			case SIGSTOP:
    734 				if (ptrace(PTRACE_SETOPTIONS, pid,
    735 					   NULL, test_options) < 0) {
    736 					kill(pid, SIGKILL);
    737 					return -1;
    738 				}
    739 				break;
    740 			case SIGTRAP:
    741 				if (status >> 16 == PTRACE_EVENT_FORK) {
    742 					long msg = 0;
    743 
    744 					if (ptrace(PTRACE_GETEVENTMSG, pid,
    745 						   NULL, (long) &msg) == 0)
    746 						expected_grandchild = msg;
    747 				}
    748 				break;
    749 			}
    750 			if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0 &&
    751 			    errno != ESRCH)
    752 				kill(pid, SIGKILL);
    753 		}
    754 	}
    755 	if (expected_grandchild && expected_grandchild == found_grandchild)
    756 		ptrace_setoptions |= test_options;
    757 	return 0;
    758 }
    759 #endif
    760 
    761 int
    762 main(int argc, char *argv[])
    763 {
    764 	struct tcb *tcp;
    765 	int c, pid = 0;
    766 	int optF = 0;
    767 	struct sigaction sa;
    768 
    769 	static char buf[BUFSIZ];
    770 
    771 	progname = argv[0] ? argv[0] : "strace";
    772 
    773 	/* Allocate the initial tcbtab.  */
    774 	tcbtabsize = argc;	/* Surely enough for all -p args.  */
    775 	if ((tcbtab = calloc(tcbtabsize, sizeof tcbtab[0])) == NULL) {
    776 		fprintf(stderr, "%s: out of memory\n", progname);
    777 		exit(1);
    778 	}
    779 	if ((tcbtab[0] = calloc(tcbtabsize, sizeof tcbtab[0][0])) == NULL) {
    780 		fprintf(stderr, "%s: out of memory\n", progname);
    781 		exit(1);
    782 	}
    783 	for (tcp = tcbtab[0]; tcp < &tcbtab[0][tcbtabsize]; ++tcp)
    784 		tcbtab[tcp - tcbtab[0]] = &tcbtab[0][tcp - tcbtab[0]];
    785 
    786 	outf = stderr;
    787 	interactive = 1;
    788 	set_sortby(DEFAULT_SORTBY);
    789 	set_personality(DEFAULT_PERSONALITY);
    790 	qualify("trace=all");
    791 	qualify("abbrev=all");
    792 	qualify("verbose=all");
    793 	qualify("signal=all");
    794 	while ((c = getopt(argc, argv,
    795 		"+cCdfFhiqrtTvVxz"
    796 #ifndef USE_PROCFS
    797 		"D"
    798 #endif
    799 		"a:e:o:O:p:s:S:u:E:")) != EOF) {
    800 		switch (c) {
    801 		case 'c':
    802 			if (cflag == CFLAG_BOTH) {
    803 				fprintf(stderr, "%s: -c and -C are mutually exclusive options\n",
    804 					progname);
    805 				exit(1);
    806 			}
    807 			cflag = CFLAG_ONLY_STATS;
    808 			break;
    809 		case 'C':
    810 			if (cflag == CFLAG_ONLY_STATS) {
    811 				fprintf(stderr, "%s: -c and -C are mutually exclusive options\n",
    812 					progname);
    813 				exit(1);
    814 			}
    815 			cflag = CFLAG_BOTH;
    816 			break;
    817 		case 'd':
    818 			debug++;
    819 			break;
    820 #ifndef USE_PROCFS
    821 		case 'D':
    822 			daemonized_tracer = 1;
    823 			break;
    824 #endif
    825 		case 'F':
    826 			optF = 1;
    827 			break;
    828 		case 'f':
    829 			followfork++;
    830 			break;
    831 		case 'h':
    832 			usage(stdout, 0);
    833 			break;
    834 		case 'i':
    835 			iflag++;
    836 			break;
    837 		case 'q':
    838 			qflag++;
    839 			break;
    840 		case 'r':
    841 			rflag++;
    842 			tflag++;
    843 			break;
    844 		case 't':
    845 			tflag++;
    846 			break;
    847 		case 'T':
    848 			dtime++;
    849 			break;
    850 		case 'x':
    851 			xflag++;
    852 			break;
    853 		case 'v':
    854 			qualify("abbrev=none");
    855 			break;
    856 		case 'V':
    857 			printf("%s -- version %s\n", PACKAGE_NAME, VERSION);
    858 			exit(0);
    859 			break;
    860 		case 'z':
    861 			not_failing_only = 1;
    862 			break;
    863 		case 'a':
    864 			acolumn = atoi(optarg);
    865 			break;
    866 		case 'e':
    867 			qualify(optarg);
    868 			break;
    869 		case 'o':
    870 			outfname = strdup(optarg);
    871 			break;
    872 		case 'O':
    873 			set_overhead(atoi(optarg));
    874 			break;
    875 		case 'p':
    876 			if ((pid = atoi(optarg)) <= 0) {
    877 				fprintf(stderr, "%s: Invalid process id: %s\n",
    878 					progname, optarg);
    879 				break;
    880 			}
    881 			if (pid == getpid()) {
    882 				fprintf(stderr, "%s: I'm sorry, I can't let you do that, Dave.\n", progname);
    883 				break;
    884 			}
    885 			tcp = alloc_tcb(pid, 0);
    886 			tcp->flags |= TCB_ATTACHED;
    887 			pflag_seen++;
    888 			break;
    889 		case 's':
    890 			max_strlen = atoi(optarg);
    891 			if (max_strlen < 0) {
    892 				fprintf(stderr,
    893 					"%s: invalid -s argument: %s\n",
    894 					progname, optarg);
    895 				exit(1);
    896 			}
    897 			break;
    898 		case 'S':
    899 			set_sortby(optarg);
    900 			break;
    901 		case 'u':
    902 			username = strdup(optarg);
    903 			break;
    904 		case 'E':
    905 			if (putenv(optarg) < 0) {
    906 				fprintf(stderr, "%s: out of memory\n",
    907 					progname);
    908 				exit(1);
    909 			}
    910 			break;
    911 		default:
    912 			usage(stderr, 1);
    913 			break;
    914 		}
    915 	}
    916 
    917 	if ((optind == argc) == !pflag_seen)
    918 		usage(stderr, 1);
    919 
    920 	if (pflag_seen && daemonized_tracer) {
    921 		fprintf(stderr,
    922 			"%s: -D and -p are mutually exclusive options\n",
    923 			progname);
    924 		exit(1);
    925 	}
    926 
    927 	if (!followfork)
    928 		followfork = optF;
    929 
    930 	if (followfork > 1 && cflag) {
    931 		fprintf(stderr,
    932 			"%s: (-c or -C) and -ff are mutually exclusive options\n",
    933 			progname);
    934 		exit(1);
    935 	}
    936 
    937 	/* See if they want to run as another user. */
    938 	if (username != NULL) {
    939 		struct passwd *pent;
    940 
    941 		if (getuid() != 0 || geteuid() != 0) {
    942 			fprintf(stderr,
    943 				"%s: you must be root to use the -u option\n",
    944 				progname);
    945 			exit(1);
    946 		}
    947 		if ((pent = getpwnam(username)) == NULL) {
    948 			fprintf(stderr, "%s: cannot find user `%s'\n",
    949 				progname, username);
    950 			exit(1);
    951 		}
    952 		run_uid = pent->pw_uid;
    953 		run_gid = pent->pw_gid;
    954 	}
    955 	else {
    956 		run_uid = getuid();
    957 		run_gid = getgid();
    958 	}
    959 
    960 #ifdef LINUX
    961 	if (followfork) {
    962 		if (test_ptrace_setoptions() < 0) {
    963 			fprintf(stderr,
    964 				"Test for options supported by PTRACE_SETOPTIONS "
    965 				"failed, giving up using this feature.\n");
    966 			ptrace_setoptions = 0;
    967 		}
    968 		if (debug)
    969 			fprintf(stderr, "ptrace_setoptions = %#x\n",
    970 				ptrace_setoptions);
    971 	}
    972 #endif
    973 
    974 	/* Check if they want to redirect the output. */
    975 	if (outfname) {
    976 		/* See if they want to pipe the output. */
    977 		if (outfname[0] == '|' || outfname[0] == '!') {
    978 			/*
    979 			 * We can't do the <outfname>.PID funny business
    980 			 * when using popen, so prohibit it.
    981 			 */
    982 			if (followfork > 1) {
    983 				fprintf(stderr, "\
    984 %s: piping the output and -ff are mutually exclusive options\n",
    985 					progname);
    986 				exit(1);
    987 			}
    988 
    989 			if ((outf = strace_popen(outfname + 1)) == NULL)
    990 				exit(1);
    991 		}
    992 		else if (followfork <= 1 &&
    993 			 (outf = strace_fopen(outfname, "w")) == NULL)
    994 			exit(1);
    995 	}
    996 
    997 	if (!outfname || outfname[0] == '|' || outfname[0] == '!')
    998 		setvbuf(outf, buf, _IOLBF, BUFSIZ);
    999 	if (outfname && optind < argc) {
   1000 		interactive = 0;
   1001 		qflag = 1;
   1002 	}
   1003 
   1004 	/* Valid states here:
   1005 	   optind < argc	pflag_seen	outfname	interactive
   1006 	   1			0		0		1
   1007 	   0			1		0		1
   1008 	   1			0		1		0
   1009 	   0			1		1		1
   1010 	 */
   1011 
   1012 	/* STARTUP_CHILD must be called before the signal handlers get
   1013 	   installed below as they are inherited into the spawned process.
   1014 	   Also we do not need to be protected by them as during interruption
   1015 	   in the STARTUP_CHILD mode we kill the spawned process anyway.  */
   1016 	if (!pflag_seen)
   1017 		startup_child(&argv[optind]);
   1018 
   1019 	sigemptyset(&empty_set);
   1020 	sigemptyset(&blocked_set);
   1021 	sa.sa_handler = SIG_IGN;
   1022 	sigemptyset(&sa.sa_mask);
   1023 	sa.sa_flags = 0;
   1024 	sigaction(SIGTTOU, &sa, NULL);
   1025 	sigaction(SIGTTIN, &sa, NULL);
   1026 	if (interactive) {
   1027 		sigaddset(&blocked_set, SIGHUP);
   1028 		sigaddset(&blocked_set, SIGINT);
   1029 		sigaddset(&blocked_set, SIGQUIT);
   1030 		sigaddset(&blocked_set, SIGPIPE);
   1031 		sigaddset(&blocked_set, SIGTERM);
   1032 		sa.sa_handler = interrupt;
   1033 #ifdef SUNOS4
   1034 		/* POSIX signals on sunos4.1 are a little broken. */
   1035 		sa.sa_flags = SA_INTERRUPT;
   1036 #endif /* SUNOS4 */
   1037 	}
   1038 	sigaction(SIGHUP, &sa, NULL);
   1039 	sigaction(SIGINT, &sa, NULL);
   1040 	sigaction(SIGQUIT, &sa, NULL);
   1041 	sigaction(SIGPIPE, &sa, NULL);
   1042 	sigaction(SIGTERM, &sa, NULL);
   1043 #ifdef USE_PROCFS
   1044 	sa.sa_handler = reaper;
   1045 	sigaction(SIGCHLD, &sa, NULL);
   1046 #else
   1047 	/* Make sure SIGCHLD has the default action so that waitpid
   1048 	   definitely works without losing track of children.  The user
   1049 	   should not have given us a bogus state to inherit, but he might
   1050 	   have.  Arguably we should detect SIG_IGN here and pass it on
   1051 	   to children, but probably noone really needs that.  */
   1052 	sa.sa_handler = SIG_DFL;
   1053 	sigaction(SIGCHLD, &sa, NULL);
   1054 #endif /* USE_PROCFS */
   1055 
   1056 	if (pflag_seen || daemonized_tracer)
   1057 		startup_attach();
   1058 
   1059 	if (trace() < 0)
   1060 		exit(1);
   1061 	cleanup();
   1062 	fflush(NULL);
   1063 	if (exit_code > 0xff) {
   1064 		/* Child was killed by a signal, mimic that.  */
   1065 		exit_code &= 0xff;
   1066 		signal(exit_code, SIG_DFL);
   1067 		raise(exit_code);
   1068 		/* Paranoia - what if this signal is not fatal?
   1069 		   Exit with 128 + signo then.  */
   1070 		exit_code += 128;
   1071 	}
   1072 	exit(exit_code);
   1073 }
   1074 
   1075 void
   1076 expand_tcbtab(void)
   1077 {
   1078 	/* Allocate some more TCBs and expand the table.
   1079 	   We don't want to relocate the TCBs because our
   1080 	   callers have pointers and it would be a pain.
   1081 	   So tcbtab is a table of pointers.  Since we never
   1082 	   free the TCBs, we allocate a single chunk of many.  */
   1083 	struct tcb **newtab = (struct tcb **)
   1084 		realloc(tcbtab, 2 * tcbtabsize * sizeof tcbtab[0]);
   1085 	struct tcb *newtcbs = (struct tcb *) calloc(tcbtabsize,
   1086 						    sizeof *newtcbs);
   1087 	int i;
   1088 	if (newtab == NULL || newtcbs == NULL) {
   1089 		fprintf(stderr, "%s: expand_tcbtab: out of memory\n",
   1090 			progname);
   1091 		cleanup();
   1092 		exit(1);
   1093 	}
   1094 	for (i = tcbtabsize; i < 2 * tcbtabsize; ++i)
   1095 		newtab[i] = &newtcbs[i - tcbtabsize];
   1096 	tcbtabsize *= 2;
   1097 	tcbtab = newtab;
   1098 }
   1099 
   1100 struct tcb *
   1101 alloc_tcb(int pid, int command_options_parsed)
   1102 {
   1103 	int i;
   1104 	struct tcb *tcp;
   1105 
   1106 	if (nprocs == tcbtabsize)
   1107 		expand_tcbtab();
   1108 
   1109 	for (i = 0; i < tcbtabsize; i++) {
   1110 		tcp = tcbtab[i];
   1111 		if ((tcp->flags & TCB_INUSE) == 0) {
   1112 			tcp->pid = pid;
   1113 			tcp->parent = NULL;
   1114 			tcp->nchildren = 0;
   1115 			tcp->nzombies = 0;
   1116 #ifdef TCB_CLONE_THREAD
   1117 			tcp->nclone_threads = 0;
   1118 			tcp->nclone_waiting = 0;
   1119 #endif
   1120 			tcp->flags = TCB_INUSE | TCB_STARTUP;
   1121 			tcp->outf = outf; /* Initialise to current out file */
   1122 			tcp->curcol = 0;
   1123 			tcp->stime.tv_sec = 0;
   1124 			tcp->stime.tv_usec = 0;
   1125 			tcp->pfd = -1;
   1126 			nprocs++;
   1127 			if (command_options_parsed)
   1128 				newoutf(tcp);
   1129 			return tcp;
   1130 		}
   1131 	}
   1132 	fprintf(stderr, "%s: bug in alloc_tcb\n", progname);
   1133 	cleanup();
   1134 	exit(1);
   1135 }
   1136 
   1137 #ifdef USE_PROCFS
   1138 int
   1139 proc_open(struct tcb *tcp, int attaching)
   1140 {
   1141 	char proc[32];
   1142 	long arg;
   1143 #ifdef SVR4
   1144 	int i;
   1145 	sysset_t syscalls;
   1146 	sigset_t signals;
   1147 	fltset_t faults;
   1148 #endif
   1149 #ifndef HAVE_POLLABLE_PROCFS
   1150 	static int last_pfd;
   1151 #endif
   1152 
   1153 #ifdef HAVE_MP_PROCFS
   1154 	/* Open the process pseudo-files in /proc. */
   1155 	sprintf(proc, "/proc/%d/ctl", tcp->pid);
   1156 	if ((tcp->pfd = open(proc, O_WRONLY|O_EXCL)) < 0) {
   1157 		perror("strace: open(\"/proc/...\", ...)");
   1158 		return -1;
   1159 	}
   1160 	if (set_cloexec_flag(tcp->pfd) < 0) {
   1161 		return -1;
   1162 	}
   1163 	sprintf(proc, "/proc/%d/status", tcp->pid);
   1164 	if ((tcp->pfd_stat = open(proc, O_RDONLY|O_EXCL)) < 0) {
   1165 		perror("strace: open(\"/proc/...\", ...)");
   1166 		return -1;
   1167 	}
   1168 	if (set_cloexec_flag(tcp->pfd_stat) < 0) {
   1169 		return -1;
   1170 	}
   1171 	sprintf(proc, "/proc/%d/as", tcp->pid);
   1172 	if ((tcp->pfd_as = open(proc, O_RDONLY|O_EXCL)) < 0) {
   1173 		perror("strace: open(\"/proc/...\", ...)");
   1174 		return -1;
   1175 	}
   1176 	if (set_cloexec_flag(tcp->pfd_as) < 0) {
   1177 		return -1;
   1178 	}
   1179 #else
   1180 	/* Open the process pseudo-file in /proc. */
   1181 #ifndef FREEBSD
   1182 	sprintf(proc, "/proc/%d", tcp->pid);
   1183 	tcp->pfd = open(proc, O_RDWR|O_EXCL);
   1184 #else /* FREEBSD */
   1185 	sprintf(proc, "/proc/%d/mem", tcp->pid);
   1186 	tcp->pfd = open(proc, O_RDWR);
   1187 #endif /* FREEBSD */
   1188 	if (tcp->pfd < 0) {
   1189 		perror("strace: open(\"/proc/...\", ...)");
   1190 		return -1;
   1191 	}
   1192 	if (set_cloexec_flag(tcp->pfd) < 0) {
   1193 		return -1;
   1194 	}
   1195 #endif
   1196 #ifdef FREEBSD
   1197 	sprintf(proc, "/proc/%d/regs", tcp->pid);
   1198 	if ((tcp->pfd_reg = open(proc, O_RDONLY)) < 0) {
   1199 		perror("strace: open(\"/proc/.../regs\", ...)");
   1200 		return -1;
   1201 	}
   1202 	if (cflag) {
   1203 		sprintf(proc, "/proc/%d/status", tcp->pid);
   1204 		if ((tcp->pfd_status = open(proc, O_RDONLY)) < 0) {
   1205 			perror("strace: open(\"/proc/.../status\", ...)");
   1206 			return -1;
   1207 		}
   1208 	} else
   1209 		tcp->pfd_status = -1;
   1210 #endif /* FREEBSD */
   1211 	rebuild_pollv();
   1212 	if (!attaching) {
   1213 		/*
   1214 		 * Wait for the child to pause.  Because of a race
   1215 		 * condition we have to poll for the event.
   1216 		 */
   1217 		for (;;) {
   1218 			if (IOCTL_STATUS (tcp) < 0) {
   1219 				perror("strace: PIOCSTATUS");
   1220 				return -1;
   1221 			}
   1222 			if (tcp->status.PR_FLAGS & PR_ASLEEP)
   1223 			    break;
   1224 		}
   1225 	}
   1226 #ifndef FREEBSD
   1227 	/* Stop the process so that we own the stop. */
   1228 	if (IOCTL(tcp->pfd, PIOCSTOP, (char *)NULL) < 0) {
   1229 		perror("strace: PIOCSTOP");
   1230 		return -1;
   1231 	}
   1232 #endif
   1233 #ifdef PIOCSET
   1234 	/* Set Run-on-Last-Close. */
   1235 	arg = PR_RLC;
   1236 	if (IOCTL(tcp->pfd, PIOCSET, &arg) < 0) {
   1237 		perror("PIOCSET PR_RLC");
   1238 		return -1;
   1239 	}
   1240 	/* Set or Reset Inherit-on-Fork. */
   1241 	arg = PR_FORK;
   1242 	if (IOCTL(tcp->pfd, followfork ? PIOCSET : PIOCRESET, &arg) < 0) {
   1243 		perror("PIOC{SET,RESET} PR_FORK");
   1244 		return -1;
   1245 	}
   1246 #else  /* !PIOCSET */
   1247 #ifndef FREEBSD
   1248 	if (ioctl(tcp->pfd, PIOCSRLC) < 0) {
   1249 		perror("PIOCSRLC");
   1250 		return -1;
   1251 	}
   1252 	if (ioctl(tcp->pfd, followfork ? PIOCSFORK : PIOCRFORK) < 0) {
   1253 		perror("PIOC{S,R}FORK");
   1254 		return -1;
   1255 	}
   1256 #else /* FREEBSD */
   1257 	/* just unset the PF_LINGER flag for the Run-on-Last-Close. */
   1258 	if (ioctl(tcp->pfd, PIOCGFL, &arg) < 0) {
   1259 	        perror("PIOCGFL");
   1260 		return -1;
   1261 	}
   1262 	arg &= ~PF_LINGER;
   1263 	if (ioctl(tcp->pfd, PIOCSFL, arg) < 0) {
   1264 		perror("PIOCSFL");
   1265 		return -1;
   1266 	}
   1267 #endif /* FREEBSD */
   1268 #endif /* !PIOCSET */
   1269 #ifndef FREEBSD
   1270 	/* Enable all syscall entries we care about. */
   1271 	premptyset(&syscalls);
   1272 	for (i = 1; i < MAX_QUALS; ++i) {
   1273 		if (i > (sizeof syscalls) * CHAR_BIT) break;
   1274 		if (qual_flags [i] & QUAL_TRACE) praddset (&syscalls, i);
   1275 	}
   1276 	praddset (&syscalls, SYS_execve);
   1277 	if (followfork) {
   1278 		praddset (&syscalls, SYS_fork);
   1279 #ifdef SYS_forkall
   1280 		praddset (&syscalls, SYS_forkall);
   1281 #endif
   1282 #ifdef SYS_fork1
   1283 		praddset (&syscalls, SYS_fork1);
   1284 #endif
   1285 #ifdef SYS_rfork1
   1286 		praddset (&syscalls, SYS_rfork1);
   1287 #endif
   1288 #ifdef SYS_rforkall
   1289 		praddset (&syscalls, SYS_rforkall);
   1290 #endif
   1291 	}
   1292 	if (IOCTL(tcp->pfd, PIOCSENTRY, &syscalls) < 0) {
   1293 		perror("PIOCSENTRY");
   1294 		return -1;
   1295 	}
   1296 	/* Enable the syscall exits. */
   1297 	if (IOCTL(tcp->pfd, PIOCSEXIT, &syscalls) < 0) {
   1298 		perror("PIOSEXIT");
   1299 		return -1;
   1300 	}
   1301 	/* Enable signals we care about. */
   1302 	premptyset(&signals);
   1303 	for (i = 1; i < MAX_QUALS; ++i) {
   1304 		if (i > (sizeof signals) * CHAR_BIT) break;
   1305 		if (qual_flags [i] & QUAL_SIGNAL) praddset (&signals, i);
   1306 	}
   1307 	if (IOCTL(tcp->pfd, PIOCSTRACE, &signals) < 0) {
   1308 		perror("PIOCSTRACE");
   1309 		return -1;
   1310 	}
   1311 	/* Enable faults we care about */
   1312 	premptyset(&faults);
   1313 	for (i = 1; i < MAX_QUALS; ++i) {
   1314 		if (i > (sizeof faults) * CHAR_BIT) break;
   1315 		if (qual_flags [i] & QUAL_FAULT) praddset (&faults, i);
   1316 	}
   1317 	if (IOCTL(tcp->pfd, PIOCSFAULT, &faults) < 0) {
   1318 		perror("PIOCSFAULT");
   1319 		return -1;
   1320 	}
   1321 #else /* FREEBSD */
   1322 	/* set events flags. */
   1323 	arg = S_SIG | S_SCE | S_SCX ;
   1324 	if(ioctl(tcp->pfd, PIOCBIS, arg) < 0) {
   1325 		perror("PIOCBIS");
   1326 		return -1;
   1327 	}
   1328 #endif /* FREEBSD */
   1329 	if (!attaching) {
   1330 #ifdef MIPS
   1331 		/*
   1332 		 * The SGI PRSABORT doesn't work for pause() so
   1333 		 * we send it a caught signal to wake it up.
   1334 		 */
   1335 		kill(tcp->pid, SIGINT);
   1336 #else /* !MIPS */
   1337 #ifdef PRSABORT
   1338 		/* The child is in a pause(), abort it. */
   1339 		arg = PRSABORT;
   1340 		if (IOCTL (tcp->pfd, PIOCRUN, &arg) < 0) {
   1341 			perror("PIOCRUN");
   1342 			return -1;
   1343 		}
   1344 #endif
   1345 #endif /* !MIPS*/
   1346 #ifdef FREEBSD
   1347 		/* wake up the child if it received the SIGSTOP */
   1348 		kill(tcp->pid, SIGCONT);
   1349 #endif
   1350 		for (;;) {
   1351 			/* Wait for the child to do something. */
   1352 			if (IOCTL_WSTOP (tcp) < 0) {
   1353 				perror("PIOCWSTOP");
   1354 				return -1;
   1355 			}
   1356 			if (tcp->status.PR_WHY == PR_SYSENTRY) {
   1357 				tcp->flags &= ~TCB_INSYSCALL;
   1358 				get_scno(tcp);
   1359 				if (known_scno(tcp) == SYS_execve)
   1360 					break;
   1361 			}
   1362 			/* Set it running: maybe execve will be next. */
   1363 #ifndef FREEBSD
   1364 			arg = 0;
   1365 			if (IOCTL(tcp->pfd, PIOCRUN, &arg) < 0) {
   1366 #else /* FREEBSD */
   1367 			if (IOCTL(tcp->pfd, PIOCRUN, 0) < 0) {
   1368 #endif /* FREEBSD */
   1369 				perror("PIOCRUN");
   1370 				return -1;
   1371 			}
   1372 #ifdef FREEBSD
   1373 			/* handle the case where we "opened" the child before
   1374 			   it did the kill -STOP */
   1375 			if (tcp->status.PR_WHY == PR_SIGNALLED &&
   1376 			    tcp->status.PR_WHAT == SIGSTOP)
   1377 			        kill(tcp->pid, SIGCONT);
   1378 #endif
   1379 		}
   1380 #ifndef FREEBSD
   1381 	}
   1382 #else /* FREEBSD */
   1383 	} else {
   1384 		if (attaching < 2) {
   1385 			/* We are attaching to an already running process.
   1386 			 * Try to figure out the state of the process in syscalls,
   1387 			 * to handle the first event well.
   1388 			 * This is done by having a look at the "wchan" property of the
   1389 			 * process, which tells where it is stopped (if it is). */
   1390 			FILE * status;
   1391 			char wchan[20]; /* should be enough */
   1392 
   1393 			sprintf(proc, "/proc/%d/status", tcp->pid);
   1394 			status = fopen(proc, "r");
   1395 			if (status &&
   1396 			    (fscanf(status, "%*s %*d %*d %*d %*d %*d,%*d %*s %*d,%*d"
   1397 				    "%*d,%*d %*d,%*d %19s", wchan) == 1) &&
   1398 			    strcmp(wchan, "nochan") && strcmp(wchan, "spread") &&
   1399 			    strcmp(wchan, "stopevent")) {
   1400 				/* The process is asleep in the middle of a syscall.
   1401 				   Fake the syscall entry event */
   1402 				tcp->flags &= ~(TCB_INSYSCALL|TCB_STARTUP);
   1403 				tcp->status.PR_WHY = PR_SYSENTRY;
   1404 				trace_syscall(tcp);
   1405 			}
   1406 			if (status)
   1407 				fclose(status);
   1408 		} /* otherwise it's a fork being followed */
   1409 	}
   1410 #endif /* FREEBSD */
   1411 #ifndef HAVE_POLLABLE_PROCFS
   1412 	if (proc_poll_pipe[0] != -1)
   1413 		proc_poller(tcp->pfd);
   1414 	else if (nprocs > 1) {
   1415 		proc_poll_open();
   1416 		proc_poller(last_pfd);
   1417 		proc_poller(tcp->pfd);
   1418 	}
   1419 	last_pfd = tcp->pfd;
   1420 #endif /* !HAVE_POLLABLE_PROCFS */
   1421 	return 0;
   1422 }
   1423 
   1424 #endif /* USE_PROCFS */
   1425 
   1426 struct tcb *
   1427 pid2tcb(int pid)
   1428 {
   1429 	int i;
   1430 
   1431 	if (pid <= 0)
   1432 		return NULL;
   1433 
   1434 	for (i = 0; i < tcbtabsize; i++) {
   1435 		struct tcb *tcp = tcbtab[i];
   1436 		if (tcp->pid == pid && (tcp->flags & TCB_INUSE))
   1437 			return tcp;
   1438 	}
   1439 
   1440 	return NULL;
   1441 }
   1442 
   1443 #ifdef USE_PROCFS
   1444 
   1445 static struct tcb *
   1446 first_used_tcb(void)
   1447 {
   1448 	int i;
   1449 	struct tcb *tcp;
   1450 	for (i = 0; i < tcbtabsize; i++) {
   1451 		tcp = tcbtab[i];
   1452 		if (tcp->flags & TCB_INUSE)
   1453 			return tcp;
   1454 	}
   1455 	return NULL;
   1456 }
   1457 
   1458 static struct tcb *
   1459 pfd2tcb(pfd)
   1460 int pfd;
   1461 {
   1462 	int i;
   1463 
   1464 	for (i = 0; i < tcbtabsize; i++) {
   1465 		struct tcb *tcp = tcbtab[i];
   1466 		if (tcp->pfd != pfd)
   1467 			continue;
   1468 		if (tcp->flags & TCB_INUSE)
   1469 			return tcp;
   1470 	}
   1471 	return NULL;
   1472 }
   1473 
   1474 #endif /* USE_PROCFS */
   1475 
   1476 void
   1477 droptcb(tcp)
   1478 struct tcb *tcp;
   1479 {
   1480 	if (tcp->pid == 0)
   1481 		return;
   1482 #ifdef TCB_CLONE_THREAD
   1483 	if (tcp->nclone_threads > 0) {
   1484 		/* There are other threads left in this process, but this
   1485 		   is the one whose PID represents the whole process.
   1486 		   We need to keep this record around as a zombie until
   1487 		   all the threads die.  */
   1488 		tcp->flags |= TCB_EXITING;
   1489 		return;
   1490 	}
   1491 #endif
   1492 	nprocs--;
   1493 	tcp->pid = 0;
   1494 
   1495 	if (tcp->parent != NULL) {
   1496 		tcp->parent->nchildren--;
   1497 #ifdef TCB_CLONE_THREAD
   1498 		if (tcp->flags & TCB_CLONE_THREAD)
   1499 			tcp->parent->nclone_threads--;
   1500 #endif
   1501 		tcp->parent->nzombies++;
   1502 #ifdef LINUX
   1503 		/* Update `tcp->parent->parent->nchildren' and the other fields
   1504 		   like NCLONE_DETACHED, only for zombie group leader that has
   1505 		   already reported and been short-circuited at the top of this
   1506 		   function.  The same condition as at the top of DETACH.  */
   1507 		if ((tcp->flags & TCB_CLONE_THREAD) &&
   1508 		    tcp->parent->nclone_threads == 0 &&
   1509 		    (tcp->parent->flags & TCB_EXITING))
   1510 			droptcb(tcp->parent);
   1511 #endif
   1512 		tcp->parent = NULL;
   1513 	}
   1514 
   1515 	tcp->flags = 0;
   1516 	if (tcp->pfd != -1) {
   1517 		close(tcp->pfd);
   1518 		tcp->pfd = -1;
   1519 #ifdef FREEBSD
   1520 		if (tcp->pfd_reg != -1) {
   1521 		        close(tcp->pfd_reg);
   1522 		        tcp->pfd_reg = -1;
   1523 		}
   1524 		if (tcp->pfd_status != -1) {
   1525 			close(tcp->pfd_status);
   1526 			tcp->pfd_status = -1;
   1527 		}
   1528 #endif /* !FREEBSD */
   1529 #ifdef USE_PROCFS
   1530 		rebuild_pollv(); /* Note, flags needs to be cleared by now.  */
   1531 #endif
   1532 	}
   1533 
   1534 	if (outfname && followfork > 1 && tcp->outf)
   1535 		fclose(tcp->outf);
   1536 
   1537 	tcp->outf = 0;
   1538 }
   1539 
   1540 #ifndef USE_PROCFS
   1541 
   1542 static int
   1543 resume(tcp)
   1544 struct tcb *tcp;
   1545 {
   1546 	if (tcp == NULL)
   1547 		return -1;
   1548 
   1549 	if (!(tcp->flags & TCB_SUSPENDED)) {
   1550 		fprintf(stderr, "PANIC: pid %u not suspended\n", tcp->pid);
   1551 		return -1;
   1552 	}
   1553 	tcp->flags &= ~TCB_SUSPENDED;
   1554 #ifdef TCB_CLONE_THREAD
   1555 	if (tcp->flags & TCB_CLONE_THREAD)
   1556 		tcp->parent->nclone_waiting--;
   1557 #endif
   1558 
   1559 	if (ptrace_restart(PTRACE_SYSCALL, tcp, 0) < 0)
   1560 		return -1;
   1561 
   1562 	if (!qflag)
   1563 		fprintf(stderr, "Process %u resumed\n", tcp->pid);
   1564 	return 0;
   1565 }
   1566 
   1567 static int
   1568 resume_from_tcp (struct tcb *tcp)
   1569 {
   1570 	int error = 0;
   1571 	int resumed = 0;
   1572 
   1573 	/* XXX This won't always be quite right (but it never was).
   1574 	   A waiter with argument 0 or < -1 is waiting for any pid in
   1575 	   a particular pgrp, which this child might or might not be
   1576 	   in.  The waiter will only wake up if it's argument is -1
   1577 	   or if it's waiting for tcp->pid's pgrp.  It makes a
   1578 	   difference to wake up a waiter when there might be more
   1579 	   traced children, because it could get a false ECHILD
   1580 	   error.  OTOH, if this was the last child in the pgrp, then
   1581 	   it ought to wake up and get ECHILD.  We would have to
   1582 	   search the system for all pid's in the pgrp to be sure.
   1583 
   1584 	     && (t->waitpid == -1 ||
   1585 		 (t->waitpid == 0 && getpgid (tcp->pid) == getpgid (t->pid))
   1586 		 || (t->waitpid < 0 && t->waitpid == -getpid (t->pid)))
   1587 	*/
   1588 
   1589 	if (tcp->parent &&
   1590 	    (tcp->parent->flags & TCB_SUSPENDED) &&
   1591 	    (tcp->parent->waitpid <= 0 || tcp->parent->waitpid == tcp->pid)) {
   1592 		error = resume(tcp->parent);
   1593 		++resumed;
   1594 	}
   1595 #ifdef TCB_CLONE_THREAD
   1596 	if (tcp->parent && tcp->parent->nclone_waiting > 0) {
   1597 		/* Some other threads of our parent are waiting too.  */
   1598 		unsigned int i;
   1599 
   1600 		/* Resume all the threads that were waiting for this PID.  */
   1601 		for (i = 0; i < tcbtabsize; i++) {
   1602 			struct tcb *t = tcbtab[i];
   1603 			if (t->parent == tcp->parent && t != tcp
   1604 			    && ((t->flags & (TCB_CLONE_THREAD|TCB_SUSPENDED))
   1605 				== (TCB_CLONE_THREAD|TCB_SUSPENDED))
   1606 			    && t->waitpid == tcp->pid) {
   1607 				error |= resume (t);
   1608 				++resumed;
   1609 			}
   1610 		}
   1611 		if (resumed == 0)
   1612 			/* Noone was waiting for this PID in particular,
   1613 			   so now we might need to resume some wildcarders.  */
   1614 			for (i = 0; i < tcbtabsize; i++) {
   1615 				struct tcb *t = tcbtab[i];
   1616 				if (t->parent == tcp->parent && t != tcp
   1617 				    && ((t->flags
   1618 					 & (TCB_CLONE_THREAD|TCB_SUSPENDED))
   1619 					== (TCB_CLONE_THREAD|TCB_SUSPENDED))
   1620 				    && t->waitpid <= 0
   1621 					) {
   1622 					error |= resume (t);
   1623 					break;
   1624 				}
   1625 			}
   1626 	}
   1627 #endif
   1628 
   1629 	return error;
   1630 }
   1631 
   1632 #endif /* !USE_PROCFS */
   1633 
   1634 /* detach traced process; continue with sig
   1635    Never call DETACH twice on the same process as both unattached and
   1636    attached-unstopped processes give the same ESRCH.  For unattached process we
   1637    would SIGSTOP it and wait for its SIGSTOP notification forever.  */
   1638 
   1639 static int
   1640 detach(tcp, sig)
   1641 struct tcb *tcp;
   1642 int sig;
   1643 {
   1644 	int error = 0;
   1645 #ifdef LINUX
   1646 	int status, catch_sigstop;
   1647 	struct tcb *zombie = NULL;
   1648 
   1649 	/* If the group leader is lingering only because of this other
   1650 	   thread now dying, then detach the leader as well.  */
   1651 	if ((tcp->flags & TCB_CLONE_THREAD) &&
   1652 	    tcp->parent->nclone_threads == 1 &&
   1653 	    (tcp->parent->flags & TCB_EXITING))
   1654 		zombie = tcp->parent;
   1655 #endif
   1656 
   1657 	if (tcp->flags & TCB_BPTSET)
   1658 		clearbpt(tcp);
   1659 
   1660 #ifdef LINUX
   1661 	/*
   1662 	 * Linux wrongly insists the child be stopped
   1663 	 * before detaching.  Arghh.  We go through hoops
   1664 	 * to make a clean break of things.
   1665 	 */
   1666 #if defined(SPARC)
   1667 #undef PTRACE_DETACH
   1668 #define PTRACE_DETACH PTRACE_SUNDETACH
   1669 #endif
   1670 	/*
   1671 	 * On TCB_STARTUP we did PTRACE_ATTACH but still did not get the
   1672 	 * expected SIGSTOP.  We must catch exactly one as otherwise the
   1673 	 * detached process would be left stopped (process state T).
   1674 	 */
   1675 	catch_sigstop = (tcp->flags & TCB_STARTUP);
   1676 	if ((error = ptrace(PTRACE_DETACH, tcp->pid, (char *) 1, sig)) == 0) {
   1677 		/* On a clear day, you can see forever. */
   1678 	}
   1679 	else if (errno != ESRCH) {
   1680 		/* Shouldn't happen. */
   1681 		perror("detach: ptrace(PTRACE_DETACH, ...)");
   1682 	}
   1683 	else if (my_tgkill((tcp->flags & TCB_CLONE_THREAD ? tcp->parent->pid
   1684 							  : tcp->pid),
   1685 			   tcp->pid, 0) < 0) {
   1686 		if (errno != ESRCH)
   1687 			perror("detach: checking sanity");
   1688 	}
   1689 	else if (!catch_sigstop && my_tgkill((tcp->flags & TCB_CLONE_THREAD
   1690 					      ? tcp->parent->pid : tcp->pid),
   1691 					     tcp->pid, SIGSTOP) < 0) {
   1692 		if (errno != ESRCH)
   1693 			perror("detach: stopping child");
   1694 	}
   1695 	else
   1696 		catch_sigstop = 1;
   1697 	if (catch_sigstop) {
   1698 		for (;;) {
   1699 #ifdef __WALL
   1700 			if (wait4(tcp->pid, &status, __WALL, NULL) < 0) {
   1701 				if (errno == ECHILD) /* Already gone.  */
   1702 					break;
   1703 				if (errno != EINVAL) {
   1704 					perror("detach: waiting");
   1705 					break;
   1706 				}
   1707 #endif /* __WALL */
   1708 				/* No __WALL here.  */
   1709 				if (waitpid(tcp->pid, &status, 0) < 0) {
   1710 					if (errno != ECHILD) {
   1711 						perror("detach: waiting");
   1712 						break;
   1713 					}
   1714 #ifdef __WCLONE
   1715 					/* If no processes, try clones.  */
   1716 					if (wait4(tcp->pid, &status, __WCLONE,
   1717 						  NULL) < 0) {
   1718 						if (errno != ECHILD)
   1719 							perror("detach: waiting");
   1720 						break;
   1721 					}
   1722 #endif /* __WCLONE */
   1723 				}
   1724 #ifdef __WALL
   1725 			}
   1726 #endif
   1727 			if (!WIFSTOPPED(status)) {
   1728 				/* Au revoir, mon ami. */
   1729 				break;
   1730 			}
   1731 			if (WSTOPSIG(status) == SIGSTOP) {
   1732 				ptrace_restart(PTRACE_DETACH, tcp, sig);
   1733 				break;
   1734 			}
   1735 			error = ptrace_restart(PTRACE_CONT, tcp,
   1736 					WSTOPSIG(status) == SIGTRAP ? 0
   1737 					: WSTOPSIG(status));
   1738 			if (error < 0)
   1739 				break;
   1740 		}
   1741 	}
   1742 #endif /* LINUX */
   1743 
   1744 #if defined(SUNOS4)
   1745 	/* PTRACE_DETACH won't respect `sig' argument, so we post it here. */
   1746 	if (sig && kill(tcp->pid, sig) < 0)
   1747 		perror("detach: kill");
   1748 	sig = 0;
   1749 	error = ptrace_restart(PTRACE_DETACH, tcp, sig);
   1750 #endif /* SUNOS4 */
   1751 
   1752 #ifndef USE_PROCFS
   1753 	error |= resume_from_tcp (tcp);
   1754 #endif
   1755 
   1756 	if (!qflag)
   1757 		fprintf(stderr, "Process %u detached\n", tcp->pid);
   1758 
   1759 	droptcb(tcp);
   1760 
   1761 #ifdef LINUX
   1762 	if (zombie != NULL) {
   1763 		/* TCP no longer exists therefore you must not detach () it.  */
   1764 		droptcb(zombie);
   1765 	}
   1766 #endif
   1767 
   1768 	return error;
   1769 }
   1770 
   1771 #ifdef USE_PROCFS
   1772 
   1773 static void reaper(int sig)
   1774 {
   1775 	int pid;
   1776 	int status;
   1777 
   1778 	while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
   1779 	}
   1780 }
   1781 
   1782 #endif /* USE_PROCFS */
   1783 
   1784 static void
   1785 cleanup()
   1786 {
   1787 	int i;
   1788 	struct tcb *tcp;
   1789 
   1790 	for (i = 0; i < tcbtabsize; i++) {
   1791 		tcp = tcbtab[i];
   1792 		if (!(tcp->flags & TCB_INUSE))
   1793 			continue;
   1794 		if (debug)
   1795 			fprintf(stderr,
   1796 				"cleanup: looking at pid %u\n", tcp->pid);
   1797 		if (tcp_last &&
   1798 		    (!outfname || followfork < 2 || tcp_last == tcp)) {
   1799 			tprintf(" <unfinished ...>");
   1800 			printtrailer();
   1801 		}
   1802 		if (tcp->flags & TCB_ATTACHED)
   1803 			detach(tcp, 0);
   1804 		else {
   1805 			kill(tcp->pid, SIGCONT);
   1806 			kill(tcp->pid, SIGTERM);
   1807 		}
   1808 	}
   1809 	if (cflag)
   1810 		call_summary(outf);
   1811 }
   1812 
   1813 static void
   1814 interrupt(sig)
   1815 int sig;
   1816 {
   1817 	interrupted = 1;
   1818 }
   1819 
   1820 #ifndef HAVE_STRERROR
   1821 
   1822 #if !HAVE_DECL_SYS_ERRLIST
   1823 extern int sys_nerr;
   1824 extern char *sys_errlist[];
   1825 #endif /* HAVE_DECL_SYS_ERRLIST */
   1826 
   1827 const char *
   1828 strerror(errno)
   1829 int errno;
   1830 {
   1831 	static char buf[64];
   1832 
   1833 	if (errno < 1 || errno >= sys_nerr) {
   1834 		sprintf(buf, "Unknown error %d", errno);
   1835 		return buf;
   1836 	}
   1837 	return sys_errlist[errno];
   1838 }
   1839 
   1840 #endif /* HAVE_STERRROR */
   1841 
   1842 #ifndef HAVE_STRSIGNAL
   1843 
   1844 #if defined HAVE_SYS_SIGLIST && !defined HAVE_DECL_SYS_SIGLIST
   1845 extern char *sys_siglist[];
   1846 #endif
   1847 #if defined HAVE_SYS__SIGLIST && !defined HAVE_DECL__SYS_SIGLIST
   1848 extern char *_sys_siglist[];
   1849 #endif
   1850 
   1851 const char *
   1852 strsignal(sig)
   1853 int sig;
   1854 {
   1855 	static char buf[64];
   1856 
   1857 	if (sig < 1 || sig >= NSIG) {
   1858 		sprintf(buf, "Unknown signal %d", sig);
   1859 		return buf;
   1860 	}
   1861 #ifdef HAVE__SYS_SIGLIST
   1862 	return _sys_siglist[sig];
   1863 #else
   1864 	return sys_siglist[sig];
   1865 #endif
   1866 }
   1867 
   1868 #endif /* HAVE_STRSIGNAL */
   1869 
   1870 #ifdef USE_PROCFS
   1871 
   1872 static void
   1873 rebuild_pollv()
   1874 {
   1875 	int i, j;
   1876 
   1877 	if (pollv != NULL)
   1878 		free (pollv);
   1879 	pollv = (struct pollfd *) malloc(nprocs * sizeof pollv[0]);
   1880 	if (pollv == NULL) {
   1881 		fprintf(stderr, "%s: out of memory\n", progname);
   1882 		exit(1);
   1883 	}
   1884 
   1885 	for (i = j = 0; i < tcbtabsize; i++) {
   1886 		struct tcb *tcp = tcbtab[i];
   1887 		if (!(tcp->flags & TCB_INUSE))
   1888 			continue;
   1889 		pollv[j].fd = tcp->pfd;
   1890 		pollv[j].events = POLLWANT;
   1891 		j++;
   1892 	}
   1893 	if (j != nprocs) {
   1894 		fprintf(stderr, "strace: proc miscount\n");
   1895 		exit(1);
   1896 	}
   1897 }
   1898 
   1899 #ifndef HAVE_POLLABLE_PROCFS
   1900 
   1901 static void
   1902 proc_poll_open()
   1903 {
   1904 	int i;
   1905 
   1906 	if (pipe(proc_poll_pipe) < 0) {
   1907 		perror("pipe");
   1908 		exit(1);
   1909 	}
   1910 	for (i = 0; i < 2; i++) {
   1911 		if (set_cloexec_flag(proc_poll_pipe[i]) < 0) {
   1912 			exit(1);
   1913 		}
   1914 	}
   1915 }
   1916 
   1917 static int
   1918 proc_poll(pollv, nfds, timeout)
   1919 struct pollfd *pollv;
   1920 int nfds;
   1921 int timeout;
   1922 {
   1923 	int i;
   1924 	int n;
   1925 	struct proc_pollfd pollinfo;
   1926 
   1927 	if ((n = read(proc_poll_pipe[0], &pollinfo, sizeof(pollinfo))) < 0)
   1928 		return n;
   1929 	if (n != sizeof(struct proc_pollfd)) {
   1930 		fprintf(stderr, "panic: short read: %d\n", n);
   1931 		exit(1);
   1932 	}
   1933 	for (i = 0; i < nprocs; i++) {
   1934 		if (pollv[i].fd == pollinfo.fd)
   1935 			pollv[i].revents = pollinfo.revents;
   1936 		else
   1937 			pollv[i].revents = 0;
   1938 	}
   1939 	poller_pid = pollinfo.pid;
   1940 	return 1;
   1941 }
   1942 
   1943 static void
   1944 wakeup_handler(sig)
   1945 int sig;
   1946 {
   1947 }
   1948 
   1949 static void
   1950 proc_poller(pfd)
   1951 int pfd;
   1952 {
   1953 	struct proc_pollfd pollinfo;
   1954 	struct sigaction sa;
   1955 	sigset_t blocked_set, empty_set;
   1956 	int i;
   1957 	int n;
   1958 	struct rlimit rl;
   1959 #ifdef FREEBSD
   1960 	struct procfs_status pfs;
   1961 #endif /* FREEBSD */
   1962 
   1963 	switch (fork()) {
   1964 	case -1:
   1965 		perror("fork");
   1966 		_exit(1);
   1967 	case 0:
   1968 		break;
   1969 	default:
   1970 		return;
   1971 	}
   1972 
   1973 	sa.sa_handler = interactive ? SIG_DFL : SIG_IGN;
   1974 	sa.sa_flags = 0;
   1975 	sigemptyset(&sa.sa_mask);
   1976 	sigaction(SIGHUP, &sa, NULL);
   1977 	sigaction(SIGINT, &sa, NULL);
   1978 	sigaction(SIGQUIT, &sa, NULL);
   1979 	sigaction(SIGPIPE, &sa, NULL);
   1980 	sigaction(SIGTERM, &sa, NULL);
   1981 	sa.sa_handler = wakeup_handler;
   1982 	sigaction(SIGUSR1, &sa, NULL);
   1983 	sigemptyset(&blocked_set);
   1984 	sigaddset(&blocked_set, SIGUSR1);
   1985 	sigprocmask(SIG_BLOCK, &blocked_set, NULL);
   1986 	sigemptyset(&empty_set);
   1987 
   1988 	if (getrlimit(RLIMIT_NOFILE, &rl) < 0) {
   1989 		perror("getrlimit(RLIMIT_NOFILE, ...)");
   1990 		_exit(1);
   1991 	}
   1992 	n = rl.rlim_cur;
   1993 	for (i = 0; i < n; i++) {
   1994 		if (i != pfd && i != proc_poll_pipe[1])
   1995 			close(i);
   1996 	}
   1997 
   1998 	pollinfo.fd = pfd;
   1999 	pollinfo.pid = getpid();
   2000 	for (;;) {
   2001 #ifndef FREEBSD
   2002 		if (ioctl(pfd, PIOCWSTOP, NULL) < 0)
   2003 #else
   2004 		if (ioctl(pfd, PIOCWSTOP, &pfs) < 0)
   2005 #endif
   2006 		{
   2007 			switch (errno) {
   2008 			case EINTR:
   2009 				continue;
   2010 			case EBADF:
   2011 				pollinfo.revents = POLLERR;
   2012 				break;
   2013 			case ENOENT:
   2014 				pollinfo.revents = POLLHUP;
   2015 				break;
   2016 			default:
   2017 				perror("proc_poller: PIOCWSTOP");
   2018 			}
   2019 			write(proc_poll_pipe[1], &pollinfo, sizeof(pollinfo));
   2020 			_exit(0);
   2021 		}
   2022 		pollinfo.revents = POLLWANT;
   2023 		write(proc_poll_pipe[1], &pollinfo, sizeof(pollinfo));
   2024 		sigsuspend(&empty_set);
   2025 	}
   2026 }
   2027 
   2028 #endif /* !HAVE_POLLABLE_PROCFS */
   2029 
   2030 static int
   2031 choose_pfd()
   2032 {
   2033 	int i, j;
   2034 	struct tcb *tcp;
   2035 
   2036 	static int last;
   2037 
   2038 	if (followfork < 2 &&
   2039 	    last < nprocs && (pollv[last].revents & POLLWANT)) {
   2040 		/*
   2041 		 * The previous process is ready to run again.  We'll
   2042 		 * let it do so if it is currently in a syscall.  This
   2043 		 * heuristic improves the readability of the trace.
   2044 		 */
   2045 		tcp = pfd2tcb(pollv[last].fd);
   2046 		if (tcp && (tcp->flags & TCB_INSYSCALL))
   2047 			return pollv[last].fd;
   2048 	}
   2049 
   2050 	for (i = 0; i < nprocs; i++) {
   2051 		/* Let competing children run round robin. */
   2052 		j = (i + last + 1) % nprocs;
   2053 		if (pollv[j].revents & (POLLHUP | POLLERR)) {
   2054 			tcp = pfd2tcb(pollv[j].fd);
   2055 			if (!tcp) {
   2056 				fprintf(stderr, "strace: lost proc\n");
   2057 				exit(1);
   2058 			}
   2059 			droptcb(tcp);
   2060 			return -1;
   2061 		}
   2062 		if (pollv[j].revents & POLLWANT) {
   2063 			last = j;
   2064 			return pollv[j].fd;
   2065 		}
   2066 	}
   2067 	fprintf(stderr, "strace: nothing ready\n");
   2068 	exit(1);
   2069 }
   2070 
   2071 static int
   2072 trace()
   2073 {
   2074 #ifdef POLL_HACK
   2075 	struct tcb *in_syscall = NULL;
   2076 #endif
   2077 	struct tcb *tcp;
   2078 	int pfd;
   2079 	int what;
   2080 	int ioctl_result = 0, ioctl_errno = 0;
   2081 	long arg;
   2082 
   2083 	for (;;) {
   2084 		if (interactive)
   2085 			sigprocmask(SIG_SETMASK, &empty_set, NULL);
   2086 
   2087 		if (nprocs == 0)
   2088 			break;
   2089 
   2090 		switch (nprocs) {
   2091 		case 1:
   2092 #ifndef HAVE_POLLABLE_PROCFS
   2093 			if (proc_poll_pipe[0] == -1) {
   2094 #endif
   2095 				tcp = first_used_tcb();
   2096 				if (!tcp)
   2097 					continue;
   2098 				pfd = tcp->pfd;
   2099 				if (pfd == -1)
   2100 					continue;
   2101 				break;
   2102 #ifndef HAVE_POLLABLE_PROCFS
   2103 			}
   2104 			/* fall through ... */
   2105 #endif /* !HAVE_POLLABLE_PROCFS */
   2106 		default:
   2107 #ifdef HAVE_POLLABLE_PROCFS
   2108 #ifdef POLL_HACK
   2109 		        /* On some systems (e.g. UnixWare) we get too much ugly
   2110 			   "unfinished..." stuff when multiple proceses are in
   2111 			   syscalls.  Here's a nasty hack */
   2112 
   2113 			if (in_syscall) {
   2114 				struct pollfd pv;
   2115 				tcp = in_syscall;
   2116 				in_syscall = NULL;
   2117 				pv.fd = tcp->pfd;
   2118 				pv.events = POLLWANT;
   2119 				if ((what = poll (&pv, 1, 1)) < 0) {
   2120 					if (interrupted)
   2121 						return 0;
   2122 					continue;
   2123 				}
   2124 				else if (what == 1 && pv.revents & POLLWANT) {
   2125 					goto FOUND;
   2126 				}
   2127 			}
   2128 #endif
   2129 
   2130 			if (poll(pollv, nprocs, INFTIM) < 0) {
   2131 				if (interrupted)
   2132 					return 0;
   2133 				continue;
   2134 			}
   2135 #else /* !HAVE_POLLABLE_PROCFS */
   2136 			if (proc_poll(pollv, nprocs, INFTIM) < 0) {
   2137 				if (interrupted)
   2138 					return 0;
   2139 				continue;
   2140 			}
   2141 #endif /* !HAVE_POLLABLE_PROCFS */
   2142 			pfd = choose_pfd();
   2143 			if (pfd == -1)
   2144 				continue;
   2145 			break;
   2146 		}
   2147 
   2148 		/* Look up `pfd' in our table. */
   2149 		if ((tcp = pfd2tcb(pfd)) == NULL) {
   2150 			fprintf(stderr, "unknown pfd: %u\n", pfd);
   2151 			exit(1);
   2152 		}
   2153 #ifdef POLL_HACK
   2154 	FOUND:
   2155 #endif
   2156 		/* Get the status of the process. */
   2157 		if (!interrupted) {
   2158 #ifndef FREEBSD
   2159 			ioctl_result = IOCTL_WSTOP (tcp);
   2160 #else /* FREEBSD */
   2161 			/* Thanks to some scheduling mystery, the first poller
   2162 			   sometimes waits for the already processed end of fork
   2163 			   event. Doing a non blocking poll here solves the problem. */
   2164 			if (proc_poll_pipe[0] != -1)
   2165 				ioctl_result = IOCTL_STATUS (tcp);
   2166 			else
   2167 				ioctl_result = IOCTL_WSTOP (tcp);
   2168 #endif /* FREEBSD */
   2169 			ioctl_errno = errno;
   2170 #ifndef HAVE_POLLABLE_PROCFS
   2171 			if (proc_poll_pipe[0] != -1) {
   2172 				if (ioctl_result < 0)
   2173 					kill(poller_pid, SIGKILL);
   2174 				else
   2175 					kill(poller_pid, SIGUSR1);
   2176 			}
   2177 #endif /* !HAVE_POLLABLE_PROCFS */
   2178 		}
   2179 		if (interrupted)
   2180 			return 0;
   2181 
   2182 		if (interactive)
   2183 			sigprocmask(SIG_BLOCK, &blocked_set, NULL);
   2184 
   2185 		if (ioctl_result < 0) {
   2186 			/* Find out what happened if it failed. */
   2187 			switch (ioctl_errno) {
   2188 			case EINTR:
   2189 			case EBADF:
   2190 				continue;
   2191 #ifdef FREEBSD
   2192 			case ENOTTY:
   2193 #endif
   2194 			case ENOENT:
   2195 				droptcb(tcp);
   2196 				continue;
   2197 			default:
   2198 				perror("PIOCWSTOP");
   2199 				exit(1);
   2200 			}
   2201 		}
   2202 
   2203 #ifdef FREEBSD
   2204 		if ((tcp->flags & TCB_STARTUP) && (tcp->status.PR_WHY == PR_SYSEXIT)) {
   2205 			/* discard first event for a syscall we never entered */
   2206 			IOCTL (tcp->pfd, PIOCRUN, 0);
   2207 			continue;
   2208 		}
   2209 #endif
   2210 
   2211 		/* clear the just started flag */
   2212 		tcp->flags &= ~TCB_STARTUP;
   2213 
   2214 		/* set current output file */
   2215 		outf = tcp->outf;
   2216 		curcol = tcp->curcol;
   2217 
   2218 		if (cflag) {
   2219 			struct timeval stime;
   2220 #ifdef FREEBSD
   2221 			char buf[1024];
   2222 			int len;
   2223 
   2224 			if ((len = pread(tcp->pfd_status, buf, sizeof(buf) - 1, 0)) > 0) {
   2225 				buf[len] = '\0';
   2226 				sscanf(buf,
   2227 				       "%*s %*d %*d %*d %*d %*d,%*d %*s %*d,%*d %*d,%*d %ld,%ld",
   2228 				       &stime.tv_sec, &stime.tv_usec);
   2229 			} else
   2230 				stime.tv_sec = stime.tv_usec = 0;
   2231 #else /* !FREEBSD */
   2232 			stime.tv_sec = tcp->status.pr_stime.tv_sec;
   2233 			stime.tv_usec = tcp->status.pr_stime.tv_nsec/1000;
   2234 #endif /* !FREEBSD */
   2235 			tv_sub(&tcp->dtime, &stime, &tcp->stime);
   2236 			tcp->stime = stime;
   2237 		}
   2238 		what = tcp->status.PR_WHAT;
   2239 		switch (tcp->status.PR_WHY) {
   2240 #ifndef FREEBSD
   2241 		case PR_REQUESTED:
   2242 			if (tcp->status.PR_FLAGS & PR_ASLEEP) {
   2243 				tcp->status.PR_WHY = PR_SYSENTRY;
   2244 				if (trace_syscall(tcp) < 0) {
   2245 					fprintf(stderr, "syscall trouble\n");
   2246 					exit(1);
   2247 				}
   2248 			}
   2249 			break;
   2250 #endif /* !FREEBSD */
   2251 		case PR_SYSENTRY:
   2252 #ifdef POLL_HACK
   2253 		        in_syscall = tcp;
   2254 #endif
   2255 		case PR_SYSEXIT:
   2256 			if (trace_syscall(tcp) < 0) {
   2257 				fprintf(stderr, "syscall trouble\n");
   2258 				exit(1);
   2259 			}
   2260 			break;
   2261 		case PR_SIGNALLED:
   2262 			if (cflag != CFLAG_ONLY_STATS
   2263 			    && (qual_flags[what] & QUAL_SIGNAL)) {
   2264 				printleader(tcp);
   2265 				tprintf("--- %s (%s) ---",
   2266 					signame(what), strsignal(what));
   2267 				printtrailer();
   2268 #ifdef PR_INFO
   2269 				if (tcp->status.PR_INFO.si_signo == what) {
   2270 					printleader(tcp);
   2271 					tprintf("    siginfo=");
   2272 					printsiginfo(&tcp->status.PR_INFO, 1);
   2273 					printtrailer();
   2274 				}
   2275 #endif
   2276 			}
   2277 			break;
   2278 		case PR_FAULTED:
   2279 			if (cflag != CFLAGS_ONLY_STATS
   2280 			    && (qual_flags[what] & QUAL_FAULT)) {
   2281 				printleader(tcp);
   2282 				tprintf("=== FAULT %d ===", what);
   2283 				printtrailer();
   2284 			}
   2285 			break;
   2286 #ifdef FREEBSD
   2287 		case 0: /* handle case we polled for nothing */
   2288 			continue;
   2289 #endif
   2290 		default:
   2291 			fprintf(stderr, "odd stop %d\n", tcp->status.PR_WHY);
   2292 			exit(1);
   2293 			break;
   2294 		}
   2295 		/* Remember current print column before continuing. */
   2296 		tcp->curcol = curcol;
   2297 		arg = 0;
   2298 #ifndef FREEBSD
   2299 		if (IOCTL (tcp->pfd, PIOCRUN, &arg) < 0)
   2300 #else
   2301 		if (IOCTL (tcp->pfd, PIOCRUN, 0) < 0)
   2302 #endif
   2303 		{
   2304 			perror("PIOCRUN");
   2305 			exit(1);
   2306 		}
   2307 	}
   2308 	return 0;
   2309 }
   2310 
   2311 #else /* !USE_PROCFS */
   2312 
   2313 #ifdef TCB_GROUP_EXITING
   2314 /* Handle an exit detach or death signal that is taking all the
   2315    related clone threads with it.  This is called in three circumstances:
   2316    SIG == -1	TCP has already died (TCB_ATTACHED is clear, strace is parent).
   2317    SIG == 0	Continuing TCP will perform an exit_group syscall.
   2318    SIG == other	Continuing TCP with SIG will kill the process.
   2319 */
   2320 static int
   2321 handle_group_exit(struct tcb *tcp, int sig)
   2322 {
   2323 	/* We need to locate our records of all the clone threads
   2324 	   related to TCP, either its children or siblings.  */
   2325 	struct tcb *leader = NULL;
   2326 
   2327 	if (tcp->flags & TCB_CLONE_THREAD)
   2328 		leader = tcp->parent;
   2329 
   2330 	if (sig < 0) {
   2331 		if (leader != NULL && leader != tcp
   2332 		 && !(leader->flags & TCB_GROUP_EXITING)
   2333 		 && !(tcp->flags & TCB_STARTUP)
   2334 		) {
   2335 			fprintf(stderr,
   2336 				"PANIC: handle_group_exit: %d leader %d\n",
   2337 				tcp->pid, leader ? leader->pid : -1);
   2338 		}
   2339 		/* TCP no longer exists therefore you must not detach() it.  */
   2340 #ifndef USE_PROCFS
   2341 		resume_from_tcp(tcp);
   2342 #endif
   2343 		droptcb(tcp);	/* Already died.  */
   2344 	}
   2345 	else {
   2346 		/* Mark that we are taking the process down.  */
   2347 		tcp->flags |= TCB_EXITING | TCB_GROUP_EXITING;
   2348 		if (tcp->flags & TCB_ATTACHED) {
   2349 			detach(tcp, sig);
   2350 			if (leader != NULL && leader != tcp)
   2351 				leader->flags |= TCB_GROUP_EXITING;
   2352 		} else {
   2353 			if (ptrace_restart(PTRACE_CONT, tcp, sig) < 0) {
   2354 				cleanup();
   2355 				return -1;
   2356 			}
   2357 			if (leader != NULL) {
   2358 				leader->flags |= TCB_GROUP_EXITING;
   2359 				if (leader != tcp)
   2360 					droptcb(tcp);
   2361 			}
   2362 			/* The leader will report to us as parent now,
   2363 			   and then we'll get to the SIG==-1 case.  */
   2364 			return 0;
   2365 		}
   2366 	}
   2367 
   2368 	return 0;
   2369 }
   2370 #endif
   2371 
   2372 #ifdef LINUX
   2373 static int
   2374 handle_ptrace_event(int status, struct tcb *tcp)
   2375 {
   2376 	if (status >> 16 == PTRACE_EVENT_VFORK ||
   2377 	    status >> 16 == PTRACE_EVENT_CLONE ||
   2378 	    status >> 16 == PTRACE_EVENT_FORK) {
   2379 		long childpid;
   2380 
   2381 		if (do_ptrace(PTRACE_GETEVENTMSG, tcp, NULL, &childpid) < 0) {
   2382 			if (errno != ESRCH) {
   2383 				fprintf(stderr, "\
   2384 %s: handle_ptrace_event: ptrace cannot get new child's pid\n",
   2385 					progname);
   2386 				cleanup();
   2387 				exit(1);
   2388 			}
   2389 			return -1;
   2390 		}
   2391 		return handle_new_child(tcp, childpid, 0);
   2392 	}
   2393 	return 1;
   2394 }
   2395 #endif
   2396 
   2397 static int
   2398 trace()
   2399 {
   2400 	int pid;
   2401 	int wait_errno;
   2402 	int status;
   2403 	struct tcb *tcp;
   2404 #ifdef LINUX
   2405 	struct rusage ru;
   2406 #ifdef __WALL
   2407 	static int wait4_options = __WALL;
   2408 #endif
   2409 #endif /* LINUX */
   2410 
   2411 	while (nprocs != 0) {
   2412 		if (interrupted)
   2413 			return 0;
   2414 		if (interactive)
   2415 			sigprocmask(SIG_SETMASK, &empty_set, NULL);
   2416 #ifdef LINUX
   2417 #ifdef __WALL
   2418 		pid = wait4(-1, &status, wait4_options, cflag ? &ru : NULL);
   2419 		if (pid < 0 && (wait4_options & __WALL) && errno == EINVAL) {
   2420 			/* this kernel does not support __WALL */
   2421 			wait4_options &= ~__WALL;
   2422 			errno = 0;
   2423 			pid = wait4(-1, &status, wait4_options,
   2424 					cflag ? &ru : NULL);
   2425 		}
   2426 		if (pid < 0 && !(wait4_options & __WALL) && errno == ECHILD) {
   2427 			/* most likely a "cloned" process */
   2428 			pid = wait4(-1, &status, __WCLONE,
   2429 					cflag ? &ru : NULL);
   2430 			if (pid == -1) {
   2431 				fprintf(stderr, "strace: clone wait4 "
   2432 						"failed: %s\n", strerror(errno));
   2433 			}
   2434 		}
   2435 #else
   2436 		pid = wait4(-1, &status, 0, cflag ? &ru : NULL);
   2437 #endif /* __WALL */
   2438 #endif /* LINUX */
   2439 #ifdef SUNOS4
   2440 		pid = wait(&status);
   2441 #endif /* SUNOS4 */
   2442 		wait_errno = errno;
   2443 		if (interactive)
   2444 			sigprocmask(SIG_BLOCK, &blocked_set, NULL);
   2445 
   2446 		if (pid == -1) {
   2447 			switch (wait_errno) {
   2448 			case EINTR:
   2449 				continue;
   2450 			case ECHILD:
   2451 				/*
   2452 				 * We would like to verify this case
   2453 				 * but sometimes a race in Solbourne's
   2454 				 * version of SunOS sometimes reports
   2455 				 * ECHILD before sending us SIGCHILD.
   2456 				 */
   2457 				return 0;
   2458 			default:
   2459 				errno = wait_errno;
   2460 				perror("strace: wait");
   2461 				return -1;
   2462 			}
   2463 		}
   2464 		if (pid == popen_pid) {
   2465 			if (WIFEXITED(status) || WIFSIGNALED(status))
   2466 				popen_pid = -1;
   2467 			continue;
   2468 		}
   2469 		if (debug)
   2470 			fprintf(stderr, " [wait(%#x) = %u]\n", status, pid);
   2471 
   2472 		/* Look up `pid' in our table. */
   2473 		if ((tcp = pid2tcb(pid)) == NULL) {
   2474 #ifdef LINUX
   2475 			if (followfork) {
   2476 				/* This is needed to go with the CLONE_PTRACE
   2477 				   changes in process.c/util.c: we might see
   2478 				   the child's initial trap before we see the
   2479 				   parent return from the clone syscall.
   2480 				   Leave the child suspended until the parent
   2481 				   returns from its system call.  Only then
   2482 				   will we have the association of parent and
   2483 				   child so that we know how to do clearbpt
   2484 				   in the child.  */
   2485 				tcp = alloctcb(pid);
   2486 				tcp->flags |= TCB_ATTACHED | TCB_SUSPENDED;
   2487 				if (!qflag)
   2488 					fprintf(stderr, "\
   2489 Process %d attached (waiting for parent)\n",
   2490 						pid);
   2491 			}
   2492 			else
   2493 				/* This can happen if a clone call used
   2494 				   CLONE_PTRACE itself.  */
   2495 #endif
   2496 			{
   2497 				fprintf(stderr, "unknown pid: %u\n", pid);
   2498 				if (WIFSTOPPED(status))
   2499 					ptrace(PTRACE_CONT, pid, (char *) 1, 0);
   2500 				exit(1);
   2501 			}
   2502 		}
   2503 		/* set current output file */
   2504 		outf = tcp->outf;
   2505 		curcol = tcp->curcol;
   2506 		if (cflag) {
   2507 #ifdef LINUX
   2508 			tv_sub(&tcp->dtime, &ru.ru_stime, &tcp->stime);
   2509 			tcp->stime = ru.ru_stime;
   2510 #endif /* !LINUX */
   2511 		}
   2512 
   2513 		if (tcp->flags & TCB_SUSPENDED) {
   2514 			/*
   2515 			 * Apparently, doing any ptrace() call on a stopped
   2516 			 * process, provokes the kernel to report the process
   2517 			 * status again on a subsequent wait(), even if the
   2518 			 * process has not been actually restarted.
   2519 			 * Since we have inspected the arguments of suspended
   2520 			 * processes we end up here testing for this case.
   2521 			 */
   2522 			continue;
   2523 		}
   2524 		if (WIFSIGNALED(status)) {
   2525 			if (pid == strace_child)
   2526 				exit_code = 0x100 | WTERMSIG(status);
   2527 			if (cflag != CFLAG_ONLY_STATS
   2528 			    && (qual_flags[WTERMSIG(status)] & QUAL_SIGNAL)) {
   2529 				printleader(tcp);
   2530 				tprintf("+++ killed by %s %s+++",
   2531 					signame(WTERMSIG(status)),
   2532 #ifdef WCOREDUMP
   2533 					WCOREDUMP(status) ? "(core dumped) " :
   2534 #endif
   2535 					"");
   2536 				printtrailer();
   2537 			}
   2538 #ifdef TCB_GROUP_EXITING
   2539 			handle_group_exit(tcp, -1);
   2540 #else
   2541 			droptcb(tcp);
   2542 #endif
   2543 			continue;
   2544 		}
   2545 		if (WIFEXITED(status)) {
   2546 			if (pid == strace_child)
   2547 				exit_code = WEXITSTATUS(status);
   2548 			if (debug)
   2549 				fprintf(stderr, "pid %u exited with %d\n", pid, WEXITSTATUS(status));
   2550 			if ((tcp->flags & (TCB_ATTACHED|TCB_STARTUP)) == TCB_ATTACHED
   2551 #ifdef TCB_GROUP_EXITING
   2552 			    && !(tcp->parent && (tcp->parent->flags & TCB_GROUP_EXITING))
   2553 			    && !(tcp->flags & TCB_GROUP_EXITING)
   2554 #endif
   2555 			) {
   2556 				fprintf(stderr,
   2557 					"PANIC: attached pid %u exited with %d\n",
   2558 					pid, WEXITSTATUS(status));
   2559 			}
   2560 			if (tcp == tcp_last) {
   2561 				if ((tcp->flags & (TCB_INSYSCALL|TCB_REPRINT)) == TCB_INSYSCALL)
   2562 					tprintf(" <unfinished ... exit status %d>\n",
   2563 						WEXITSTATUS(status));
   2564 				tcp_last = NULL;
   2565 			}
   2566 #ifdef TCB_GROUP_EXITING
   2567 			handle_group_exit(tcp, -1);
   2568 #else
   2569 			droptcb(tcp);
   2570 #endif
   2571 			continue;
   2572 		}
   2573 		if (!WIFSTOPPED(status)) {
   2574 			fprintf(stderr, "PANIC: pid %u not stopped\n", pid);
   2575 			droptcb(tcp);
   2576 			continue;
   2577 		}
   2578 		if (debug)
   2579 			fprintf(stderr, "pid %u stopped, [%s]\n",
   2580 				pid, signame(WSTOPSIG(status)));
   2581 
   2582 		if (ptrace_setoptions && (status >> 16)) {
   2583 			if (handle_ptrace_event(status, tcp) != 1)
   2584 				goto tracing;
   2585 		}
   2586 
   2587 		/*
   2588 		 * Interestingly, the process may stop
   2589 		 * with STOPSIG equal to some other signal
   2590 		 * than SIGSTOP if we happend to attach
   2591 		 * just before the process takes a signal.
   2592 		 * A no-MMU vforked child won't send up a signal,
   2593 		 * so skip the first (lost) execve notification.
   2594 		 */
   2595 		if ((tcp->flags & TCB_STARTUP) &&
   2596 		    (WSTOPSIG(status) == SIGSTOP || strace_vforked)) {
   2597 			/*
   2598 			 * This flag is there to keep us in sync.
   2599 			 * Next time this process stops it should
   2600 			 * really be entering a system call.
   2601 			 */
   2602 			tcp->flags &= ~TCB_STARTUP;
   2603 			if (tcp->flags & TCB_BPTSET) {
   2604 				/*
   2605 				 * One example is a breakpoint inherited from
   2606 				 * parent through fork ().
   2607 				 */
   2608 				if (clearbpt(tcp) < 0) /* Pretty fatal */ {
   2609 					droptcb(tcp);
   2610 					cleanup();
   2611 					return -1;
   2612 				}
   2613 			}
   2614 #ifdef LINUX
   2615 			if (followfork && (tcp->parent == NULL) && ptrace_setoptions)
   2616 				if (ptrace(PTRACE_SETOPTIONS, tcp->pid,
   2617 					   NULL, ptrace_setoptions) < 0 &&
   2618 				    errno != ESRCH)
   2619 					ptrace_setoptions = 0;
   2620 #endif
   2621 			goto tracing;
   2622 		}
   2623 
   2624 		if (WSTOPSIG(status) != SIGTRAP) {
   2625 			if (WSTOPSIG(status) == SIGSTOP &&
   2626 					(tcp->flags & TCB_SIGTRAPPED)) {
   2627 				/*
   2628 				 * Trapped attempt to block SIGTRAP
   2629 				 * Hope we are back in control now.
   2630 				 */
   2631 				tcp->flags &= ~(TCB_INSYSCALL | TCB_SIGTRAPPED);
   2632 				if (ptrace_restart(PTRACE_SYSCALL, tcp, 0) < 0) {
   2633 					cleanup();
   2634 					return -1;
   2635 				}
   2636 				continue;
   2637 			}
   2638 			if (cflag != CFLAG_ONLY_STATS
   2639 			    && (qual_flags[WSTOPSIG(status)] & QUAL_SIGNAL)) {
   2640 				siginfo_t si;
   2641 #if defined(PT_CR_IPSR) && defined(PT_CR_IIP)
   2642 				long pc = 0;
   2643 				long psr = 0;
   2644 
   2645 				upeek(tcp, PT_CR_IPSR, &psr);
   2646 				upeek(tcp, PT_CR_IIP, &pc);
   2647 
   2648 # define PSR_RI	41
   2649 				pc += (psr >> PSR_RI) & 0x3;
   2650 # define PC_FORMAT_STR	" @ %lx"
   2651 # define PC_FORMAT_ARG	pc
   2652 #else
   2653 # define PC_FORMAT_STR	"%s"
   2654 # define PC_FORMAT_ARG	""
   2655 #endif
   2656 				printleader(tcp);
   2657 				if (ptrace(PTRACE_GETSIGINFO, pid, 0, &si) == 0) {
   2658 					tprintf("--- ");
   2659 					printsiginfo(&si, verbose(tcp));
   2660 					tprintf(" (%s)" PC_FORMAT_STR " ---",
   2661 						strsignal(WSTOPSIG(status)),
   2662 						PC_FORMAT_ARG);
   2663 				} else
   2664 					tprintf("--- %s by %s" PC_FORMAT_STR " ---",
   2665 						strsignal(WSTOPSIG(status)),
   2666 						signame(WSTOPSIG(status)),
   2667 						PC_FORMAT_ARG);
   2668 				printtrailer();
   2669 			}
   2670 			if (((tcp->flags & TCB_ATTACHED) ||
   2671 			     tcp->nclone_threads > 0) &&
   2672 				!sigishandled(tcp, WSTOPSIG(status))) {
   2673 #ifdef TCB_GROUP_EXITING
   2674 				handle_group_exit(tcp, WSTOPSIG(status));
   2675 #else
   2676 				detach(tcp, WSTOPSIG(status));
   2677 #endif
   2678 				continue;
   2679 			}
   2680 			if (ptrace_restart(PTRACE_SYSCALL, tcp, WSTOPSIG(status)) < 0) {
   2681 				cleanup();
   2682 				return -1;
   2683 			}
   2684 			tcp->flags &= ~TCB_SUSPENDED;
   2685 			continue;
   2686 		}
   2687 		/* we handled the STATUS, we are permitted to interrupt now. */
   2688 		if (interrupted)
   2689 			return 0;
   2690 		if (trace_syscall(tcp) < 0 && !tcp->ptrace_errno) {
   2691 			/* ptrace() failed in trace_syscall() with ESRCH.
   2692 			 * Likely a result of process disappearing mid-flight.
   2693 			 * Observed case: exit_group() terminating
   2694 			 * all processes in thread group. In this case, threads
   2695 			 * "disappear" in an unpredictable moment without any
   2696 			 * notification to strace via wait().
   2697 			 */
   2698 			if (tcp->flags & TCB_ATTACHED) {
   2699 				if (tcp_last) {
   2700 					/* Do we have dangling line "syscall(param, param"?
   2701 					 * Finish the line then. We cannot
   2702 					 */
   2703 					tcp_last->flags |= TCB_REPRINT;
   2704 					tprintf(" <unfinished ...>");
   2705 					printtrailer();
   2706 				}
   2707 				detach(tcp, 0);
   2708 			} else {
   2709 				ptrace(PTRACE_KILL,
   2710 					tcp->pid, (char *) 1, SIGTERM);
   2711 				droptcb(tcp);
   2712 			}
   2713 			continue;
   2714 		}
   2715 		if (tcp->flags & TCB_EXITING) {
   2716 #ifdef TCB_GROUP_EXITING
   2717 			if (tcp->flags & TCB_GROUP_EXITING) {
   2718 				if (handle_group_exit(tcp, 0) < 0)
   2719 					return -1;
   2720 				continue;
   2721 			}
   2722 #endif
   2723 			if (tcp->flags & TCB_ATTACHED)
   2724 				detach(tcp, 0);
   2725 			else if (ptrace_restart(PTRACE_CONT, tcp, 0) < 0) {
   2726 				cleanup();
   2727 				return -1;
   2728 			}
   2729 			continue;
   2730 		}
   2731 		if (tcp->flags & TCB_SUSPENDED) {
   2732 			if (!qflag)
   2733 				fprintf(stderr, "Process %u suspended\n", pid);
   2734 			continue;
   2735 		}
   2736 	tracing:
   2737 		/* Remember current print column before continuing. */
   2738 		tcp->curcol = curcol;
   2739 		if (ptrace_restart(PTRACE_SYSCALL, tcp, 0) < 0) {
   2740 			cleanup();
   2741 			return -1;
   2742 		}
   2743 	}
   2744 	return 0;
   2745 }
   2746 
   2747 #endif /* !USE_PROCFS */
   2748 
   2749 #include <stdarg.h>
   2750 
   2751 void
   2752 tprintf(const char *fmt, ...)
   2753 {
   2754 	va_list args;
   2755 
   2756 	va_start(args, fmt);
   2757 	if (outf) {
   2758 		int n = vfprintf(outf, fmt, args);
   2759 		if (n < 0) {
   2760 			if (outf != stderr)
   2761 				perror(outfname == NULL
   2762 				       ? "<writing to pipe>" : outfname);
   2763 		} else
   2764 			curcol += n;
   2765 	}
   2766 	va_end(args);
   2767 	return;
   2768 }
   2769 
   2770 void
   2771 printleader(tcp)
   2772 struct tcb *tcp;
   2773 {
   2774 	if (tcp_last) {
   2775 		if (tcp_last->ptrace_errno) {
   2776 			if (tcp_last->flags & TCB_INSYSCALL) {
   2777 				tprintf(" <unavailable>)");
   2778 				tabto(acolumn);
   2779 			}
   2780 			tprintf("= ? <unavailable>\n");
   2781 			tcp_last->ptrace_errno = 0;
   2782 		} else if (!outfname || followfork < 2 || tcp_last == tcp) {
   2783 			tcp_last->flags |= TCB_REPRINT;
   2784 			tprintf(" <unfinished ...>\n");
   2785 		}
   2786 	}
   2787 	curcol = 0;
   2788 	if ((followfork == 1 || pflag_seen > 1) && outfname)
   2789 		tprintf("%-5d ", tcp->pid);
   2790 	else if (nprocs > 1 && !outfname)
   2791 		tprintf("[pid %5u] ", tcp->pid);
   2792 	if (tflag) {
   2793 		char str[sizeof("HH:MM:SS")];
   2794 		struct timeval tv, dtv;
   2795 		static struct timeval otv;
   2796 
   2797 		gettimeofday(&tv, NULL);
   2798 		if (rflag) {
   2799 			if (otv.tv_sec == 0)
   2800 				otv = tv;
   2801 			tv_sub(&dtv, &tv, &otv);
   2802 			tprintf("%6ld.%06ld ",
   2803 				(long) dtv.tv_sec, (long) dtv.tv_usec);
   2804 			otv = tv;
   2805 		}
   2806 		else if (tflag > 2) {
   2807 			tprintf("%ld.%06ld ",
   2808 				(long) tv.tv_sec, (long) tv.tv_usec);
   2809 		}
   2810 		else {
   2811 			time_t local = tv.tv_sec;
   2812 			strftime(str, sizeof(str), "%T", localtime(&local));
   2813 			if (tflag > 1)
   2814 				tprintf("%s.%06ld ", str, (long) tv.tv_usec);
   2815 			else
   2816 				tprintf("%s ", str);
   2817 		}
   2818 	}
   2819 	if (iflag)
   2820 		printcall(tcp);
   2821 }
   2822 
   2823 void
   2824 tabto(col)
   2825 int col;
   2826 {
   2827 	if (curcol < col)
   2828 		tprintf("%*s", col - curcol, "");
   2829 }
   2830 
   2831 void
   2832 printtrailer(void)
   2833 {
   2834 	tprintf("\n");
   2835 	tcp_last = NULL;
   2836 }
   2837 
   2838 #ifdef HAVE_MP_PROCFS
   2839 
   2840 int
   2841 mp_ioctl(int fd, int cmd, void *arg, int size)
   2842 {
   2843 	struct iovec iov[2];
   2844 	int n = 1;
   2845 
   2846 	iov[0].iov_base = &cmd;
   2847 	iov[0].iov_len = sizeof cmd;
   2848 	if (arg) {
   2849 		++n;
   2850 		iov[1].iov_base = arg;
   2851 		iov[1].iov_len = size;
   2852 	}
   2853 
   2854 	return writev(fd, iov, n);
   2855 }
   2856 
   2857 #endif
   2858