1: /*
   2:  * Copyright (c) 1983 Regents of the University of California.
   3:  * All rights reserved.  The Berkeley software License Agreement
   4:  * specifies the terms and conditions for redistribution.
   5:  */
   6: 
   7: #ifndef lint
   8: static char sccsid[] = "@(#)common.c	5.2 (Berkeley) 5/6/86";
   9: #endif not lint
  10: 
  11: /*
  12:  * Routines and data common to all the line printer functions.
  13:  */
  14: 
  15: #include "lp.h"
  16: 
  17: int DU;     /* daeomon user-id */
  18: int MX;     /* maximum number of blocks to copy */
  19: int MC;     /* maximum number of copies allowed */
  20: char    *LP;        /* line printer device name */
  21: char    *RM;        /* remote machine name */
  22: char    *RP;        /* remote printer name */
  23: char    *LO;        /* lock file name */
  24: char    *ST;        /* status file name */
  25: char    *SD;        /* spool directory */
  26: char    *AF;        /* accounting file */
  27: char    *LF;        /* log file for error messages */
  28: char    *OF;        /* name of output filter (created once) */
  29: char    *IF;        /* name of input filter (created per job) */
  30: char    *RF;        /* name of fortran text filter (per job) */
  31: char    *TF;        /* name of troff filter (per job) */
  32: char    *NF;        /* name of ditroff filter (per job) */
  33: char    *DF;        /* name of tex filter (per job) */
  34: char    *GF;        /* name of graph(1G) filter (per job) */
  35: char    *VF;        /* name of vplot filter (per job) */
  36: char    *CF;        /* name of cifplot filter (per job) */
  37: char    *PF;        /* name of vrast filter (per job) */
  38: char    *FF;        /* form feed string */
  39: char    *TR;        /* trailer string to be output when Q empties */
  40: short   SC;     /* suppress multiple copies */
  41: short   SF;     /* suppress FF on each print job */
  42: short   SH;     /* suppress header page */
  43: short   SB;     /* short banner instead of normal header */
  44: short   HL;     /* print header last */
  45: short   RW;     /* open LP for reading and writing */
  46: short   PW;     /* page width */
  47: short   PL;     /* page length */
  48: short   PX;     /* page width in pixels */
  49: short   PY;     /* page length in pixels */
  50: short   BR;     /* baud rate if lp is a tty */
  51: int FC;     /* flags to clear if lp is a tty */
  52: int FS;     /* flags to set if lp is a tty */
  53: int XC;     /* flags to clear for local mode */
  54: int XS;     /* flags to set for local mode */
  55: short   RS;     /* restricted to those with local accounts */
  56: 
  57: char    line[BUFSIZ];
  58: char    pbuf[BUFSIZ/2]; /* buffer for printcap strings */
  59: char    *bp = pbuf; /* pointer into pbuf for pgetent() */
  60: char    *name;      /* program name */
  61: char    *printer;   /* printer name */
  62: char    host[32];   /* host machine name */
  63: char    *from = host;   /* client's machine name */
  64: 
  65: /*
  66:  * Create a connection to the remote printer server.
  67:  * Most of this code comes from rcmd.c.
  68:  */
  69: getport(rhost)
  70:     char *rhost;
  71: {
  72:     struct hostent *hp;
  73:     struct servent *sp;
  74:     struct sockaddr_in sin;
  75:     int s, timo = 1, lport = IPPORT_RESERVED - 1;
  76:     int err;
  77: 
  78:     /*
  79: 	 * Get the host address and port number to connect to.
  80: 	 */
  81:     if (rhost == NULL)
  82:         fatal("no remote host to connect to");
  83:     hp = gethostbyname(rhost);
  84:     if (hp == NULL)
  85:         fatal("unknown host %s", rhost);
  86:     sp = getservbyname("printer", "tcp");
  87:     if (sp == NULL)
  88:         fatal("printer/tcp: unknown service");
  89:     bzero((char *)&sin, sizeof(sin));
  90:     bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);
  91:     sin.sin_family = hp->h_addrtype;
  92:     sin.sin_port = sp->s_port;
  93: 
  94:     /*
  95: 	 * Try connecting to the server.
  96: 	 */
  97: retry:
  98:     s = rresvport(&lport);
  99:     if (s < 0)
 100:         return(-1);
 101:     if (connect(s, (caddr_t)&sin, sizeof(sin), 0) < 0) {
 102:         err = errno;
 103:         (void) close(s);
 104:         errno = err;
 105:         if (errno == EADDRINUSE) {
 106:             lport--;
 107:             goto retry;
 108:         }
 109:         if (errno == ECONNREFUSED && timo <= 16) {
 110:             sleep(timo);
 111:             timo *= 2;
 112:             goto retry;
 113:         }
 114:         return(-1);
 115:     }
 116:     return(s);
 117: }
 118: 
 119: /*
 120:  * Getline reads a line from the control file cfp, removes tabs, converts
 121:  *  new-line to null and leaves it in line.
 122:  * Returns 0 at EOF or the number of characters read.
 123:  */
 124: getline(cfp)
 125:     FILE *cfp;
 126: {
 127:     register int linel = 0;
 128:     register char *lp = line;
 129:     register c;
 130: 
 131:     while ((c = getc(cfp)) != '\n') {
 132:         if (c == EOF)
 133:             return(0);
 134:         if (c == '\t') {
 135:             do {
 136:                 *lp++ = ' ';
 137:                 linel++;
 138:             } while ((linel & 07) != 0);
 139:             continue;
 140:         }
 141:         *lp++ = c;
 142:         linel++;
 143:     }
 144:     *lp++ = '\0';
 145:     return(linel);
 146: }
 147: 
 148: /*
 149:  * Scan the current directory and make a list of daemon files sorted by
 150:  * creation time.
 151:  * Return the number of entries and a pointer to the list.
 152:  */
 153: getq(namelist)
 154:     struct queue *(*namelist[]);
 155: {
 156:     register struct direct *d;
 157:     register struct queue *q, **queue;
 158:     register int nitems;
 159:     struct stat stbuf;
 160:     int arraysz, compar();
 161:     DIR *dirp;
 162: 
 163:     if ((dirp = opendir(SD)) == NULL)
 164:         return(-1);
 165:     if (fstat(dirp->dd_fd, &stbuf) < 0)
 166:         goto errdone;
 167: 
 168:     /*
 169: 	 * Estimate the array size by taking the size of the directory file
 170: 	 * and dividing it by a multiple of the minimum size entry.
 171: 	 */
 172:     arraysz = (stbuf.st_size / 24);
 173:     queue = (struct queue **)malloc(arraysz * sizeof(struct queue *));
 174:     if (queue == NULL)
 175:         goto errdone;
 176: 
 177:     nitems = 0;
 178:     while ((d = readdir(dirp)) != NULL) {
 179:         if (d->d_name[0] != 'c' || d->d_name[1] != 'f')
 180:             continue;   /* daemon control files only */
 181:         if (stat(d->d_name, &stbuf) < 0)
 182:             continue;   /* Doesn't exist */
 183:         q = (struct queue *)malloc(sizeof(time_t)+strlen(d->d_name)+1);
 184:         if (q == NULL)
 185:             goto errdone;
 186:         q->q_time = stbuf.st_mtime;
 187:         strcpy(q->q_name, d->d_name);
 188:         /*
 189: 		 * Check to make sure the array has space left and
 190: 		 * realloc the maximum size.
 191: 		 */
 192:         if (++nitems > arraysz) {
 193:             queue = (struct queue **)realloc((char *)queue,
 194:                 (stbuf.st_size/12) * sizeof(struct queue *));
 195:             if (queue == NULL)
 196:                 goto errdone;
 197:         }
 198:         queue[nitems-1] = q;
 199:     }
 200:     closedir(dirp);
 201:     if (nitems)
 202:         qsort(queue, nitems, sizeof(struct queue *), compar);
 203:     *namelist = queue;
 204:     return(nitems);
 205: 
 206: errdone:
 207:     closedir(dirp);
 208:     return(-1);
 209: }
 210: 
 211: /*
 212:  * Compare modification times.
 213:  */
 214: static
 215: compar(p1, p2)
 216:     register struct queue **p1, **p2;
 217: {
 218:     if ((*p1)->q_time < (*p2)->q_time)
 219:         return(-1);
 220:     if ((*p1)->q_time > (*p2)->q_time)
 221:         return(1);
 222:     return(0);
 223: }
 224: 
 225: /*VARARGS1*/
 226: fatal(msg, a1, a2, a3)
 227:     char *msg;
 228: {
 229:     if (from != host)
 230:         printf("%s: ", host);
 231:     printf("%s: ", name);
 232:     if (printer)
 233:         printf("%s: ", printer);
 234:     printf(msg, a1, a2, a3);
 235:     putchar('\n');
 236:     exit(1);
 237: }

