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

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

unix.superglobalmegacorp.com

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