Annotation of 43BSD/contrib/news/src/unbatch.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * unbatchnews: extract news in batched format and process it one article
                      3:  * at a time.  The format looks like
                      4:  *     #! rnews 1234
                      5:  *     article containing 1234 characters
                      6:  *     #! rnews 4321
                      7:  *     article containing 4321 characters
                      8:  *
                      9:  *     or
                     10:  *
                     11:  *     #! command [args]
                     12:  *     calls LIBDIR/command [args] to process the news
                     13:  */
                     14: 
                     15: #ifdef SCCSID
                     16: static char    *SccsId = "@(#)unbatch.c        6.3     5/17/86";
                     17: #endif /* SCCSID */
                     18: 
                     19: #define        MAXARGS         20
                     20: 
                     21: #ifdef BSD4_2
                     22: #define fork vfork
                     23: #endif /* BSD4_2 */
                     24: 
                     25: #include <stdio.h>
                     26: #include <ctype.h>
                     27: #ifdef USG
                     28: #include <fcntl.h>
                     29: #endif /* USG */
                     30: 
                     31: char buf[BUFSIZ];
                     32: char sibuf[BUFSIZ];
                     33: 
                     34: main()
                     35: {
                     36:        register int c;
                     37:        register FILE *pfn;
                     38:        register long size;
                     39:        char *filename;
                     40:        int pid, wpid, exstat;
                     41:        char *mktemp(), *gets();
                     42:        long atol();
                     43: 
                     44:        filename = mktemp("/tmp/unbnewsXXXXXX");
                     45:        setbuf(stdin, (char *)NULL);    /* only for the first line */
                     46:        if (gets(buf) == NULL) {
                     47:                (void) unlink(filename);
                     48:                exit(0);
                     49:        }
                     50:        if (strncmp(buf, "#! rnews ", 9) != 0) {
                     51:                docmd(buf);
                     52:                /* should not return */
                     53:                logerr("unbatch: docmd returned!");
                     54:                exit(1);
                     55:        }
                     56: 
                     57:        setbuf(stdin, sibuf);   /* buffer the rest of the file */
                     58: 
                     59:        do {
                     60:                while (strncmp(buf, "#! rnews ", 9) 
                     61:                    && strncmp(buf, "! rnews ", 8)) { /* kludge for bug */
                     62:                        register char *cp;
                     63:                        for (cp = buf; *cp != '\0'; ++cp)
                     64:                                if (!isascii(*cp) ||
                     65:                                        (!isprint(*cp) && !isspace(*cp)))
                     66:                                                *cp = '?';
                     67:                        logerr("out of sync, skipping %s", buf);
                     68:                        if (gets(buf) == NULL)
                     69:                                exit(0);
                     70:                }
                     71:                size = atol(buf + (buf[0] == '#' ? 9 : 8));
                     72:                if(size <= 0) {
                     73:                        logerr("nonsense size %ld", size);
                     74:                        continue;
                     75:                }
                     76: #ifdef VMS
                     77:                vmsdelete(filename);
                     78: #endif /* VMS */
                     79:                pfn = fopen(filename, "w");
                     80:                while(--size >= 0 && (c = getc(stdin)) != EOF)
                     81:                        putc(c, pfn);
                     82:                (void) fclose(pfn);
                     83: 
                     84:                /*
                     85:                 * If we got a truncated batch, don't process the
                     86:                 * last article; it will probably be received again.
                     87:                 */
                     88:                if (size > 0)
                     89:                        break;
                     90: 
                     91:                /*
                     92:                 * rnews < filename
                     93:                 */
                     94:                while ((pid = fork()) == -1) {
                     95:                        logerr("fork failed, waiting...\n");
                     96:                        sleep(53);
                     97:                }
                     98:                if (pid == 0) {
                     99:                        (void) close(0);
                    100:                        (void) open(filename, 0);
                    101: #ifdef IHCC
                    102:                        (void) sprintf(buf, "%s/%s/rnews", logdir(HOME), LIBDIR);
                    103: #else
                    104:                        (void) sprintf(buf, "%s/rnews", BINDIR);
                    105: #endif
                    106:                        execlp(buf, "rnews", (char *)0);
                    107:                        perror("rnews");
                    108:                        exit(1);
                    109:                }
                    110:                while ((wpid = wait(&exstat)) >= 0 && wpid != pid)
                    111:                        ;
                    112:        } while (gets(buf) != NULL);
                    113:        (void) unlink(filename);
                    114:        exit(0);
                    115: }
                    116: 
                    117: docmd(p)
                    118: register char *p;
                    119: {
                    120:        char *args[MAXARGS];
                    121:        register char **ap = args;
                    122:        char path[BUFSIZ];
                    123:        char *rindex(), *cp;
                    124: 
                    125:        while (*p && !isspace(*p))              /* skip leading #! crud */
                    126:                p++;
                    127: 
                    128:        while (isspace(*p))
                    129:                p++;
                    130: 
                    131:        while (*p != '\0') {
                    132:                *ap++ = p;
                    133:                if (ap >= &args[MAXARGS]) {
                    134:                        logerr("unbatch: Too many args to %s", args[0]);
                    135:                        exit(2);
                    136:                }
                    137:                while (*p && !isspace(*p))
                    138:                        p++;
                    139:                if (*p)
                    140:                        *p++ = '\0';
                    141:                while (isspace(*p))
                    142:                        p++;
                    143:        }
                    144:        *ap = (char *)0;
                    145: 
                    146:        if (ap == args) {
                    147:                logerr("unbatch: no command to execute");
                    148:                exit(2);
                    149:        }
                    150: 
                    151:        /* strip off any leading pathname in case someone gets tricky */
                    152:        cp = rindex(args[0], '/');
                    153:        if (cp++ == NULL)
                    154:                cp = args[0];
                    155: 
                    156:        sprintf(path, "%s/%s", LIBDIR, cp);
                    157: 
                    158:        /*
                    159:         * "path" is absolute, no searching is needed,  we use
                    160:         * 'execvp' solely so that sh scripts will be handled
                    161:         */
                    162:        (void) execvp(path, args);
                    163:        perror(path);
                    164:        exit(2);
                    165: }
                    166: 
                    167: /*
                    168:  * Log the given message, with printf strings and parameters allowed,
                    169:  * on the log file, if it can be written.
                    170:  */
                    171: /* VARARGS1 */
                    172: logerr(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
                    173: char *fmt;
                    174: {
                    175:        FILE *logfile;
                    176:        char lfname[BUFSIZ];            /* the log file */
                    177:        char bfr[BUFSIZ];
                    178:        char *logtime, *ctime(); 
                    179:        long t;
                    180: 
                    181:        (void) time(&t);
                    182:        logtime = ctime(&t);
                    183:        logtime[16] = 0;
                    184:        logtime += 4;
                    185: 
                    186: #ifdef IHCC
                    187:        (void) sprintf(lfname, "%s/%s/errlog", logdir(HOME), LIBDIR);
                    188: #else
                    189:        (void) sprintf(lfname, "%s/errlog", LIBDIR);
                    190: #endif
                    191: 
                    192:        (void) sprintf(bfr, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
                    193:        fprintf(stderr, bfr);
                    194:        if (access(lfname, 0) == 0 && (logfile = fopen(lfname, "a")) != NULL) {
                    195: #if defined(USG) || defined(BSD4_2) || defined(BSD4_1C)
                    196:                int flags;
                    197:                flags = fcntl(fileno(logfile), F_GETFL, 0);
                    198:                (void) fcntl(fileno(logfile), F_SETFL, flags|O_APPEND);
                    199: #else /* v7 */
                    200:                (void) lseek(fileno(logfile), 0L, 2);
                    201: #endif /* v7 */
                    202:                fprintf(logfile, "%s\tbatch\t%s\n", logtime, bfr);
                    203:                (void) fclose(logfile);
                    204:        }
                    205: }

unix.superglobalmegacorp.com

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