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