Annotation of 3BSD/cmd/lpr/lpr.c, revision 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.