smk (12/30/82)
I found another bug in lpd.c. There is an exit that doesn't first remove the LOCK file. Here is my diff to lpd.c that I have so far. Any other fixes you may have as far as the printer locking up? I'd like to hear of them. I'll post these to the net later if they aren't complete rewrites of lpr/lpd/lpf/... *** lpd.c.orig Thu Jul 2 06:18:02 1981 --- lpd.c Wed Dec 29 18:04:40 1982 *************** *** 82,87 ptr = top; top->next = top; if ( (fp = fopen(SPOOL_DIR,"r")) == NULL ) exit(1); while (fread(&dbuf, sizeof dbuf, 1, fp) == 1) { --- 82,91 ----- ptr = top; top->next = top; if ( (fp = fopen(SPOOL_DIR,"r")) == NULL ) + #ifdef MITRE + { + /* Don't forget to remove LOCK any time we exit. */ + unlink (LOCK); exit(1); } #else *************** *** 83,88 top->next = top; if ( (fp = fopen(SPOOL_DIR,"r")) == NULL ) exit(1); while (fread(&dbuf, sizeof dbuf, 1, fp) == 1) { if (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f') --- 87,96 ----- /* Don't forget to remove LOCK any time we exit. */ unlink (LOCK); exit(1); + } + #else + exit(1); + #endif while (fread(&dbuf, sizeof dbuf, 1, fp) == 1) { if (dbuf.d_ino==0 || dbuf.d_name[0]!='d' || dbuf.d_name[1]!='f') *************** *** 111,116 ptr = top; top = top->next; cfree(ptr); return(sp); } --- 119,128 ----- ptr = top; top = top->next; cfree(ptr); + #ifdef MITRE + /* Forgot to close the spool directory. */ + (void) fclose (fp); + #endif return(sp); } *************** *** 159,164 continue; case 'F': if (send()) return(1); continue; --- 171,186 ----- continue; case 'F': + #ifdef MITRE + /* We must close the open file when the printer + goes off-line, or pretty soon (after 15 attempts + to retry) the file limit is exceeded and the + lock doesn't go away. */ + if (send()) { + (void) fclose(dfb); + return(1); + } + #else if (send()) return(1); #endif *************** *** 161,166 case 'F': if (send()) return(1); continue; case 'U': --- 183,189 ----- #else if (send()) return(1); + #endif continue; case 'U':
jim (12/30/82)
While we are on the subject of line printers ... A lot of people seem to be using Printronix printers, and the standard lpf doesn't handle underlining or plot mode correctly for a Printronix. Here is my diff listing to lpf.c to make them work. *** lpf.c_o Tue Sep 15 08:02:34 1981 --- lpf.c Tue Sep 7 16:44:43 1982 *************** *** 1,6 static char *sccsid = "@(#)lpf.c 4.5 (Berkeley) 81/06/10"; /* * lpf -- Line printer filter */ #include <stdio.h> --- 1,11 ----- static char *sccsid = "@(#)lpf.c 4.5 (Berkeley) 81/06/10"; /* * lpf -- Line printer filter + * + * Jim Rees Added baud rate to ttyb + * 8 July 82 Jim Rees Fixed underlining for Printronix + * 23 Aug 82 Jim Rees Fixed plot mode for Printronix + * 7 Sept 82 Joe Kelsey Fixed formfeed for Printronix */ #include <stdio.h> *************** *** 7,12 #include <sgtty.h> #include <signal.h> #define LINELN 132 #define EJLINE 66 #define SKPLINE 0 --- 12,19 ----- #include <sgtty.h> #include <signal.h> + #define PRINTRONIX /* Special modes for Printronix */ + #define LINELN 132 #define EJLINE 66 #define SKPLINE 0 *************** *** 14,19 int anydone; char linebuf[LINELN+2]; int ov; char ovbuf[LINELN]; FILE *in = {stdin}; FILE *out; --- 21,27 ----- int anydone; char linebuf[LINELN+2]; int ov; + int plotmode; char ovbuf[LINELN]; FILE *in = {stdin}; FILE *out; *************** *** 122,127 register int col, maxcol, c; ov = 0; for (col=0; col<LINELN; col++) { linebuf[col] = ' '; ovbuf[col] = 0; --- 130,136 ----- register int col, maxcol, c; ov = 0; + plotmode = 0; for (col=0; col<LINELN; col++) { linebuf[col] = ' '; ovbuf[col] = 0; *************** *** 147,152 } continue; case '\f': lineno = EJLINE; continue; --- 156,168 ----- } continue; + #ifdef PRINTRONIX + case '\05': + plotmode = 1; + lineno = 1; /* To prevent SKPLINE, EJLINE */ + continue; + #endif PRINTRONIX + case '\f': lineno = EJLINE; #ifdef PRINTRONIX *************** *** 149,154 case '\f': lineno = EJLINE; continue; case ' ': --- 165,176 ----- case '\f': lineno = EJLINE; + #ifdef PRINTRONIX + if (maxcol >= LINELN) + maxcol = LINELN; + linebuf[maxcol] = 0; + return 1; + #else continue; #endif PRINTRONIX case ' ': *************** *** 150,156 case '\f': lineno = EJLINE; continue; ! case ' ': col++; continue; --- 172,178 ----- return 1; #else continue; ! #endif PRINTRONIX case ' ': col++; continue; *************** *** 201,215 int i, j; errno = 0; ! /* ! if (ov) do { ! for (ep= &ovbuf[LINELN-1]; *ep == 0; ep--) ! continue; ! for (lp=ovbuf; lp <= ep; lp++) ! output(*lp ? *lp : ' ', out); ! }; ! */ ! again: if (ff >= 0) { lp = linebuf; while (c = *lp++) --- 223,229 ----- int i, j; errno = 0; ! if (ff >= 0) { lp = linebuf; #ifdef PRINTRONIX *************** *** 212,217 again: if (ff >= 0) { lp = linebuf; while (c = *lp++) output(c,out); } --- 226,235 ----- if (ff >= 0) { lp = linebuf; + #ifdef PRINTRONIX + if (plotmode) + output('\05', out); + #endif PRINTRONIX while (c = *lp++) output(c,out); } *************** *** 215,220 while (c = *lp++) output(c,out); } if (ff > 0) { putc('\014', out); putc('\r', out); --- 233,249 ----- while (c = *lp++) output(c,out); } + + #ifdef PRINTRONIX + if (ov) { + output('\r', out); + for (ep= &ovbuf[LINELN-1]; *ep == 0; ep--) + continue; + for (lp=ovbuf; lp <= ep; lp++) + output(*lp ? *lp : ' ', out); + } + #endif PRINTRONIX + if (ff > 0) { putc('\014', out); putc('\r', out); *************** *** 298,304 if (c == -1) return; c &= 0177; ! if (c == 0177) putc('^',fp), c = '?'; if (c == 033) c = '$'; --- 327,333 ----- if (c == -1) return; c &= 0177; ! if (c == 0177 && !plotmode) putc('^',fp), c = '?'; if (c == 033) c = '$'; *************** *** 311,316 case '\b': case '\t': case '\r': break; default: --- 340,348 ----- case '\b': case '\t': case '\r': + #ifdef PRINTRONIX + case '\05': + #endif PRINTRONIX break; default: