xref: /csrg-svn/usr.bin/ktrace/ktrace.c (revision 44584)
1*44584Smarc /*-
236426Smarc  * Copyright (c) 1988 The Regents of the University of California.
336426Smarc  * All rights reserved.
436426Smarc  *
5*44584Smarc  * %sccs.include.redist.c%
636426Smarc  */
736426Smarc 
836426Smarc #ifndef lint
936426Smarc char copyright[] =
1036426Smarc "@(#) Copyright (c) 1988 The Regents of the University of California.\n\
1136426Smarc  All rights reserved.\n";
1236426Smarc #endif /* not lint */
1336426Smarc 
1436426Smarc #ifndef lint
15*44584Smarc static char sccsid[] = "@(#)ktrace.c	1.5 (Berkeley) 06/29/90";
1636426Smarc #endif /* not lint */
1736426Smarc 
1836462Smarc #include "ktrace.h"
1936426Smarc 
2036462Smarc #define USAGE \
21*44584Smarc  "usage: ktrace [-acid] [-f trfile] [-t trpoints] [-p pid] [-g pgid]\n\
2240361Smarc 	trops: c = syscalls, n = namei, g = generic-i/o, a = everything\n\
2340361Smarc 	ktrace -C (clear everthing)\n"
2436462Smarc 
2536427Smarc 
2636462Smarc char	*tracefile = DEF_TRACEFILE;
2740361Smarc int	append, clear, descend, inherit;
2836427Smarc 
2936426Smarc main(argc, argv)
3036426Smarc 	char *argv[];
3136426Smarc {
3236426Smarc 	extern int optind;
3336426Smarc 	extern char *optarg;
34*44584Smarc 	int trpoints = ALL_POINTS;
3536426Smarc 	int ops = 0;
3636462Smarc 	int pid = 0;
3736426Smarc 	int ch;
3836426Smarc 
3940361Smarc 	while ((ch = getopt(argc,argv,"Cacdp:g:if:t:")) != EOF)
4036426Smarc 		switch((char)ch) {
4140361Smarc 		case 'C':
4240361Smarc 			clear = 2;
4340361Smarc 			break;
4440361Smarc 		case 'c':
4540361Smarc 			clear = 1;
4640361Smarc 			break;
4740361Smarc 		case 'd':
4840361Smarc 			ops |= KTRFLAG_DESCEND;
4940361Smarc 			break;
5040361Smarc 		case 't':
51*44584Smarc 			trpoints = getpoints(optarg);
52*44584Smarc 			if (trpoints < 0) {
5340361Smarc 				fprintf(stderr,
5440361Smarc 				    "ktrace: unknown facility in %s\n",
5540361Smarc 			 	     optarg);
5640361Smarc 				exit(1);
5740361Smarc 			}
5840361Smarc 			break;
5940361Smarc 		case 'p':
6040361Smarc 			pid = atoi(optarg);
6140361Smarc 			break;
6240361Smarc 		case 'g':
6340361Smarc 			pid = -atoi(optarg);
6440361Smarc 			break;
6540361Smarc 		case 'i':
6640361Smarc 			inherit++;
6740361Smarc 			break;
6840361Smarc 		case 'f':
6940361Smarc 			tracefile = optarg;
7040361Smarc 			break;
7140361Smarc 		case 'a':
7240361Smarc 			append++;
7340361Smarc 			break;
7440361Smarc 		default:
7540361Smarc 			fprintf(stderr,"usage: \n",*argv);
7640361Smarc 			exit(-1);
7736426Smarc 		}
7836426Smarc 	argv += optind, argc -= optind;
7936426Smarc 
8040361Smarc 	if (inherit)
81*44584Smarc 		trpoints |= KTRFAC_INHERIT;
8236462Smarc 	if (clear) {			/* untrace something */
8340361Smarc 		if (clear == 2) {	/* -C */
8440361Smarc 			ops = KTROP_CLEAR | KTRFLAG_DESCEND;
8540361Smarc 			pid = 1;
8640361Smarc 		} else {
8740361Smarc 			ops |= pid ? KTROP_CLEAR : KTROP_CLEARFILE;
8840361Smarc 		}
89*44584Smarc 		if (ktrace(tracefile, ops, trpoints, pid) < 0) {
9036462Smarc 			perror("ktrace");
9136462Smarc 			exit(1);
9236462Smarc 		}
9336426Smarc 		exit(0);
9436426Smarc 	}
9536462Smarc 
9636462Smarc 	if (pid == 0 && !*argv) {	/* nothing to trace */
9736462Smarc 		fprintf(stderr, USAGE);
9836462Smarc 		exit(1);
9936462Smarc 	}
10036462Smarc 
10136462Smarc 	close(open(tracefile, O_WRONLY | O_CREAT, 0666));
10236427Smarc 	if (!append)
10336427Smarc 		close(open(tracefile, O_WRONLY | O_TRUNC));
10436426Smarc 	if (!*argv) {
105*44584Smarc 		if (ktrace(tracefile, ops, trpoints, pid) < 0) {
10636426Smarc 			perror("ktrace");
10736426Smarc 			exit(1);
10836426Smarc 		}
10936426Smarc 	} else {
11036426Smarc 		pid = getpid();
111*44584Smarc 		if (ktrace(tracefile, ops, trpoints, pid) < 0) {
11236426Smarc 			perror("ktrace");
11336426Smarc 			exit(1);
11436426Smarc 		}
11536426Smarc 		execvp(argv[0], &argv[0]);
11636426Smarc 		perror("ktrace: exec failed");
11736426Smarc 	}
11836426Smarc 	exit(0);
11936426Smarc }
120