Annotation of 43BSDReno/libexec/bugfiler/gethead.c, revision 1.1.1.1

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: (1) source distributions retain this entire copyright
                      7:  * notice and comment, and (2) distributions including binaries display
                      8:  * the following acknowledgement:  ``This product includes software
                      9:  * developed by the University of California, Berkeley and its contributors''
                     10:  * in the documentation or other materials provided with the distribution
                     11:  * and in all advertising materials mentioning features or use of this
                     12:  * software. Neither the name of the University nor the names of its
                     13:  * contributors may be used to endorse or promote products derived
                     14:  * from this software without specific prior written permission.
                     15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     18:  */
                     19: 
                     20: #ifndef lint
                     21: static char sccsid[] = "@(#)gethead.c  5.8 (Berkeley) 6/1/90";
                     22: #endif /* not lint */
                     23: 
                     24: #include <bug.h>
                     25: #include <sys/stat.h>
                     26: #include <stdio.h>
                     27: #include "pathnames.h"
                     28: 
                     29: static int     chk1(), pbuf();
                     30: 
                     31: #define ENT(X) sizeof(X) - 1, X
                     32: HEADER mailhead[] = {                          /* mail headers */
                     33:        { NO, YES,  NULL, ENT("Date:"), },
                     34:        { NO,  NO,  NULL, ENT("From "), },
                     35:        { NO, YES,  NULL, ENT("From:"), },
                     36:        { NO,  NO,  chk1, ENT("Index:"), },
                     37:        { NO, YES,  NULL, ENT("Message-Id:"), },
                     38:        { NO, YES,  NULL, ENT("Reply-To:"), },
                     39:        { NO, YES,  NULL, ENT("Return-Path:"), },
                     40:        { NO,  NO,  pbuf, ENT("Subject:"), },
                     41:        { NO, YES,  NULL, ENT("To:"), },
                     42:        { NO,  NO,  NULL, ENT("Apparently-To:"), },
                     43:        { ERR, }
                     44: };
                     45: 
                     46: FILE   *dfp;                           /* distf file pointer */
                     47: char   dir[MAXNAMLEN],                 /* subject and folder */
                     48:        folder[MAXNAMLEN];
                     49: 
                     50: /*
                     51:  * gethead --
                     52:  *     read mail and bug headers from bug report, construct redist headers
                     53:  */
                     54: gethead(redist)
                     55:        int     redist;
                     56: {
                     57:        register HEADER *hp;            /* mail header pointer */
                     58:        char    *strcpy(), *malloc();
                     59: 
                     60:        if (redist) {
                     61:                int     fd;
                     62:                char    *distf;
                     63: 
                     64:                distf = _PATH_TMP;
                     65:                if (!(fd = mkstemp(distf)) || !(dfp = fdopen(fd, "w+")))
                     66:                        error("can't create redistribution file %s.", distf);
                     67:                /* disappear after last reference is closed */
                     68:                (void)unlink(distf);
                     69:        }
                     70:        if (!freopen(tmpname, "r", stdin))
                     71:                error("can't read temporary bug file %s.", tmpname);
                     72: 
                     73:        while (fgets(bfr, sizeof(bfr), stdin)) {
                     74:                for (hp = mailhead; hp->found != ERR; ++hp)
                     75:                        if (!hp->found)
                     76:                                if (!strncmp(hp->tag, bfr, hp->len)) {
                     77:                                        if (hp->valid && !((*(hp->valid))(bfr)))
                     78:                                                break;
                     79:                                        if (!(hp->line = malloc((u_int)(strlen(bfr) + 1))))
                     80:                                                error("malloc failed.", CHN);
                     81:                                        (void)strcpy(hp->line, bfr);
                     82:                                        hp->found = YES;
                     83:                                        break;
                     84:                                }
                     85:                if ((hp->found == ERR || hp->redist) && redist)
                     86:                        fputs(bfr, dfp);
                     87:        }
                     88: 
                     89:        if (!mailhead[INDX_TAG].found)
                     90:                error("no readable \"Index:\" header in bug report.", CHN);
                     91: }
                     92: 
                     93: /*
                     94:  * chk1 --
                     95:  *     parse the "Index:" line into folder and directory
                     96:  */
                     97: static
                     98: chk1(line)
                     99:        char    *line;
                    100: {
                    101:        register char   *C;             /* tmp pointer */
                    102:        struct stat     sbuf;           /* existence check */
                    103:        char    *index();
                    104: 
                    105:        if (sscanf(line, " Index: %s %s ", folder, dir) != 2)
                    106:                return(NO);
                    107:        if (C = index(folder, '/')) {   /* deal with "bin/from.c" */
                    108:                if (C == folder)
                    109:                        return(NO);
                    110:                *C = EOS;
                    111:        }
                    112:        if (stat(dir, &sbuf) || (sbuf.st_mode & S_IFMT) != S_IFDIR)
                    113:                return(NO);
                    114:        (void)pbuf(line);
                    115:        return(YES);
                    116: }
                    117: 
                    118: /*
                    119:  * pbuf --
                    120:  *     kludge so that summary file looks pretty
                    121:  */
                    122: static
                    123: pbuf(line)
                    124:        char    *line;
                    125: {
                    126:        register char   *rp,                    /* tmp pointers */
                    127:                        *wp;
                    128: 
                    129:        for (rp = line; *rp == ' ' || *rp == '\t'; ++rp);
                    130:        for (wp = line; *rp; ++wp) {
                    131:                if ((*wp = *rp++) != ' ' && *wp != '\t')
                    132:                        continue;
                    133:                *wp = ' ';
                    134:                while (*rp == ' ' || *rp == '\t')
                    135:                        ++rp;
                    136:        }
                    137:        if (wp[-1] == ' ')                      /* wp can't == line */
                    138:                --wp;
                    139:        *wp = EOS;
                    140:        return(YES);
                    141: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.