Annotation of 43BSDTahoe/new/news/src/batch.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*
                      3:  * This software is Copyright (c) 1985 by Rick Adams.
                      4:  *
                      5:  * Permission is hereby granted to copy, reproduce, redistribute or
                      6:  * otherwise use this software as long as: there is no monetary
                      7:  * profit gained specifically from the use or reproduction or this
                      8:  * software, it is not sold, rented, traded or otherwise marketed, and
                      9:  * this copyright notice is included prominently in any copy
                     10:  * made.
                     11:  *
                     12:  * The author make no claims as to the fitness or correctness of
                     13:  * this software for any use whatsoever, and it is provided as is. 
                     14:  * Any use of this software is at the user's own risk.
                     15:  *
                     16:  * Batch: program to batch a list of news articles into an unbatch script.
                     17:  * Usage: /usr/lib/news/batch listfile [bytecount]
                     18:  *  where listfile is a file containing a list, one per line, of full
                     19:  *  path names of files containing articles, e.g. as produced by the F
                     20:  *  transmission option in the sys file.
                     21:  *  bytecount is the maximum number of bytes to output before exiting
                     22:  * Output is placed on standard output.
                     23:  *
                     24:  * Intended usage:
                     25:  *
                     26:  *     With the shellfile "sendbatch", with machine names as arguments:
                     27:  *             e.g
                     28:  *             sendbatch rlgvax seismo
                     29:  *
                     30:  * This would be invoked every hour or two from crontab.
                     31:  *
                     32:  */
                     33: 
                     34: #ifdef SCCSID
                     35: static char    *SccsId = "@(#)batch.c  1.19    10/7/87";
                     36: #endif /* SCCSID */
                     37: 
                     38: #include <stdio.h>
                     39: #include <sys/types.h>
                     40: #include <sys/stat.h>
                     41: #include <errno.h>
                     42: #include "defs.h"
                     43: 
                     44: #if defined(USG) || defined(BSD4_2)
                     45: #include <fcntl.h>
                     46: #endif
                     47: 
                     48: struct stat sbuf;
                     49: 
                     50: extern int errno;
                     51: extern char *sys_errlist[];
                     52: 
                     53: main(argc,argv)
                     54: char **argv;
                     55: {
                     56:        register FILE *fd, *nfd;
                     57:        register int c;
                     58:        register long n;
                     59:        register char *cp;
                     60:        char *fdstatus;
                     61:        long maxbytes, nbytes;
                     62:        long atol();
                     63:        char fname[512];
                     64:        char workfile[512];
                     65:        char cbuf[BUFSIZ];
                     66:        char *index(), *fgets();
                     67: 
                     68:        if (argc < 2) {
                     69:                fprintf(stderr, "Usage: batch listfile [bytecount]\n");
                     70:                exit(1);
                     71:        }
                     72: 
                     73:        /*
                     74:         * Rename real file to a work name to avoid race conditions.
                     75:         * If workfile exists skip the rename in order
                     76:         * to recover from a crash w/o losing anything.
                     77:         */
                     78:        (void) strcpy(workfile, argv[1]);
                     79:        (void) strcat(workfile, ".work");
                     80:        if (access(workfile, 0) < 0) {
                     81:                if (access(argv[1], 0) < 0 && errno == ENOENT)
                     82:                        exit(0);        /* no news */
                     83:                if (rename(argv[1], workfile) < 0) {
                     84:                        logerror("rename(%s,%s) %s", argv[1], workfile,
                     85:                                sys_errlist[errno]);
                     86:                        exit(1);
                     87:                }
                     88:        }
                     89:        fd = fopen(workfile, "r");
                     90:        if (fd == NULL) {
                     91:                logerror("fopen(%s,r) %s", workfile, sys_errlist[errno]);
                     92:                exit(1);
                     93:        }
                     94: 
                     95:        if (argc > 2)
                     96:                maxbytes = atol(argv[2]);
                     97:        else
                     98:                maxbytes = 100000000L; /* backwards compatible */
                     99:        nbytes = 0;
                    100:        while ((fdstatus = fgets(fname, sizeof fname, fd)) != NULL) {
                    101:                cp = index(fname, '\n');
                    102:                if (cp)
                    103:                        *cp = '\0';
                    104:                if (fname[0] == '\0')
                    105:                        continue;
                    106:                nfd = fopen(fname, "r");
                    107:                if (nfd == NULL) {
                    108:                        perror(fname);
                    109:                        continue;
                    110:                }
                    111:                (void) fstat(fileno(nfd), &sbuf);
                    112:                if (cp)
                    113:                        *cp = '\n';
                    114:                if (sbuf.st_size == 0)
                    115:                        continue;
                    116:                nbytes += sbuf.st_size;
                    117:                if (nbytes > maxbytes && nbytes != sbuf.st_size)
                    118:                        break;
                    119:                printf("#! rnews %ld\n", (long)sbuf.st_size);
                    120:                /* guess length of #! rnews string */
                    121:                nbytes += 13;
                    122:                n = 0;
                    123:                while (c = fread(cbuf, 1, sizeof cbuf, nfd)) {
                    124:                        fwrite(cbuf, 1, c, stdout);
                    125:                        n += c;
                    126:                }
                    127:                (void) fclose(nfd);
                    128:                if (ferror(stdout)){
                    129:                        logerror("stdout write %s", sys_errlist[errno]);
                    130:                        exit(1);
                    131:                }
                    132:                (void) fflush(stdout);
                    133:                if (n != sbuf.st_size) { /* paranoia */
                    134:                        logerror("%s, expected %ld bytes, got %ld", fname,
                    135:                                n, sbuf.st_size);
                    136:                        /* breaking out of this early will end up resyncing
                    137:                           the batch files (isn't serendipity wonderful?) */
                    138:                        break;
                    139:                }
                    140:        }
                    141:        if (fdstatus != NULL) {         /* exceeded maxbytes */
                    142:                char tmpfile[512];
                    143: 
                    144:                (void) umask(2);
                    145:                (void) strcpy(tmpfile, argv[1]);
                    146:                (void) strcat(tmpfile, ".tmp");
                    147:                nfd = fopen(tmpfile, "w");
                    148:                if (nfd == NULL) {
                    149:                        logerror("fopen(%s,w) %s", tmpfile, sys_errlist[errno]);
                    150:                        exit(1);
                    151:                }
                    152:                do {
                    153:                        fputs(fname, nfd);
                    154:                } while (fgets(fname, sizeof fname, fd) != NULL);
                    155:                if (ferror(nfd)) {
                    156:                        logerror("write(%s) %s", tmpfile, sys_errlist[errno]);
                    157:                        exit(1);
                    158:                }
                    159:                (void) fclose(nfd);
                    160:                (void) fclose(fd);
                    161:                /* will pick it up next time thru */
                    162:                if (rename(tmpfile, workfile) < 0) {
                    163:                        logerror("rename(%s,%s) %s", tmpfile, workfile,
                    164:                                sys_errlist[errno]);
                    165:                        exit(1);
                    166:                }
                    167:        }               
                    168:        else
                    169:                (void) unlink(workfile);
                    170:        exit(0);
                    171: }
                    172: 
                    173: /*
                    174:  * Log the given message, with printf strings and parameters allowed,
                    175:  * on the log file, if it can be written.
                    176:  */
                    177: /* VARARGS1 */
                    178: logerror(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
                    179: char *fmt;
                    180: long a1, a2, a3, a4, a5, a6, a7, a8, a9;
                    181: {
                    182:        FILE *logfile;
                    183:        char lfname[BUFLEN];            /* the log file */
                    184:        char bfr[BUFLEN];
                    185:        char *logtime, *ctime(); 
                    186:        time_t t;
                    187: 
                    188:        (void) time(&t);
                    189:        logtime = ctime(&t);
                    190:        logtime[16] = 0;
                    191:        logtime += 4;
                    192: 
                    193: #if defined(LOGDIR) || defined(HOME)
                    194:        (void) sprintf(lfname, "%s/%s/errlog", logdir(HOME), LIBDIR);
                    195: #else
                    196:        (void) sprintf(lfname, "%s/errlog", LIBDIR);
                    197: #endif
                    198: 
                    199:        (void) sprintf(bfr, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
                    200:        fprintf(stderr, bfr);
                    201:        if (access(lfname, 0) == 0 && (logfile = fopen(lfname, "a")) != NULL) {
                    202: #if defined(USG) || defined(BSD4_2)
                    203:                int flags;
                    204:                flags = fcntl(fileno(logfile), F_GETFL, 0);
                    205:                (void) fcntl(fileno(logfile), F_SETFL, flags|O_APPEND);
                    206: #else /* v7 */
                    207:                (void) lseek(fileno(logfile), 0L, 2);
                    208: #endif /* v7 */
                    209:                fprintf(logfile, "%s\tbatch\t%s\n", logtime, bfr);
                    210:                (void) fclose(logfile);
                    211:        }
                    212: }
                    213: 
                    214: #if !defined(BSD4_2)
                    215: rename(from, to)
                    216: register char *from, *to;
                    217: {
                    218:        (void) unlink(to);
                    219:        if (link(from, to) < 0)
                    220:                return -1;
                    221: 
                    222:        (void) unlink(from);
                    223:        return 0;
                    224: }
                    225: #endif /* !BSD4_2 */

unix.superglobalmegacorp.com

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