BSD 4_3_Reno release
[unix-history] / usr / src / libexec / bugfiler / redist.c
index 45f8f8e..6d33b5b 100644 (file)
@@ -1,21 +1,31 @@
 /*
 /*
- * Copyright (c) 1986 Regents of the University of California.
- * All rights reserved.  The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
+ * Copyright (c) 1986, 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that: (1) source distributions retain this entire copyright
+ * notice and comment, and (2) distributions including binaries display
+ * the following acknowledgement:  ``This product includes software
+ * developed by the University of California, Berkeley and its contributors''
+ * in the documentation or other materials provided with the distribution
+ * and in all advertising materials mentioning features or use of this
+ * software. Neither the name of the University nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)redist.c   5.1 (Berkeley) 86/11/25";
-#endif not lint
+static char sccsid[] = "@(#)redist.c   5.10 (Berkeley) 6/1/90";
+#endif /* not lint */
 
 #include <sys/file.h>
 #include <stdio.h>
 
 #include <sys/file.h>
 #include <stdio.h>
+#include <ctype.h>
 #include <bug.h>
 #include <bug.h>
-
-extern HEADER  mailhead[];                     /* mail headers */
-extern char    *distf,                         /* redist temp file */
-               pfile[],                        /* permanent bug file */
-               folder[];                       /* system name */
+#include "pathnames.h"
 
 /*
  * redist --
 
 /*
  * redist --
@@ -24,64 +34,69 @@ extern char *distf,                         /* redist temp file */
  */
 redist()
 {
  */
 redist()
 {
-       register char   *C1,            /* traveling chars */
-                       *C2;
-       register int    first = YES;    /* if first blank line */
-       FILE    *pf,                    /* pipe pointer */
-               *dfp,                   /* dist file fp */
-               *popen();
-       char    *index(), *mktemp();
+       extern FILE     *dfp;           /* dist file fp */
+       extern char     pfile[];        /* permanent bug file */
+       register char   *C1, *C2;
+       FILE    *pf, *popen();
+       int     group;
+       char    *index();
 
 
-       if (!freopen(DIST_FILE,"r",stdin))
+       (void)sprintf(bfr, "%s/%s", dir, DIST_FILE);
+       if (!freopen(bfr, "r", stdin))
                return;
                return;
-
-       for (;;) {                      /* get first part of entry */
-               if (!gets(bfr))
-                       return;
-               if (*bfr == COMMENT || *bfr == ' ' || *bfr == '\t' || !(C1 = index(bfr,':')))
+       for (pf = NULL, group = 0; gets(bfr);) {
+               if (*bfr == COMMENT || isspace(*bfr) || !(C1 = index(bfr, ':')))
                        continue;
                *C1 = EOS;
                        continue;
                *C1 = EOS;
-               if (!strcmp(bfr,folder))
-                       break;
+               if (!strcmp(bfr, folder) || !strcmp(bfr, "all")) {
+                       for (++C1; *C1 && (*C1 == ' ' || *C1 == '\t'); ++C1);
+                       if (!*C1)                       /* if empty list */
+                               continue;
+                       if (!pf) {
+                               if (!(pf = popen(MAIL_CMD, "w")))
+                                       error("sendmail pipe failed.", CHN);
+                               if (mailhead[SUBJ_TAG].found)
+                                       fprintf(pf, "%s", mailhead[SUBJ_TAG].line);
+                               else
+                                       fputs("Subject: Untitled Bug Report\n", pf);
+                               if (!mailhead[TO_TAG].line) {
+                                       if (mailhead[APPAR_TO_TAG].line)
+                                           fprintf(pf, "To%s",
+                                             index(mailhead[APPAR_TO_TAG].line,
+                                             ':'));
+                                       else
+                                           fprintf(pf, "To: %s\n",  BUGS_ID);
+                               }
+                               fputs("Resent-To: ", pf);
+                       }
+                       /*
+                        * write out first entry, then succeeding entries
+                        * backward compatible, handles back slashes at end
+                        * of line
+                        */
+                       if (group++)
+                               fputs(", ", pf);
+                       for (;;) {
+                               if (C2 = index(C1, '\\'))
+                                       *C2 = EOS;
+                               fputs(C1, pf);
+                               if (!gets(bfr) || *bfr != ' ' && *bfr != '\t')
+                                       break;
+                               for (C1 = bfr; *C1 && (*C1 == ' ' || *C1 == '\t'); ++C1);
+                       }
+               }
        }
        }
-       for (++C1;*C1 && (*C1 == ' ' || *C1 == '\t');++C1);
-       if (!*C1)                       /* if empty */
+       if (!pf)
                return;
 
                return;
 
-       if (!(pf = popen(MAIL_CMD,"w")))
-               error("sendmail pipe failed.",CHN);
-
-       fprintf(pf,"Reply-To: %s\n",BUGS_HOME);
-       if (mailhead[SUBJ_TAG].found)
-               fprintf(pf,"%s",mailhead[SUBJ_TAG].line);
-       else
-               fputs("Subject: Untitled Bug Report\n",pf);
-       fputs("Resent-To: ",pf);
+       putc('\n', pf);
 
 
-       /*
-        * write out first entry, then succeeding entries
-        * backward compatible, handles back slashes at end of line
-        */
-       for (;;) {
-               if (C2 = index(C1,'\\'))
-                       *C2 = EOS;
-               fputs(C1,pf);
-               if (!gets(bfr) || (*bfr != ' ' && *bfr != '\t'))
-                       break;
-               for (C1 = bfr;*C1 && (*C1 == ' ' || *C1 == '\t');++C1);
-       }
-       fputs("\n",pf);
-
-       if (!(dfp = fopen(distf,"r")))
-               error("unable to read temporary file %s.",distf);
-       while (fgets(bfr,sizeof(bfr),dfp))
-               if (*bfr == '\n' && first) {
-                       first = NO;
-                       fprintf(pf,"\n%sReference: %s\n",mailhead[INDX_TAG].line,pfile);
-               }
-               else
-                       fputs(bfr,pf);
-       fclose(dfp);
-       pclose(pf);
-       unlink(distf);
+       rewind(dfp);
+       /* add Reference header and copy bug report out */
+       while (fgets(bfr, sizeof(bfr), dfp) && *bfr != '\n')
+               fputs(bfr, pf);
+       fprintf(pf, "\n%sReference: %s\n\n", mailhead[INDX_TAG].line, pfile);
+       while (fgets(bfr, sizeof(bfr), dfp))
+               fputs(bfr, pf);
+       (void)pclose(pf);
 }
 }