1 /*
2 * Copyright (c) 1983, 1986, 1987, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1983, 1986, 1987, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)bugfiler.c 8.1 (Berkeley) 06/04/93";
16 #endif /* not lint */
17
18 /*
19 * Bug report processing program, designed to be invoked
20 * through aliases(5).
21 */
22 #include <sys/param.h>
23 #include <sys/time.h>
24 #include <sys/stat.h>
25
26 #include <dirent.h>
27 #include <pwd.h>
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <unistd.h>
32
33 #include "bug.h"
34 #include "extern.h"
35
36 char bfr[MAXBSIZE], /* general I/O buffer */
37 tmpname[sizeof(TMP_BUG) + 5]; /* temp bug file */
38
39 static void logit __P((void));
40 static void make_copy __P((void));
41
42 int
main(argc,argv)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
54 do_ack = do_redist = YES;
55 argversion = NULL;
56 while ((ch = getopt(argc, argv, "av:r")) != EOF)
57 switch(ch) {
58 case 'a':
59 do_ack = NO;
60 break;
61 case 'v':
62 argversion = optarg;
63 break;
64 case 'r':
65 do_redist = NO;
66 break;
67 case '?':
68 default:
69 fputs("usage: bugfiler [-ar] [-v version]\n", stderr);
70 error("usage: bugfiler [-ar] [-v version]", CHN);
71 }
72
73 if (!(pwd = getpwnam(BUGS_ID)))
74 error("can't find bugs login.", BUGS_ID);
75
76 if (chdir(pwd->pw_dir)) /* change to bugs home directory */
77 error("can't chdir to %s.", pwd->pw_dir);
78
79 if (seteuid(pwd->pw_uid))
80 error("can't set id to %s.", BUGS_ID);
81
82 (void)umask(02); /* everything is 664 */
83 seterr(); /* redirect to log file */
84 logit(); /* log report arrival */
85 make_copy(); /* save copy in case */
86 gethead(do_redist);
87
88 if (argversion) /* specific folder requested */
89 (void)strcpy(dir, argversion);
90
91 process();
92
93 if (seteuid(0))
94 error("can't set id to root.", CHN);
95 if (do_ack)
96 reply();
97 if (do_redist)
98 redist();
99 (void)unlink(tmpname);
100 exit(OK);
101 }
102
103 /*
104 * make_copy --
105 * make a copy of bug report in error folder
106 */
107 static void
make_copy()108 make_copy()
109 {
110 register int cnt, /* read return value */
111 tfd; /* temp file descriptor */
112
113 if (access(TMP_DIR, F_OK))
114 (void)mkdir(TMP_DIR, S_IRWXU|S_IRWXG|S_IROTH|S_IXOTH);
115 (void)strcpy(tmpname, TMP_BUG);
116 if (tfd = mkstemp(tmpname)) {
117 while ((cnt = read(fileno(stdin),
118 bfr, sizeof(bfr))) != ERR && cnt)
119 write(tfd, bfr, cnt);
120 (void)close(tfd);
121 return;
122 }
123 error("can't make copy using %s.", tmpname);
124 }
125
126 /*
127 * logit --
128 * log this run of the bugfiler
129 */
130 static void
logit()131 logit()
132 {
133 struct timeval tp;
134 char *C1, *C2;
135
136 if (gettimeofday(&tp, (struct timezone *)NULL))
137 error("can't get time of day.", CHN);
138 for (C1 = C2 = ctime(&tp.tv_sec); *C1 && *C1 != '\n'; ++C1);
139 *C1 = EOS;
140 fputs(C2, stderr);
141 }
142