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 the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 char copyright[] = 20 "@(#) Copyright (c) 1983, 1986, 1987 Regents of the University of California.\n\ 21 All rights reserved.\n"; 22 #endif /* not lint */ 23 24 #ifndef lint 25 static char sccsid[] = "@(#)bugfiler.c 5.14 (Berkeley) 06/29/88"; 26 #endif /* not lint */ 27 28 /* 29 * Bug report processing program, designed to be invoked 30 * through aliases(5). 31 */ 32 #include <bug.h> 33 #include <sys/time.h> 34 #include <sys/file.h> 35 #include <pwd.h> 36 #include <stdio.h> 37 38 char bfr[MAXBSIZE], /* general I/O buffer */ 39 tmpname[sizeof(TMP_BUG) + 5]; /* temp bug file */ 40 41 main(argc, argv) 42 int argc; 43 char **argv; 44 { 45 extern char *optarg; /* getopt arguments */ 46 register struct passwd *pwd; /* bugs password entry */ 47 register int ch; /* getopts char */ 48 int do_ack, /* acknowledge bug report */ 49 do_redist; /* redistribut BR */ 50 char *argversion, /* folder name provided */ 51 *strcpy(); 52 struct passwd *getpwnam(); 53 54 do_ack = do_redist = YES; 55 argversion = NULL; 56 while ((ch = getopt(argc, argv, "av:r")) != EOF) 57 switch((char)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 (setreuid(0, 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 (setuid(0, 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 108 make_copy() 109 { 110 register int cnt, /* read return value */ 111 tfd; /* temp file descriptor */ 112 char *strcpy(); 113 114 if (access(TMP_DIR, F_OK)) { 115 (void)mkdir(TMP_DIR); 116 (void)chmod(TMP_DIR, 0775); 117 } 118 (void)strcpy(tmpname, TMP_BUG); 119 if (tfd = mkstemp(tmpname)) { 120 while ((cnt = read(fileno(stdin), bfr, sizeof(bfr))) != ERR && cnt) 121 write(tfd, bfr, cnt); 122 (void)close(tfd); 123 return; 124 } 125 error("can't make copy using %s.", tmpname); 126 } 127 128 /* 129 * logit -- 130 * log this run of the bugfiler 131 */ 132 static 133 logit() 134 { 135 struct timeval tp; 136 char *C1, *C2, 137 *ctime(); 138 139 if (gettimeofday(&tp, (struct timezone *)NULL)) 140 error("can't get time of day.", CHN); 141 for (C1 = C2 = ctime(&tp.tv_sec); *C1 && *C1 != '\n'; ++C1); 142 *C1 = EOS; 143 fputs(C2, stderr); 144 } 145