Annotation of coherent/d/bin/hpr/lpr.c, revision 1.1.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.