Annotation of researchv10no/cmd/daemon/lpd.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  *     lpd - Printronix line printer daemon dispatcher
                      3:  */
                      4: 
                      5: #include <ctype.h>
                      6: #include <sys/ttyio.h>
                      7: #include <sys/filio.h>
                      8: 
                      9: #define        SPIDER  0
                     10: #define        PHONE   0
                     11: #define        LPD     1
                     12: 
                     13: #include       "daemon.c"
                     14: 
                     15: /*
                     16:  * The remaining part is the line printer interface.
                     17:  */
                     18: 
                     19: FILE   *lpf = NULL;
                     20: 
                     21: #define LINESIZE 1000
                     22: 
                     23: char buf[LINESIZE], ubuf[LINESIZE];
                     24: int ulen, blen;
                     25: 
                     26: dem_con()
                     27: {
                     28:        return(0);
                     29: }
                     30: 
                     31: dem_dis()
                     32: {
                     33:        FCLOSE(lpf);
                     34:        FCLOSE(dfb);
                     35: }
                     36: 
                     37: dem_open(file)
                     38: char   *file;
                     39: {
                     40:        struct sgttyb tb;
                     41:        struct ttydevb grime;
                     42:        static char iobuf[BUFSIZ];
                     43:        int ld = 0;
                     44:        extern int tty_ld;
                     45: 
                     46:        if((lpf = fopen(lp, "w")) == NULL)
                     47:                trouble("Can't open %s", lp);
                     48:        if (ioctl(fileno(lpf), FIOLOOKLD, &ld)<0 || ld!=tty_ld)
                     49:                ioctl(fileno(lpf), FIOPUSHLD, &tty_ld);
                     50:        if (ioctl(fileno(lpf), TIOCGETP, &tb) < 0)
                     51:                trouble("Can't do gtty(%s)\n", lp);
                     52:        ioctl(fileno(lpf), TIOCGDEV, &grime);
                     53:        tb.sg_ispeed = tb.sg_ospeed = B9600;    /* obsolescent */
                     54:        tb.sg_flags &= ~ALLDELAY;
                     55:        tb.sg_flags |= XTABS;
                     56:        if (ioctl(fileno(lpf), TIOCSETP, &tb) < 0)
                     57:                trouble("Can't do stty(%s)\n", lp);
                     58:        grime.ispeed = grime.ospeed = B9600;
                     59:        ioctl(fileno(lpf), TIOCSDEV, &grime);
                     60:        setbuf (lpf, iobuf);
                     61: }
                     62: 
                     63: 
                     64: dem_close()
                     65: {
                     66:        dem_dis();
                     67: }
                     68: 
                     69: get_snumb()
                     70: {
                     71: }
                     72: 
                     73: lwrite()
                     74: {
                     75:        banner(lpf, &line[1]);
                     76: }
                     77: 
                     78: 
                     79: FILE   *ibuf;
                     80: 
                     81: enum linemode {normal, large, plot};
                     82: 
                     83: /*
                     84:  *     how many rows of dots have appeared on this page.
                     85:  *
                     86:  *     there are ten rows per normal character, 20 per
                     87:  *     large character.  We count dots to know whether
                     88:  *     to emit a form feed at the end.
                     89:  */
                     90: int dots = 0;
                     91: 
                     92: /* Heights for various character modes */
                     93: #define NDOTS 10
                     94: #define LDOTS 20
                     95: #define PDOTS 1
                     96: 
                     97: /* vertical granularity in non-plot mode */
                     98: #define GRAIN 10
                     99: 
                    100: /* align x downward with granularity y */
                    101: #define align(x,y) (((x)/(y))*(y))
                    102: 
                    103: /* Page depth, in dots */
                    104: #define PAGE 660
                    105: 
                    106: sascii(fc)
                    107: char   fc;
                    108: {
                    109:        register int c, p;
                    110:        register enum linemode lm;
                    111: 
                    112:        if((ibuf = fopen(&line[1], "r")) == NULL)
                    113:                return(0);
                    114:        if(fc == 'F')
                    115:                putc(ff, lpf);
                    116: 
                    117:        clr();
                    118:        p = 0;
                    119:        lm = normal;
                    120:        while ((c = getc (ibuf)) != EOF) {
                    121:                switch (c) {
                    122: 
                    123:                case ' ':
                    124:                        ++p;
                    125:                        break;
                    126: 
                    127:                case '\b':
                    128:                        if (p > 0)
                    129:                                --p;
                    130:                        break;
                    131: 
                    132:                case '\t':
                    133:                        p = (p + 8) & -8;
                    134:                        break;
                    135: 
                    136:                case '\r':
                    137:                        p = 0;
                    138:                        break;
                    139: 
                    140:                case '\n':
                    141:                case '\f':
                    142:                        emit(c, lm);
                    143:                        lm = normal;
                    144:                        clr();
                    145:                        p = 0;
                    146:                        break;
                    147: 
                    148:                case '\033':    /* escape-backspace for expand */
                    149:                        c = getc (ibuf);
                    150:                        if (c == '\b')  
                    151:                                lm = large;
                    152:                        break;
                    153: 
                    154:                case '\005':    /* plot mode */
                    155:                        lm = plot;
                    156:                        break;
                    157: 
                    158:                default:
                    159:                        if (p < LINESIZE) {
                    160:                                if (p < blen && buf[p] != ' ') {
                    161:                                        if (c == '_' || buf[p] == '_') {
                    162:                                                ubuf[p] = '_';
                    163:                                                if (p >= ulen)
                    164:                                                        ulen = p + 1;
                    165:                                        }
                    166:                                        if (c == '_')
                    167:                                                c = buf[p];
                    168:                                }
                    169:                                buf[p++] = c;
                    170:                                if (p > blen)
                    171:                                        blen = p;
                    172:                        }
                    173:                        break;
                    174: 
                    175:                }
                    176:        }
                    177: 
                    178:        /* if we're not exactly at page end, start a new page */
                    179:        if (dots % PAGE)
                    180:                putc ('\f', lpf);
                    181: 
                    182:        fflush(lpf);
                    183:        fclose(ibuf);
                    184:        return(0);
                    185: }
                    186: 
                    187: etcp1()
                    188: {
                    189: }
                    190: 
                    191: /* VARARGS */
                    192: trouble(s, a1, a2, a3, a4)
                    193: char   *s;
                    194: {
                    195:        if(retcode != 0){
                    196:                dem_dis();
                    197:        }
                    198:        logerr(s, a1, a2, a3, a4);
                    199:        longjmp(env, 1);
                    200: }
                    201: 
                    202: /* VARARGS */
                    203: logerr(s, a1, a2, a3, a4)
                    204: char   *s;
                    205: int    a1, a2, a3, a4;
                    206: {
                    207: #ifdef DEBUG
                    208:        fprintf(stderr, s, a1, a2, a3, a4);
                    209:        putc('\n', stderr);
                    210: #endif
                    211: }
                    212: 
                    213: getowner()
                    214: {
                    215: }
                    216: 
                    217: maildname()
                    218: {
                    219:        fprintf(pmail, "Your %s job for file %s is finished, bignose.\n", DAEMNAM, mailfname);
                    220: }
                    221: 
                    222: clr()
                    223: {
                    224:        register int i;
                    225: 
                    226:        ulen = blen = 0;
                    227: 
                    228:        for (i = 0; i < LINESIZE; i++)
                    229:                buf[i] = ubuf[i] = ' ';
                    230: }
                    231: 
                    232: emit(c, mode)
                    233:        register int c;
                    234:        register enum linemode mode;
                    235: {
                    236:        register int i;
                    237: 
                    238:        switch (mode) {
                    239:        case large:
                    240:                dots = align (dots, GRAIN) + LDOTS;
                    241:                putc ('\b', lpf);
                    242:                break;
                    243: 
                    244:        case plot:
                    245:                dots += PDOTS;
                    246:                putc ('\005', lpf);
                    247:                while (blen > 0 && (buf[blen-1] & 077) == 0)
                    248:                        --blen;
                    249:                break;
                    250:        
                    251:        case normal:
                    252:                dots = align (dots, GRAIN) + NDOTS;
                    253:                break;
                    254:        }
                    255: 
                    256:        for (i = 0; i < blen; i++)
                    257:                putc (buf[i], lpf);
                    258:        
                    259:        if (ulen && mode != plot) {
                    260:                putc ('\r', lpf);
                    261:                for (i = 0; i < ulen; i++)
                    262:                        putc (ubuf[i], lpf);
                    263:        }
                    264: 
                    265:        putc (c, lpf);
                    266:        if (c == '\f')
                    267:                dots = 0;
                    268: 
                    269:        if (ferror (lpf))
                    270:                trouble ("Output error on %s\n", lp);
                    271: }

unix.superglobalmegacorp.com

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