Annotation of 40BSD/cmd/lpr/lpr.c, revision 1.1.1.1

1.1       root        1: #include <signal.h>
                      2: #include <pagsiz.h>
                      3: 
                      4: #define        BUFSIZ  BSIZE
                      5: /*
                      6:  * lpr -- on-line printer spooler
                      7:  */
                      8: 
                      9: char   tfname[]        = "/usr/spool/lpd/tfaXXXXX";
                     10: char   cfname[]        = "/usr/spool/lpd/cfaXXXXX";
                     11: char   lfname[]        = "/usr/spool/lpd/lfaXXXXX";
                     12: char   dfname[]        = "/usr/spool/lpd/dfaXXXXX";
                     13: int    nact;
                     14: int    tff;
                     15: int    mailflg;
                     16: char   person[10];
                     17: int    inchar;
                     18: int    maxrec  = 400;
                     19: 
                     20: main(argc, argv)
                     21:        int argc;
                     22:        char *argv[];
                     23: {
                     24:        register char *arg, *remote;
                     25:        int c, f, flag;
                     26:        int out();
                     27: 
                     28:        pidfn();
                     29:        if (signal(SIGINT, SIG_IGN) == SIG_DFL)
                     30:                signal(SIGINT, out);
                     31:        if (signal(SIGQUIT, SIG_IGN) == SIG_DFL)
                     32:                signal(SIGQUIT, out);
                     33:        if (signal(SIGHUP, SIG_IGN) == SIG_DFL)
                     34:                signal(SIGHUP, out);
                     35:        if (signal(SIGTERM, SIG_IGN) == SIG_DFL)
                     36:                signal(SIGTERM, out);
                     37:        remote = "$     remote  **,onl";
                     38:        flag = 0;
                     39:        tff = nfile(tfname);
                     40:        while (argc>1 && (arg = argv[1])[0]=='-') {
                     41:                if (arg[1] && arg[2]) {
                     42:                        remote[12] = arg[1];
                     43:                        remote[13] = arg[2];
                     44:                        remote[14] = 0;
                     45:                } else switch (arg[1]) {
                     46: 
                     47:                case '-':
                     48:                        remote[12] = 'r';
                     49:                        remote[13] = '1';
                     50:                        remote[14] = '\0';
                     51:                        break;
                     52: 
                     53:                case 'c':
                     54:                        flag = '+';
                     55:                        break;
                     56: 
                     57:                case 'r':
                     58:                        flag = '-';
                     59:                        break;
                     60: 
                     61:                case 'm':
                     62:                        mailflg = 1;
                     63:                        break;
                     64:                }
                     65:                argc--;
                     66:                argv++;
                     67:        }
                     68:        ident();
                     69:        if(argc == 1)
                     70:                copy(0);
                     71:        while(--argc) {
                     72:                arg = *++argv;
                     73:                if(flag == '+')
                     74:                        goto cf;
                     75: /*
                     76:  * This may not work because the daemon runs as someone else, so don't bother
                     77:                if(*arg == '/' && flag != '-') {
                     78:                        card('F', arg);
                     79:                        nact++;
                     80:                        continue;
                     81:                }
                     82:  */
                     83:                if(link(arg, lfname) < 0)
                     84:                        goto cf;
                     85:                card('F', lfname);
                     86:                card('U', lfname);
                     87:                lfname[inchar]++;
                     88:                nact++;
                     89:                goto df;
                     90: 
                     91:        cf:
                     92:                f = open(arg, 0);
                     93:                if(f < 0) {
                     94:                        printf("Cannot open %s\n", arg);
                     95:                        continue;
                     96:                }
                     97:                copy(f);
                     98:                close(f);
                     99: 
                    100:        df:
                    101:                if(flag == '-') {
                    102:                        f = unlink(arg);
                    103:                        if(f < 0)
                    104:                                printf("Cannot remove %s\n", arg);
                    105:                }
                    106:        }
                    107: 
                    108:        if(nact) {
                    109:                tfname[inchar]--;
                    110:                f = link(tfname, dfname);
                    111:                if(f < 0) {
                    112:                        printf("Cannot rename %s\n", dfname);
                    113:                        tfname[inchar]++;
                    114:                        out();
                    115:                }
                    116:                unlink(tfname);
                    117:                execl("/usr/lib/lpd", "lpd", 0);
                    118:                dfname[inchar]++;
                    119:                printf("Daemon doesn't exist\n");
                    120:                exit(0);
                    121:        }
                    122:        out();
                    123: }
                    124: 
                    125: copy(f)
                    126: int f;
                    127: {
                    128:        int ff, i, nr, nc;
                    129:        static char buf[BUFSIZ];
                    130: 
                    131:        card('F', cfname);
                    132:        card('U', cfname);
                    133:        ff = nfile(cfname);
                    134:        nc = 0;
                    135:        nr = 0;
                    136:        while((i = read(f, buf, BUFSIZ)) > 0) {
                    137:                write(ff, buf, i);
                    138:                nc += i;
                    139:                if(nc >= BUFSIZ) {
                    140:                        nc -= BUFSIZ;
                    141:                        nr++;
                    142:                        if(nr > maxrec) {
                    143:                                printf("Copy file is too large\n");
                    144:                                break;
                    145:                        }
                    146:                }
                    147:        }
                    148:        close(ff);
                    149:        nact++;
                    150: }
                    151: 
                    152: card(c, s)
                    153: int c;
                    154: char s[];
                    155: {
                    156:        char *p1, *p2;
                    157:        static char buf[BUFSIZ];
                    158:        int col;
                    159: 
                    160:        p1 = buf;
                    161:        p2 = s;
                    162:        col = 0;
                    163:        *p1++ = c;
                    164:        while((c = *p2++) != '\0') {
                    165:                *p1++ = c;
                    166:                col++;
                    167:        }
                    168:        *p1++ = '\n';
                    169:        write(tff, buf, col+2);
                    170: }
                    171: 
                    172: ident()
                    173: {
                    174:        int c, n;
                    175:        register char *b1p, *pp, *b2p;
                    176:        static char b1[100], b2[100];
                    177: 
                    178:        b1p = b1;
                    179:        if(getpw(getuid(), b1p)) {
                    180:                b1p = "pdp::::m0000,m000:";
                    181:        }
                    182:        n = 0;
                    183:        b2p = b2;
                    184:        while(*b2p++ = "$       ident   "[n++]);
                    185:        b2p--;
                    186:        n = 5;
                    187:        while(--n) while(*b1p++ != ':');
                    188:        while((*b2p++ = *b1p++) != ':');
                    189:        b2p[-1] = ',';
                    190:        b1p = b1;
                    191:        pp = person;
                    192:        while((c = *b1p++) != ':') {
                    193:                *b2p++ = c;
                    194:                *pp++ = c;
                    195:        }
                    196:        *b2p++ = 0;
                    197:        *pp++ = 0;
                    198:        card('L', person);
                    199:        if (mailflg)
                    200:                card('M', person);
                    201: }
                    202: 
                    203: pidfn()
                    204: {
                    205:        register i, j, c;
                    206:        int s;
                    207:        int p;
                    208: 
                    209:        s = p = getpid();
                    210:        p &= 077777;
                    211:        i = 0;
                    212:        while(tfname[i] != 'X')
                    213:                i++;
                    214:        i += 4;
                    215:        for(j=0; j<5; j++) {
                    216:                c = (p%10) + '0';
                    217:                if(s<0 && j==4)
                    218:                        c += 4;
                    219:                p /= 10;
                    220:                tfname[i] = c;
                    221:                cfname[i] = c;
                    222:                lfname[i] = c;
                    223:                dfname[i] = c;
                    224:                i--;
                    225:        }
                    226:        inchar = i;
                    227: }
                    228: 
                    229: nfile(name)
                    230: char *name;
                    231: {
                    232:        register f;
                    233: 
                    234:        f = creat(name, 0644);
                    235:        if(f < 0) {
                    236:                printf("Cannot create %s\n", name);
                    237:                out();
                    238:        }
                    239:        name[inchar]++;
                    240:        return(f);
                    241: }
                    242: 
                    243: out()
                    244: {
                    245:        register i;
                    246: 
                    247:        signal(SIGINT, SIG_IGN);
                    248:        signal(SIGQUIT, SIG_IGN);
                    249:        signal(SIGHUP, SIG_IGN);
                    250:        signal(SIGTERM, SIG_IGN);
                    251:        i = inchar;
                    252:        while(tfname[i] != 'a') {
                    253:                tfname[i]--;
                    254:                unlink(tfname);
                    255:        }
                    256:        while(cfname[i] != 'a') {
                    257:                cfname[i]--;
                    258:                unlink(cfname);
                    259:        }
                    260:        while(lfname[i] != 'a') {
                    261:                lfname[i]--;
                    262:                unlink(lfname);
                    263:        }
                    264:        while(dfname[i] != 'a') {
                    265:                dfname[i]--;
                    266:                unlink(dfname);
                    267:        }
                    268:        exit(0);
                    269: }

unix.superglobalmegacorp.com

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