|
|
1.1 root 1: /*
2: * $Header: auditon.c,v 1.1 85/07/08 08:29:15 root Exp $
3: *
4: * $Log: auditon.c,v $
5: * Revision 1.1 85/07/08 08:29:15 root
6: * Initial revision
7: *
8: * Revision 1.4 84/10/08 16:33:44 guy
9: * Changed to print the reason a system call failed.
10: *
11: * Revision 1.3 84/03/28 09:38:25 root
12: * Added a -q (query) option to allow the user to ask the current audit trail
13: * log file. Also made it complain about attempts to log to a directory.
14: *
15: * Revision 1.2 84/03/10 17:00:28 brian
16: * Added code to log the currentldy active log file.
17: *
18: */
19:
20: static char rcsid[] = "$Header: auditon.c,v 1.1 85/07/08 08:29:15 root Exp $";
21:
22: /*
23: * auditon - calls 'audon' syscall with super-user privileges
24: */
25: #include <stdio.h>
26: #include <sys/param.h>
27: #include <sys/stat.h>
28: #include <sys/dir.h>
29: #include <errno.h>
30:
31: #define ROOT 0
32: #define ERROR -1
33: #define PATHLEN 512
34: #define DEFLTAUD "/usr/adm/audit"
35: #define AUDFILELOG "/usr/adm/audfile.log"
36: char *audfile;
37: struct stat buf;
38: int uid;
39:
40: struct stat d, dd;
41: struct direct dir;
42:
43: char dot[] = ".";
44: char dotdot[] = "..";
45: char result[PATHLEN];
46:
47: char name[PATHLEN];
48: int file;
49: int off = 0;
50: int optind;
51:
52: main(argc,argv)
53: int argc;
54: char **argv;
55: {
56: register int fd;
57: register char c;
58: extern int errno;
59: char *getwd();
60: if( (uid=getuid()) != ROOT)
61: {
62: fprintf(stderr,"%s: must be superuser\n",argv[0]);
63: exit(1);
64: }
65:
66: while((c = getopt(argc,argv,"q")) != EOF)
67: {
68: switch (c)
69: {
70: case 'q':
71: query();
72: exit(0);
73: default:
74: printf("usage: auditon [-q] [file]\n");
75: exit(1);
76: }
77: }
78: if(optind < argc )
79: {
80: if(*(argv[optind]) != '/')
81: {
82: audfile = getwd(name);
83: if(strcmp(audfile,"/") != 0)
84: strncat(audfile,"/",PATHLEN);
85: strncat(audfile,argv[optind],PATHLEN);
86: }
87: else
88: audfile = argv[optind];
89: }
90: else
91: audfile = DEFLTAUD;
92:
93: if(stat(audfile,&buf) == ERROR) {
94: if(errno == ENOENT){
95: if(creat(audfile,0600) == ERROR){
96: fprintf(stderr,"%s: cannot create %s\n",
97: argv[0],audfile);
98: exit(8);
99: }
100: }
101: else{
102: fprintf(stderr,"%s: cannot open ",argv[0]);
103: perror(audfile);
104: exit(1);
105: }
106: }
107: if((buf.st_mode & S_IFMT) == S_IFDIR)
108: {
109: fprintf(stderr,"%s: %s is a directory\n",argv[0],audfile);
110: exit(1);
111: }
112:
113: if(audon(audfile) == ERROR) {
114: if(errno == EBUSY)
115: fprintf(stderr,"%s: already logging to %s\n",argv[0],audfile);
116: else
117: {
118: perror(argv[0]);
119: fprintf(stderr,"%s: auditing not enabled\n",argv[0]);
120: }
121: exit(1);
122: }
123:
124: if((fd = creat(AUDFILELOG,0600)) == ERROR){
125: fprintf(stderr,"%s: cannot create %s\n",
126: argv[0],AUDFILELOG);
127: audon((char *) NULL);
128: fprintf(stderr,"%s: auditing not enabled\n",argv[0]);
129: exit(8);
130: }
131: if(write(fd,audfile,strlen(audfile)) < strlen(audfile))
132: {
133: fprintf(stderr,"%s: cannot write to %s\n",
134: argv[0],AUDFILELOG);
135: audon((char *) NULL);
136: fprintf(stderr,"%s: auditing not enabled\n",argv[0]);
137: exit(8);
138: }
139: fprintf(stderr,"%s: auditing ON.\tFile used = %s\n\n",argv[0],audfile);
140: }
141:
142: /*
143: * Report currently active audit trail logfile
144: */
145:
146: query()
147: {
148: register int fd, cnt;
149: extern int errno;
150: char buf[PATHLEN];
151:
152: if((fd = open(AUDFILELOG,0)) == ERROR)
153: {
154: if(errno == ENOENT)
155: {
156: printf("auditon: Audit trail facility currently not enabled\n");
157: return;
158: }
159: else
160: {
161: fprintf(stderr,"auditon: cannot open %s\n", AUDFILELOG);
162: exit(8);
163: }
164: }
165: if((cnt = read(fd,buf,PATHLEN)) == ERROR)
166: {
167: fprintf(stderr,"auditon: cannot read %s\n", AUDFILELOG);
168: exit(8);
169: }
170: buf[cnt] = '\0'; /* terminate string with null */
171: printf("auditon: The current audit trail log file is %s\n",buf);
172: return;
173: }
174:
175:
176:
177: cat(path)
178: register char *path;
179: {
180: register i, j;
181:
182: i = -1;
183: while ((dir.d_name[++i] != 0) && (i < 14));
184: if ((off+i+2) > (PATHLEN-1))
185: return;
186: for(j=off+1; j>=0; --j)
187: path[j+i+1] = path[j];
188: off=i+off+1;
189: path[i] = '/';
190: for(--i; i>=0; --i)
191: path[i] = dir.d_name[i];
192: }
193: /* @(#)getopt.c 1.5 */
194: /* 3.0 SID # 1.2 */
195: /*LINTLIBRARY*/
196: #define NULL 0
197: #define EOF (-1)
198: #define ERR(s, c) if(opterr){\
199: extern int strlen(), write();\
200: char errbuf[2];\
201: errbuf[0] = c; errbuf[1] = '\n';\
202: (void) write(2, argv[0], (unsigned)strlen(argv[0]));\
203: (void) write(2, s, (unsigned)strlen(s));\
204: (void) write(2, errbuf, 2);}
205:
206: extern int strcmp();
207: extern char *strchr();
208:
209: int opterr = 1;
210: int optopt;
211: int optind = 1;
212: char *optarg;
213:
214: int
215: getopt(argc, argv, opts)
216: int argc;
217: char **argv, *opts;
218: {
219: static int sp = 1;
220: register int c;
221: register char *cp;
222:
223: if(sp == 1)
224: if(optind >= argc ||
225: argv[optind][0] != '-' || argv[optind][1] == '\0')
226: return(EOF);
227: else if(strcmp(argv[optind], "--") == NULL) {
228: optind++;
229: return(EOF);
230: }
231: optopt = c = argv[optind][sp];
232: if(c == ':' || (cp=strchr(opts, c)) == NULL) {
233: ERR(": illegal option -- ", c);
234: if(argv[optind][++sp] == '\0') {
235: optind++;
236: sp = 1;
237: }
238: return('?');
239: }
240: if(*++cp == ':') {
241: if(argv[optind][sp+1] != '\0')
242: optarg = &argv[optind++][sp+1];
243: else if(++optind >= argc) {
244: ERR(": option requires an argument -- ", c);
245: sp = 1;
246: return('?');
247: } else
248: optarg = argv[optind++];
249: sp = 1;
250: } else {
251: if(argv[optind][++sp] == '\0') {
252: sp = 1;
253: optind++;
254: }
255: optarg = NULL;
256: }
257: return(c);
258: }
259: /* @(#)strchr.c 1.2 */
260: /* 3.0 SID # 1.2 */
261: /*LINTLIBRARY*/
262: /*
263: * Return the ptr in sp at which the character c appears;
264: * NULL if not found
265: */
266:
267: #define NULL 0
268:
269: char *
270: strchr(sp, c)
271: register char *sp, c;
272: {
273: do {
274: if(*sp == c)
275: return(sp);
276: } while(*sp++);
277: return(NULL);
278: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.