|
|
1.1 root 1: /*
2: * Copyright (c) 1983, 1986, 1987 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1983, 1986, 1987 Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)bugfiler.c 5.15 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: /*
31: * Bug report processing program, designed to be invoked
32: * through aliases(5).
33: */
34: #include <bug.h>
35: #include <sys/time.h>
36: #include <sys/file.h>
37: #include <pwd.h>
38: #include <stdio.h>
39:
40: char bfr[MAXBSIZE], /* general I/O buffer */
41: tmpname[sizeof(TMP_BUG) + 5]; /* temp bug file */
42:
43: main(argc, argv)
44: int argc;
45: char **argv;
46: {
47: extern char *optarg; /* getopt arguments */
48: register struct passwd *pwd; /* bugs password entry */
49: register int ch; /* getopts char */
50: int do_ack, /* acknowledge bug report */
51: do_redist; /* redistribut BR */
52: char *argversion, /* folder name provided */
53: *strcpy();
54: struct passwd *getpwnam();
55:
56: do_ack = do_redist = YES;
57: argversion = NULL;
58: while ((ch = getopt(argc, argv, "av:r")) != EOF)
59: switch((char)ch) {
60: case 'a':
61: do_ack = NO;
62: break;
63: case 'v':
64: argversion = optarg;
65: break;
66: case 'r':
67: do_redist = NO;
68: break;
69: case '?':
70: default:
71: fputs("usage: bugfiler [-ar] [-v version]\n", stderr);
72: error("usage: bugfiler [-ar] [-v version]", CHN);
73: }
74:
75: if (!(pwd = getpwnam(BUGS_ID)))
76: error("can't find bugs login.", BUGS_ID);
77:
78: if (chdir(pwd->pw_dir)) /* change to bugs home directory */
79: error("can't chdir to %s.", pwd->pw_dir);
80:
81: if (setreuid(0, pwd->pw_uid))
82: error("can't set id to %s.", BUGS_ID);
83:
84: (void)umask(02); /* everything is 664 */
85: seterr(); /* redirect to log file */
86: logit(); /* log report arrival */
87: make_copy(); /* save copy in case */
88: gethead(do_redist);
89:
90: if (argversion) /* specific folder requested */
91: (void)strcpy(dir, argversion);
92:
93: process();
94:
95: if (setuid(0, 0))
96: error("can't set id to root.", CHN);
97: if (do_ack)
98: reply();
99: if (do_redist)
100: redist();
101: (void)unlink(tmpname);
102: exit(OK);
103: }
104:
105: /*
106: * make_copy --
107: * make a copy of bug report in error folder
108: */
109: static
110: make_copy()
111: {
112: register int cnt, /* read return value */
113: tfd; /* temp file descriptor */
114: char *strcpy();
115:
116: if (access(TMP_DIR, F_OK)) {
117: (void)mkdir(TMP_DIR);
118: (void)chmod(TMP_DIR, 0775);
119: }
120: (void)strcpy(tmpname, TMP_BUG);
121: if (tfd = mkstemp(tmpname)) {
122: while ((cnt = read(fileno(stdin), bfr, sizeof(bfr))) != ERR && cnt)
123: write(tfd, bfr, cnt);
124: (void)close(tfd);
125: return;
126: }
127: error("can't make copy using %s.", tmpname);
128: }
129:
130: /*
131: * logit --
132: * log this run of the bugfiler
133: */
134: static
135: logit()
136: {
137: struct timeval tp;
138: char *C1, *C2,
139: *ctime();
140:
141: if (gettimeofday(&tp, (struct timezone *)NULL))
142: error("can't get time of day.", CHN);
143: for (C1 = C2 = ctime(&tp.tv_sec); *C1 && *C1 != '\n'; ++C1);
144: *C1 = EOS;
145: fputs(C2, stderr);
146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.