Annotation of coherent/d/bin/hpr/lpr.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Submit a listing to the local line
        !             3:  * printer spooler.
        !             4:  */
        !             5: 
        !             6: #include <stdio.h>
        !             7: #include <pwd.h>
        !             8: #include <signal.h>
        !             9: #ifndef        TYPES_H
        !            10: #include <sys/types.h>
        !            11: #endif
        !            12: 
        !            13: /* Schizo is missing so -r doesn't check access privileges */
        !            14: #define        NBAN    6               /* Maximum number of banners */
        !            15: #define        NFNAME  400             /* Longest filename allowed */
        !            16: 
        !            17: char   *banners[NBAN];
        !            18: char   tfspace[20];
        !            19: char   cfname[20];
        !            20: char   dfname[20];
        !            21: char   *tfname;                /* Control file during lpr */
        !            22: char   *wd;
        !            23: char   *myuname;
        !            24: char   *argv0;
        !            25: FILE   *cfp;                   /* Control file stream */
        !            26: #ifdef LASER
        !            27: char   spooldir[] = "/usr/spool/hpd";
        !            28: char   lpd[] = "/usr/lib/hpd";
        !            29: #else
        !            30: char   spooldir[] = "/usr/spool/lpd";
        !            31: char   lpd[] = "/usr/lib/lpd";
        !            32: #endif
        !            33: char   tmb[] = "Too many banners, `%s' ignored";
        !            34: 
        !            35: int    Bflag;          /* Suppress banners */  
        !            36: int    cflag;          /* Generate a copy */
        !            37: int    mflag;          /* Send notification */
        !            38: int    rflag;          /* Remove when done */
        !            39: int    banno = 4;      /* Current banner number */
        !            40: int    myuid;
        !            41: 
        !            42: long   unique();
        !            43: char   *absname();
        !            44: char   *getwd();
        !            45: char   *ctime();
        !            46: char   *getlogin();
        !            47: int    rmexit();
        !            48: 
        !            49: main(argc, argv)
        !            50: char *argv[];
        !            51: {
        !            52:        register char *ap;
        !            53:        register int i, j;
        !            54: 
        !            55:        argv0 = argv[0];
        !            56:        signal(SIGINT, rmexit);
        !            57:        signal(SIGHUP, rmexit);
        !            58:        for (i=1; i<argc; i++) {
        !            59:                if (*argv[i] != '-')
        !            60:                        break;
        !            61:                for (ap = &argv[i][1]; *ap != '\0'; ap++)
        !            62:                        switch (*ap) {
        !            63:                        case 'B':
        !            64:                                ++Bflag;
        !            65:                                break;
        !            66: 
        !            67:                        case 'b':
        !            68:                                if (++i >= argc)
        !            69:                                        lperr("Missing banner");
        !            70:                                if (banno >= NBAN)
        !            71:                                        fprintf(stderr, tmb, argv[i]);
        !            72:                                else
        !            73:                                        banners[banno++] = argv[i];
        !            74:                                break;
        !            75: 
        !            76:                        case 'c':
        !            77:                                cflag = 1;
        !            78:                                break;
        !            79: 
        !            80:                        case 'm':
        !            81:                                mflag = 1;
        !            82:                                break;
        !            83: 
        !            84:                        case 'n':
        !            85:                                mflag = 0;
        !            86:                                break;
        !            87: 
        !            88:                        case 'r':
        !            89:                                cflag = rflag = 1;
        !            90:                                break;
        !            91: 
        !            92:                        default:
        !            93:                                usage();
        !            94:                        }
        !            95:        }
        !            96:        lprinit(argc, argv);
        !            97:        if (Bflag)
        !            98:                fprintf(cfp, "B\n");
        !            99:        for (j=i; j<argc; j++)
        !           100:                if (banno < NBAN)
        !           101:                        banners[banno++] = argv[j];
        !           102:                else
        !           103:                        break;
        !           104:        for (j=0; j<banno; j++)
        !           105:                fprintf(cfp, "L%s\n", banners[j]);
        !           106:        if (i == argc)
        !           107:                lpr(NULL);
        !           108:        else
        !           109:                for (; i<argc; i++)
        !           110:                        lpr(argv[i]);
        !           111:        lprterm();
        !           112:        for (i=3; i<_NFILE; i++)
        !           113:                close(i);
        !           114:        close(0);
        !           115:        execl(lpd, lpd, NULL);
        !           116:        lperr("Cannot find daemon `%s'", lpd);
        !           117: }
        !           118: 
        !           119: /*
        !           120:  * Initialise the control file.
        !           121:  * Set up the banners.
        !           122:  */
        !           123: lprinit(ac, av)
        !           124: char **av;
        !           125: {
        !           126:        time_t time(), xtime;
        !           127:        register int i;
        !           128:        register struct passwd *pwp;
        !           129:        register char *s;
        !           130: 
        !           131:        myuid = getuid();
        !           132:        wd = getwd();
        !           133:        if (chdir(spooldir) < 0)
        !           134:                lperr("bad directory `%s'", spooldir);
        !           135:        tfname = tfspace;
        !           136:        sprintf(tfname, "tf%ld", unique());
        !           137:        strcpy(cfname, tfname);
        !           138:        cfname[0] = 'c';
        !           139:        if ((cfp = fopen(tfname, "w")) == NULL)
        !           140:                lperr("cannot create control file");
        !           141:        putc('D', cfp);
        !           142:        for (i=0; i<ac; i++)
        !           143:                fprintf(cfp, "%s%c", av[i], i==ac-1 ? '\n' : ' ');
        !           144:        banners[0] = "\35\36\37";
        !           145:        banners[1] = "Coherent";                /* Mark Williams logo */
        !           146:        xtime = time(NULL);
        !           147:        s = ctime(&xtime);
        !           148:        s[16] = '\0';
        !           149:        banners[2] = s;
        !           150:        if ((myuname = getlogin()) == NULL)
        !           151:                if ((pwp = getpwuid(myuid))==NULL)
        !           152:                        myuname = "Guess who?";
        !           153:        if (myuname == NULL)
        !           154:                banners[3] = "Guess who?"; else
        !           155:                banners[3] = myuname;
        !           156: }
        !           157: 
        !           158: /*
        !           159:  * Called for each file to put
        !           160:  * an entry for it in the control
        !           161:  * file and do any copies to the
        !           162:  * spool area.
        !           163:  * The NULL `file' is stdin.
        !           164:  */
        !           165: lpr(file)
        !           166: char *file;
        !           167: {
        !           168:        FILE *ifp;
        !           169:        char *abfile;
        !           170: 
        !           171:        if (file == NULL)
        !           172:                ifp = stdin;
        !           173:        else {
        !           174:                abfile = absname(file);
        !           175:                if ((ifp = fopen(abfile, "r")) == NULL)
        !           176:                        lperr("cannot open %s", file);
        !           177:        }
        !           178:        if (cflag || file==NULL) {
        !           179:                copy(ifp);
        !           180:                fprintf(cfp, "A%s\nU%s\n", dfname, dfname);
        !           181:                dfname[0] = '\0';
        !           182:        } else
        !           183:                fprintf(cfp, "A%s\n", abfile);
        !           184:        if (rflag && file!=NULL) {
        !           185:                if (unperm(abfile)<0 || unlink(abfile)<0)
        !           186:                        lperr("Cannot unlink %s", file);
        !           187:        }
        !           188:        if (file != NULL)
        !           189:                fclose(ifp);
        !           190: }
        !           191: 
        !           192: /*
        !           193:  * Given a file, see if we have permissions to unlink it.
        !           194:  */
        !           195: unperm(np)
        !           196: register char *np;
        !           197: {
        !           198:        register char *cp;
        !           199:        char name[NFNAME];
        !           200: 
        !           201:        cp = name;
        !           202:        while ((*cp++=*np++) != '\0')
        !           203:                ;
        !           204:        while (*--cp != '/') {
        !           205:                if (cp == name) {
        !           206:                        *cp = '.';
        !           207:                        break;
        !           208:                }
        !           209:        }
        !           210:        cp[1] = '\0';
        !           211:        return (access(name, 2));
        !           212: }
        !           213: 
        !           214: /*
        !           215:  * Clean up and close out
        !           216:  * control file.
        !           217:  */
        !           218: lprterm()
        !           219: {
        !           220:        if (mflag)
        !           221:                if (myuname == NULL)
        !           222:                        fprintf(cfp, "M%d\n", myuid); else
        !           223:                        fprintf(cfp, "M%s\n", myuname);
        !           224:        fflush(cfp);
        !           225:        if (ferror(cfp))
        !           226:                lperr("Control file I/O error");
        !           227:        fclose(cfp);
        !           228:        link(tfname, cfname);
        !           229:        unlink(tfname);
        !           230:        tfname = NULL;
        !           231: }
        !           232: 
        !           233: /*
        !           234:  * Copy the data to a data file
        !           235:  * in the spool directory.
        !           236:  */
        !           237: copy(inf)
        !           238: register FILE *inf;
        !           239: {
        !           240:        register int c;
        !           241:        register FILE *outf;
        !           242: 
        !           243:        sprintf(dfname, "df%ld", unique());
        !           244:        if ((outf = fopen(dfname, "w")) == NULL)
        !           245:                lperr("cannot create data file");
        !           246:        while ((c = getc(inf)) != EOF)
        !           247:                putc(c, outf);
        !           248:        fflush(outf);
        !           249:        if (ferror(outf))
        !           250:                lperr("data file I/O error");
        !           251:        fclose(outf);
        !           252: }
        !           253: 
        !           254: /*
        !           255:  * Return an absolute pathname
        !           256:  * for the given filename.
        !           257:  * (Uses the variable `wd' which
        !           258:  * contains the process's working
        !           259:  * directory.)
        !           260:  */
        !           261: char *
        !           262: absname(fn)
        !           263: char *fn;
        !           264: {
        !           265:        static char name[NFNAME];
        !           266: 
        !           267:        if (*fn == '/')
        !           268:                return (fn);
        !           269:        sprintf(name, "%s/%s", wd, fn);
        !           270:        return (name);
        !           271: }
        !           272: 
        !           273: usage()
        !           274: {
        !           275:        fprintf(stderr, "Usage: %s [-Bcmnr] [-b banner] [file ...]\n", argv0);
        !           276:        rmexit(1);
        !           277: }
        !           278: 
        !           279: /* VARARGS */
        !           280: lperr(x)
        !           281: {
        !           282:        fprintf(stderr, "%s: %r\n", argv0, &x);
        !           283:        rmexit(1);
        !           284: }
        !           285: 
        !           286: /*
        !           287:  * Exit, removing any files that
        !           288:  * are left lying around.
        !           289:  */
        !           290: rmexit(s)
        !           291: {
        !           292:        if (tfname != NULL)
        !           293:                unlink(tfname);
        !           294:        if (dfname[0] != '\0')
        !           295:                unlink(dfname);
        !           296:        exit(s);
        !           297: }

unix.superglobalmegacorp.com

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