date and time created 86/11/25 13:36:02 by bostic
[unix-history] / usr / src / libexec / bugfiler / gethead.c
CommitLineData
07a70c1c
KB
1/*
2 * Copyright (c) 1986 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 */
6
7#ifndef lint
8static char sccsid[] = "@(#)gethead.c 5.1 (Berkeley) 86/11/25";
9#endif not lint
10
11#include <bug.h>
12#include <sys/stat.h>
13#include <sys/dir.h>
14#include <stdio.h>
15
16static int chk1();
17
18#define ENT(X) sizeof(X) - 1, X
19HEADER mailhead[] = { /* mail headers */
20 { NO, YES, NULL, ENT("Date:"), },
21 { NO, NO, NULL, ENT("From "), },
22 { NO, YES, NULL, ENT("From:"), },
23 { NO, NO, chk1, ENT("Index:"), },
24 { NO, YES, NULL, ENT("Message-Id:"), },
25 { NO, NO, NULL, ENT("Reply-To:"), },
26 { NO, NO, NULL, ENT("Return-Path:"), },
27 { NO, NO, NULL, ENT("Subject:"), },
28 { NO, NO, NULL, ENT("To:"), },
29 { ERR, }
30};
31
32extern short do_redist, /* if redistributing report */
33 made_dist; /* if dist file needs removing */
34extern char tmpname[]; /* temp bug report file */
35
36char *distf = TMP_FILE, /* redist temp file */
37 dir[MAXNAMLEN], /* subject and folder */
38 folder[MAXNAMLEN];
39
40/*
41 * gethead --
42 * read mail and bug headers from bug report, construct redist headers
43 */
44gethead()
45{
46 register HEADER *hp; /* mail header pointer */
47 register FILE *dfp; /* distf file pointer */
48 char *strcpy(), *malloc(), *mktemp();
49
50 if (do_redist && (!mktemp(distf) || !(dfp = fopen(distf,"w"))))
51 error("unable to create redistribution file %s.",distf);
52 made_dist = YES;
53 if (!freopen(tmpname,"r",stdin))
54 error("unable to read temporary bug file %s.",tmpname);
55
56 while (fgets(bfr,sizeof(bfr),stdin)) {
57 for (hp = mailhead;hp->found != ERR;++hp)
58 if (!hp->found)
59 if (!strncmp(hp->tag,bfr,hp->len)) {
60 if (hp->valid && !((*(hp->valid))(bfr)))
61 break;
62 if (!(hp->line = malloc((u_int)(strlen(bfr) + 1))))
63 error("unable to allocate space for header search.",CHN);
64 strcpy(hp->line,bfr);
65 hp->found = YES;
66 break;
67 }
68 if ((hp->found == ERR || hp->redist) && do_redist)
69 fputs(bfr,dfp);
70 }
71
72 if (!mailhead[INDX_TAG].found)
73 error("no readable \"Index:\" header in bug report.",CHN);
74 if (do_redist)
75 fclose(dfp);
76}
77
78/*
79 * chk1 --
80 * parse the "Index:" line into folder and directory
81 */
82static
83chk1(line)
84char *line;
85{
86 register char *C; /* tmp pointer */
87 struct stat sbuf; /* existence check */
88 char *index();
89
90 if (sscanf(line," Index: %s %s ",folder,dir) != 2)
91 return(NO);
92
93 /* backward compatible, deal with "bin/from.c" */
94 if (C = index(folder,'/')) {
95 if (C == folder)
96 return(NO);
97 *C = EOS;
98 }
99
100 if (stat(dir,&sbuf) || (sbuf.st_mode & S_IFMT) != S_IFDIR)
101 return(NO);
102 return(YES);
103}