|
|
1.1 root 1: /*
2: * Copyright (c) 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: static char sccsid[] = "@(#)gethead.c 5.6 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include <bug.h>
23: #include <sys/stat.h>
24: #include <stdio.h>
25:
26: static int chk1(), pbuf();
27:
28: #define ENT(X) sizeof(X) - 1, X
29: HEADER mailhead[] = { /* mail headers */
30: { NO, YES, NULL, ENT("Date:"), },
31: { NO, NO, NULL, ENT("From "), },
32: { NO, YES, NULL, ENT("From:"), },
33: { NO, NO, chk1, ENT("Index:"), },
34: { NO, YES, NULL, ENT("Message-Id:"), },
35: { NO, YES, NULL, ENT("Reply-To:"), },
36: { NO, YES, NULL, ENT("Return-Path:"), },
37: { NO, NO, pbuf, ENT("Subject:"), },
38: { NO, YES, NULL, ENT("To:"), },
39: { NO, NO, NULL, ENT("Apparently-To:"), },
40: { ERR, }
41: };
42:
43: FILE *dfp; /* distf file pointer */
44: char dir[MAXNAMLEN], /* subject and folder */
45: folder[MAXNAMLEN];
46:
47: /*
48: * gethead --
49: * read mail and bug headers from bug report, construct redist headers
50: */
51: gethead(redist)
52: int redist;
53: {
54: register HEADER *hp; /* mail header pointer */
55: char *strcpy(), *malloc();
56:
57: if (redist) {
58: int fd;
59: char *distf;
60:
61: distf = "/tmp/BUG_XXXXXX";
62: if (!(fd = mkstemp(distf)) || !(dfp = fdopen(fd, "w+")))
63: error("can't create redistribution file %s.", distf);
64: /* disappear after last reference is closed */
65: (void)unlink(distf);
66: }
67: if (!freopen(tmpname, "r", stdin))
68: error("can't read temporary bug file %s.", tmpname);
69:
70: while (fgets(bfr, sizeof(bfr), stdin)) {
71: for (hp = mailhead; hp->found != ERR; ++hp)
72: if (!hp->found)
73: if (!strncmp(hp->tag, bfr, hp->len)) {
74: if (hp->valid && !((*(hp->valid))(bfr)))
75: break;
76: if (!(hp->line = malloc((u_int)(strlen(bfr) + 1))))
77: error("malloc failed.", CHN);
78: (void)strcpy(hp->line, bfr);
79: hp->found = YES;
80: break;
81: }
82: if ((hp->found == ERR || hp->redist) && redist)
83: fputs(bfr, dfp);
84: }
85:
86: if (!mailhead[INDX_TAG].found)
87: error("no readable \"Index:\" header in bug report.", CHN);
88: }
89:
90: /*
91: * chk1 --
92: * parse the "Index:" line into folder and directory
93: */
94: static
95: chk1(line)
96: char *line;
97: {
98: register char *C; /* tmp pointer */
99: struct stat sbuf; /* existence check */
100: char *index();
101:
102: if (sscanf(line, " Index: %s %s ", folder, dir) != 2)
103: return(NO);
104: if (C = index(folder, '/')) { /* deal with "bin/from.c" */
105: if (C == folder)
106: return(NO);
107: *C = EOS;
108: }
109: if (stat(dir, &sbuf) || (sbuf.st_mode & S_IFMT) != S_IFDIR)
110: return(NO);
111: (void)pbuf(line);
112: return(YES);
113: }
114:
115: /*
116: * pbuf --
117: * kludge so that summary file looks pretty
118: */
119: static
120: pbuf(line)
121: char *line;
122: {
123: register char *rp, /* tmp pointers */
124: *wp;
125:
126: for (rp = line; *rp == ' ' || *rp == '\t'; ++rp);
127: for (wp = line; *rp; ++wp) {
128: if ((*wp = *rp++) != ' ' && *wp != '\t')
129: continue;
130: *wp = ' ';
131: while (*rp == ' ' || *rp == '\t')
132: ++rp;
133: }
134: if (wp[-1] == ' ') /* wp can't == line */
135: --wp;
136: *wp = EOS;
137: return(YES);
138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.