|
|
1.1 ! root 1: #ifndef lint ! 2: static char sccsid[] = "@(#)recvjob.c 4.6 (Berkeley) 7/17/83"; ! 3: #endif ! 4: ! 5: /* ! 6: * Receive printer jobs from the network, queue them and ! 7: * start the printer daemon. ! 8: */ ! 9: ! 10: #include "lp.h" ! 11: ! 12: static char tfname[40]; /* tmp copy of cf before linking */ ! 13: static char *dfname; /* data files */ ! 14: ! 15: recvjob() ! 16: { ! 17: struct stat stb; ! 18: char *bp = pbuf; ! 19: int status; ! 20: ! 21: /* ! 22: * Perform lookup for printer name or abbreviation ! 23: */ ! 24: if ((status = pgetent(line, printer)) < 0) ! 25: fatal("cannot open printer description file"); ! 26: else if (status == 0) ! 27: fatal("unknown printer"); ! 28: if ((LF = pgetstr("lf", &bp)) == NULL) ! 29: LF = DEFLOGF; ! 30: if ((SD = pgetstr("sd", &bp)) == NULL) ! 31: SD = DEFSPOOL; ! 32: if ((LO = pgetstr("lo", &bp)) == NULL) ! 33: LO = DEFLOCK; ! 34: ! 35: (void) close(2); ! 36: (void) open(LF, O_WRONLY|O_APPEND); ! 37: if (chdir(SD) < 0) ! 38: fatal("cannot chdir to %s", SD); ! 39: if (stat(LO, &stb) == 0 && (stb.st_mode & 010)) { ! 40: /* queue is disabled */ ! 41: putchar('\1'); /* return error code */ ! 42: exit(1); ! 43: } ! 44: ! 45: if (readjob()) ! 46: printjob(); ! 47: } ! 48: ! 49: char *sp = ""; ! 50: #define ack() (void) write(1, sp, 1); ! 51: ! 52: /* ! 53: * Read printer jobs sent by lpd and copy them to the spooling directory. ! 54: * Return the number of jobs successfully transfered. ! 55: */ ! 56: static ! 57: readjob(printer) ! 58: char *printer; ! 59: { ! 60: register int size, nfiles; ! 61: register char *cp; ! 62: ! 63: ack(); ! 64: nfiles = 0; ! 65: for (;;) { ! 66: /* ! 67: * Read a command to tell us what to do ! 68: */ ! 69: cp = line; ! 70: do { ! 71: if ((size = read(1, cp, 1)) != 1) { ! 72: if (size < 0) ! 73: fatal("Lost connection"); ! 74: return(nfiles); ! 75: } ! 76: } while (*cp++ != '\n'); ! 77: *--cp = '\0'; ! 78: cp = line; ! 79: switch (*cp++) { ! 80: case '\1': /* cleanup because data sent was bad */ ! 81: cleanup(); ! 82: continue; ! 83: ! 84: case '\2': /* read cf file */ ! 85: size = 0; ! 86: while (*cp >= '0' && *cp <= '9') ! 87: size = size * 10 + (*cp++ - '0'); ! 88: if (*cp++ != ' ') ! 89: break; ! 90: strcpy(tfname, cp); ! 91: tfname[0] = 't'; ! 92: if (!readfile(tfname, size)) { ! 93: cleanup(); ! 94: continue; ! 95: } ! 96: if (link(tfname, cp) < 0) ! 97: fatal("cannot rename %s", tfname); ! 98: (void) unlink(tfname); ! 99: tfname[0] = '\0'; ! 100: nfiles++; ! 101: continue; ! 102: ! 103: case '\3': /* read df file */ ! 104: size = 0; ! 105: while (*cp >= '0' && *cp <= '9') ! 106: size = size * 10 + (*cp++ - '0'); ! 107: if (*cp++ != ' ') ! 108: break; ! 109: (void) readfile(dfname = cp, size); ! 110: continue; ! 111: } ! 112: fatal("protocol screwup"); ! 113: } ! 114: } ! 115: ! 116: /* ! 117: * Read files send by lpd and copy them to the spooling directory. ! 118: */ ! 119: static ! 120: readfile(file, size) ! 121: char *file; ! 122: int size; ! 123: { ! 124: register char *cp; ! 125: char buf[BUFSIZ]; ! 126: register int i, j, amt; ! 127: int fd, err; ! 128: ! 129: fd = open(file, O_WRONLY|O_CREAT, FILMOD); ! 130: if (fd < 0) ! 131: fatal("cannot create %s", file); ! 132: ack(); ! 133: err = 0; ! 134: for (i = 0; i < size; i += BUFSIZ) { ! 135: amt = BUFSIZ; ! 136: cp = buf; ! 137: if (i + amt > size) ! 138: amt = size - i; ! 139: do { ! 140: j = read(1, cp, amt); ! 141: if (j <= 0) ! 142: fatal("Lost connection"); ! 143: amt -= j; ! 144: cp += j; ! 145: } while (amt > 0); ! 146: amt = BUFSIZ; ! 147: if (i + amt > size) ! 148: amt = size - i; ! 149: if (write(fd, buf, amt) != amt) { ! 150: err++; ! 151: break; ! 152: } ! 153: } ! 154: (void) close(fd); ! 155: if (err) ! 156: fatal("%s: write error", file); ! 157: if (noresponse()) { /* file sent had bad data in it */ ! 158: (void) unlink(file); ! 159: return(0); ! 160: } ! 161: ack(); ! 162: return(1); ! 163: } ! 164: ! 165: static ! 166: noresponse() ! 167: { ! 168: char resp; ! 169: ! 170: if (read(1, &resp, 1) != 1) ! 171: fatal("Lost connection"); ! 172: if (resp == '\0') ! 173: return(0); ! 174: return(1); ! 175: } ! 176: ! 177: /* ! 178: * Remove all the files associated with the current job being transfered. ! 179: */ ! 180: static ! 181: cleanup() ! 182: { ! 183: register int i; ! 184: ! 185: if (tfname[0]) ! 186: (void) unlink(tfname); ! 187: if (dfname) ! 188: do { ! 189: do ! 190: (void) unlink(dfname); ! 191: while (dfname[i]-- != 'A'); ! 192: dfname[i] = 'z'; ! 193: } while (dfname[i-2]-- != 'd'); ! 194: } ! 195: ! 196: static ! 197: fatal(msg, a1) ! 198: char *msg; ! 199: { ! 200: cleanup(); ! 201: log(msg, a1); ! 202: putchar('\1'); /* return error code */ ! 203: exit(1); ! 204: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.