|
|
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.15 1/17/86"; ! 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) || defined(BSD4_1C) ! 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 *index(), *fgets(); ! 66: ! 67: if (argc < 2) { ! 68: fprintf(stderr, "Usage: batch listfile [bytecount]\n"); ! 69: exit(1); ! 70: } ! 71: ! 72: /* ! 73: * Rename real file to a work name to avoid race conditions. ! 74: * If workfile exists skip the rename in order ! 75: * to recover from a crash w/o losing anything. ! 76: */ ! 77: (void) strcpy(workfile, argv[1]); ! 78: (void) strcat(workfile, ".work"); ! 79: if (access(workfile, 0) < 0) { ! 80: if (access(argv[1], 0) < 0 && errno == ENOENT) ! 81: exit(0); /* no news */ ! 82: if (rename(argv[1], workfile) < 0) { ! 83: logerror("rename(%s,%s) %s", argv[1], workfile, ! 84: sys_errlist[errno]); ! 85: exit(1); ! 86: } ! 87: } ! 88: fd = fopen(workfile, "r"); ! 89: if (fd == NULL) { ! 90: logerror("fopen(%s,r) %s", workfile, sys_errlist[errno]); ! 91: exit(1); ! 92: } ! 93: ! 94: if (argc > 2) ! 95: maxbytes = atol(argv[2]); ! 96: else ! 97: maxbytes = 100000000L; /* backwards compatible */ ! 98: nbytes = 0; ! 99: while ((fdstatus = fgets(fname, sizeof fname, fd)) != NULL) { ! 100: cp = index(fname, '\n'); ! 101: if (cp) ! 102: *cp = '\0'; ! 103: nfd = fopen(fname, "r"); ! 104: if (nfd == NULL) { ! 105: perror(fname); ! 106: continue; ! 107: } ! 108: (void) fstat(fileno(nfd), &sbuf); ! 109: if (cp) ! 110: *cp = '\n'; ! 111: nbytes += sbuf.st_size; ! 112: if (nbytes > maxbytes && nbytes != sbuf.st_size) ! 113: break; ! 114: printf("#! rnews %ld\n", (long)sbuf.st_size); ! 115: /* guess length of #! rnews string */ ! 116: nbytes += 13; ! 117: n = 0; ! 118: while ((c = getc(nfd)) != EOF) { ! 119: putchar(c); ! 120: n++; ! 121: } ! 122: (void) fclose(nfd); ! 123: if (ferror(stdout)){ ! 124: logerror("stdout write %s", sys_errlist[errno]); ! 125: exit(1); ! 126: } ! 127: if (n != sbuf.st_size) { /* paranoia */ ! 128: logerror("%s, expected %ld bytes, got %ld", fname, ! 129: n, sbuf.st_size); ! 130: /* breaking out of this early will end up resyncing ! 131: the batch files (isn't serendipity wonderful?) */ ! 132: break; ! 133: } ! 134: } ! 135: if (fdstatus != NULL) { /* exceeded maxbytes */ ! 136: char tmpfile[512]; ! 137: ! 138: (void) umask(2); ! 139: (void) strcpy(tmpfile, argv[1]); ! 140: (void) strcat(tmpfile, ".tmp"); ! 141: nfd = fopen(tmpfile, "w"); ! 142: if (nfd == NULL) { ! 143: logerror("fopen(%s,w) %s", tmpfile, sys_errlist[errno]); ! 144: exit(1); ! 145: } ! 146: do { ! 147: fputs(fname, nfd); ! 148: } while (fgets(fname, sizeof fname, fd) != NULL); ! 149: if (ferror(nfd)) { ! 150: logerror("write(%s) %s", tmpfile, sys_errlist[errno]); ! 151: exit(1); ! 152: } ! 153: (void) fclose(nfd); ! 154: (void) fclose(fd); ! 155: /* will pick it up next time thru */ ! 156: if (rename(tmpfile, workfile) < 0) { ! 157: logerror("rename(%s,%s) %s", tmpfile, workfile, ! 158: sys_errlist[errno]); ! 159: exit(1); ! 160: } ! 161: } ! 162: else ! 163: (void) unlink(workfile); ! 164: exit(0); ! 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: logerror(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9) ! 173: char *fmt; ! 174: { ! 175: FILE *logfile; ! 176: char lfname[BUFLEN]; /* the log file */ ! 177: char bfr[BUFLEN]; ! 178: char *logtime, *ctime(); ! 179: time_t 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: } ! 206: ! 207: #if !defined(BSD4_2) && !defined(BSD4_1C) ! 208: rename(from, to) ! 209: register char *from, *to; ! 210: { ! 211: (void) unlink(to); ! 212: if (link(from, to) < 0) ! 213: return -1; ! 214: ! 215: (void) unlink(from); ! 216: return 0; ! 217: } ! 218: #endif /* !BSD4_2 && !BSD4_1C */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.