Defined functions

compar defined in line 214; used 2 times
fatal defined in line 226; used 34 times

Defined variables

AF defined in line 26; used 2 times
BR defined in line 50; used 4 times
CF defined in line 36; used 2 times
DF defined in line 33; used 2 times
DU defined in line 17; used 3 times
FC defined in line 51; used 3 times
FF defined in line 38; used 10 times
FS defined in line 52; used 3 times
GF defined in line 34; used 2 times
HL defined in line 44; used 3 times
IF defined in line 29; used 5 times
LF defined in line 27; used 8 times
LO defined in line 23; used 17 times
LP defined in line 20; used 9 times
MC defined in line 19; never used
MX defined in line 18; never used
NF defined in line 32; used 2 times
OF defined in line 28; used 6 times
PF defined in line 37; never used
PL defined in line 47; used 3 times
PW defined in line 46; used 4 times
PX defined in line 48; used 3 times
PY defined in line 49; used 3 times
RF defined in line 30; used 2 times
RM defined in line 21; used 15 times
RP defined in line 22; used 6 times
RS defined in line 55; used 2 times
RW defined in line 45; used 2 times
SB defined in line 43; used 2 times
SC defined in line 40; never used
SD defined in line 25; used 16 times
SF defined in line 41; used 5 times
SH defined in line 42; used 3 times
ST defined in line 24; used 4 times
TF defined in line 31; used 2 times
TR defined in line 39; used 4 times
VF defined in line 35; used 2 times
XC defined in line 53; used 5 times
XS defined in line 54; used 5 times
from defined in line 63; used 16 times
host defined in line 62; used 22 times
line defined in line 57; used 59 times
pbuf defined in line 58; used 2 times
sccsid defined in line 8; never used
Last modified: 1986-05-07
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2524
Valid CSS Valid XHTML 1.0 Strict