home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume32 / lprps / patch01 next >
Text File  |  1992-10-06  |  17KB  |  684 lines

  1. Newsgroups: comp.sources.misc
  2. From: jjc@jclark.com (James Clark)
  3. Subject:  v32i094:  lprps - interface lpr to a PostScript printer, Patch01
  4. Message-ID: <1992Oct4.165224.4203@sparky.imd.sterling.com>
  5. X-Md4-Signature: dcbe848e0bea4e28be01e1c8910490c3
  6. Date: Sun, 4 Oct 1992 16:52:24 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: jjc@jclark.com (James Clark)
  10. Posting-number: Volume 32, Issue 94
  11. Archive-name: lprps/patch01
  12. Environment: BSD, SUNOS
  13. Patch-To: lprps: Volume 31, Issue 77-78
  14.  
  15. This patch updates lprps version 2.3 to version 2.4.  It improves
  16. lprps's response to various error conditions that were occurring on
  17. Ultrix systems.  It also improves psof's robustness and permits it to
  18. be used in conjunction with the `hl' capability (which specifies that
  19. the banner page should be printed at the end of a job).
  20.  
  21. James Clark
  22. jjc@jclark.com
  23.  
  24. Prereq: 2.3.
  25. *** lprps-2.3/README    Tue Sep 29 10:18:06 1992
  26. --- lprps-2.4/README    Tue Sep 29 10:15:48 1992
  27. ***************
  28. *** 1,3 ****
  29. ! This is lprps version 2.3.
  30.   
  31.   lprps is a collection of programs for using lpr with a PostScript
  32. --- 1,3 ----
  33. ! This is lprps version 2.4.
  34.   
  35.   lprps is a collection of programs for using lpr with a PostScript
  36. ***************
  37. *** 58,60 ****
  38.   jjc@jclark.com
  39.   
  40. ! $Id: README,v 1.12 1992/08/14 16:34:21 jjc Exp $
  41. --- 58,60 ----
  42.   jjc@jclark.com
  43.   
  44. ! $Id: README,v 1.13 1992/09/29 09:14:36 jjc Exp $
  45. *** lprps-2.3/INSTALL    Tue Sep 29 10:18:06 1992
  46. --- lprps-2.4/INSTALL    Tue Sep 29 10:15:48 1992
  47. ***************
  48. *** 15,25 ****
  49.   
  50.   This entry would be appropriate if you were using /dev/ttya and a baud
  51. ! rate of 38400.  You need to create the spool directory
  52. ! (/usr/spool/pslpd), the accounting file (/usr/adm/psacct), and the log
  53. ! file (/usr/adm/pslog).  The spool directory and the accounting file
  54. ! should be owned by daemon, the log file by root. You can use other
  55. ! names if you want.  The `ms' capabability is a Sun extension.  If you
  56. ! decide to make use of the patches in lpr.diff, you should also add the
  57. ! `ex' boolean capability (the patches also add the `ms' capability.)
  58.   
  59.   If you wish to have banner printing, then you should add
  60. --- 15,26 ----
  61.   
  62.   This entry would be appropriate if you were using /dev/ttya and a baud
  63. ! rate of 38400.  Note that the `sf', `rw' and `sb' capabilities are
  64. ! essential.  You need to create the spool directory (/usr/spool/pslpd),
  65. ! the accounting file (/usr/adm/psacct), and the log file
  66. ! (/usr/adm/pslog).  The spool directory and the accounting file should
  67. ! be owned by daemon, the log file by root. You can use other names if
  68. ! you want.  The `ms' capabability is a Sun extension.  If you decide to
  69. ! make use of the patches in lpr.diff, you should also add the `ex'
  70. ! boolean capability (the patches also add the `ms' capability.)
  71.   
  72.   If you wish to have banner printing, then you should add
  73. ***************
  74. *** 27,31 ****
  75.   probably also wnat to modify the banner printing code in banner.ps.
  76.   As distributed, it provides a fairly minimalist banner page.  Note
  77. ! that psof requires the `sb' capability.
  78.   
  79.   You can add easily add other filters. For example, suppose you want to
  80. --- 28,35 ----
  81.   probably also wnat to modify the banner printing code in banner.ps.
  82.   As distributed, it provides a fairly minimalist banner page.  Note
  83. ! that psof requires the `sb' capability.  If your printer stacks face
  84. ! up and you're using the 4.3BSD (or later) lpd, then you can add an
  85. ! `hl' capability to specify that the banner page should be printed at
  86. ! the end of a job instead of at the beginning.
  87.   
  88.   You can add easily add other filters. For example, suppose you want to
  89. ***************
  90. *** 92,94 ****
  91.   again from (*).
  92.   
  93. ! $Id: INSTALL,v 1.7 1992/02/01 12:51:59 jjc Exp $
  94. --- 96,98 ----
  95.   again from (*).
  96.   
  97. ! $Id: INSTALL,v 1.9 1992/08/30 10:19:57 jjc Exp $
  98. *** lprps-2.3/TODO    Tue Sep 29 10:18:06 1992
  99. --- lprps-2.4/TODO    Tue Sep 29 10:15:49 1992
  100. ***************
  101. *** 4,5 ****
  102. --- 4,7 ----
  103.   
  104.   psif should either mail or syslog errors.
  105. + Option to psrev to force page reversal no matter what the %%PageOrder: is?
  106. *** lprps-2.3/Makefile    Tue Sep 29 10:18:06 1992
  107. --- lprps-2.4/Makefile    Tue Sep 29 10:15:47 1992
  108. ***************
  109. *** 1,3 ****
  110. ! # $Id: Makefile,v 1.14 1992/08/14 16:41:24 jjc Exp $
  111.   # Define A4 if you use A4 rather than letter size paper.
  112.   # Define IIg to enable a workaround for a bug in the serial
  113. --- 1,3 ----
  114. ! # $Id: Makefile,v 1.16 1992/09/29 09:13:30 jjc Exp $
  115.   # Define A4 if you use A4 rather than letter size paper.
  116.   # Define IIg to enable a workaround for a bug in the serial
  117. ***************
  118. *** 38,41 ****
  119. --- 38,45 ----
  120.   INSTALL_DATA=install -m 0444
  121.   
  122. + SHELL=/bin/sh
  123. + # Uncomment the next line for Ultrix.
  124. + #SHELL=/bin/sh5
  125.   SHAR=shar
  126.   DIST1=README INSTALL TODO Makefile textps.man psrev.man lprps.man psif.man \
  127. ***************
  128. *** 60,64 ****
  129.   all: psif-text psif-ps $(PROGS) textps.n psrev.n lprps.n psif.n psof.n
  130.   
  131. ! install: all
  132.       -test -d $(LIBDIR) || mkdir $(LIBDIR)
  133.       -test -d $(BINDIR) || mkdir $(BINDIR)
  134. --- 64,68 ----
  135.   all: psif-text psif-ps $(PROGS) textps.n psrev.n lprps.n psif.n psof.n
  136.   
  137. ! install: all banner.ps
  138.       -test -d $(LIBDIR) || mkdir $(LIBDIR)
  139.       -test -d $(BINDIR) || mkdir $(BINDIR)
  140. ***************
  141. *** 98,102 ****
  142.       @echo Creating $@
  143.       @-rm -f $@
  144. !     @echo "#! /bin/sh" > $@
  145.       @echo "$(TEXT_TO_PS) | $(REV_COMMAND) $(LIBDIR)/lprps \"\$$@\"" >>$@
  146.       @chmod +x $@
  147. --- 102,106 ----
  148.       @echo Creating $@
  149.       @-rm -f $@
  150. !     @echo "#! $(SHELL)" > $@
  151.       @echo "$(TEXT_TO_PS) | $(REV_COMMAND) $(LIBDIR)/lprps \"\$$@\"" >>$@
  152.       @chmod +x $@
  153. ***************
  154. *** 105,109 ****
  155.       @echo Creating $@
  156.       @-rm -f $@
  157. !     @echo "#! /bin/sh" > $@
  158.       @echo "$(REV_COMMAND) $(LIBDIR)/lprps \"\$$@\"" >>$@
  159.       @chmod +x $@
  160. --- 109,113 ----
  161.       @echo Creating $@
  162.       @-rm -f $@
  163. !     @echo "#! $(SHELL)" > $@
  164.       @echo "$(REV_COMMAND) $(LIBDIR)/lprps \"\$$@\"" >>$@
  165.       @chmod +x $@
  166. ***************
  167. *** 119,122 ****
  168. --- 123,139 ----
  169.       $(SHAR) -n2 -e2 $(DIST2) >$@
  170.   
  171. + tar-dist: $(DIST1) $(DIST2)
  172. +     dir=lprps-`sed -ne '1s/.*version \([0-9.]*[0-9]\).*/\1/p' README`; \
  173. +     rm -fr $$dir; \
  174. +     mkdir $$dir; \
  175. +     cd $$dir; \
  176. +     for f in $(DIST1) $(DIST2); do \
  177. +       ln -s ../$$f .; \
  178. +     done; \
  179. +     cd ..; \
  180. +     rm -f $$dir.tar.Z; \
  181. +     tar cfh - $$dir | compress >$$dir.tar.Z; \
  182. +     rm -fr $$dir
  183. +     
  184.   clean:
  185.       -rm -f $(PROGS) psif-text psif-ps *.n
  186. *** lprps-2.3/lprps.c    Tue Sep 29 10:18:24 1992
  187. --- lprps-2.4/lprps.c    Tue Sep 29 10:15:52 1992
  188. ***************
  189. *** 2,6 ****
  190.   
  191.   #ifndef lint
  192. ! static char rcsid[] = "$Id: lprps.c,v 1.16 1992/03/09 16:07:05 jjc Exp $";
  193.   #endif
  194.   
  195. --- 2,6 ----
  196.   
  197.   #ifndef lint
  198. ! static char rcsid[] = "$Id: lprps.c,v 1.19 1992/09/29 09:06:22 jjc Exp $";
  199.   #endif
  200.   
  201. ***************
  202. *** 18,21 ****
  203. --- 18,25 ----
  204.   #include <errno.h>
  205.   
  206. + #ifndef errno
  207. + extern int errno;
  208. + #endif
  209.   #define SENDMAIL "/usr/lib/sendmail"
  210.   
  211. ***************
  212. *** 27,30 ****
  213. --- 31,38 ----
  214.   #define IBSIZE 1024
  215.   
  216. + /* number of times to try to get the status from the printer at the
  217. + beginning of the job */
  218. + #define MAX_TRIES 16
  219.   char ctrl_d = '\004';
  220.   char ctrl_t = '\024';
  221. ***************
  222. *** 46,49 ****
  223. --- 54,59 ----
  224.   /* set to non-zero on timeout */
  225.   int timeout_flag = 0;
  226. + /* if non-zero exit on timeout */
  227. + int exit_on_timeout = 0;
  228.   /* descriptor of printer device */
  229.   int psfd = 1;
  230. ***************
  231. *** 82,89 ****
  232.     INVALID,
  233.     UNKNOWN,
  234.     IDLE,
  235.     BUSY,
  236.     WAITING,
  237. !   PRINTING
  238.     } status = INVALID;
  239.   
  240. --- 92,102 ----
  241.     INVALID,
  242.     UNKNOWN,
  243. +   WARMING_UP,
  244. +   INITIALIZING,
  245.     IDLE,
  246.     BUSY,
  247.     WAITING,
  248. !   PRINTING,
  249. !   PRINTER_ERROR,
  250.     } status = INVALID;
  251.   
  252. ***************
  253. *** 102,105 ****
  254. --- 115,121 ----
  255.   int message_buf_i;
  256.   
  257. + /* last printer error message */
  258. + char error_buf[128];
  259.   static char pagecount_string[] = "(%%[ pagecount: ) print \
  260.   statusdict begin pagecount end 20 string cvs print \
  261. ***************
  262. *** 113,116 ****
  263. --- 129,133 ----
  264.   void write_status_file();
  265.   void restore_status_file();
  266. + void handle_printer_error();
  267.   char *xmalloc();
  268.   char *strsignal();
  269. ***************
  270. *** 124,128 ****
  271.               printer_name ? printer_name : "printer");
  272.     sleep(60);        /* it will take at least this long to warm up */
  273. !   do_exit(EXIT_REPRINT);
  274.   }
  275.   
  276. --- 141,146 ----
  277.               printer_name ? printer_name : "printer");
  278.     sleep(60);        /* it will take at least this long to warm up */
  279. !   if (exit_on_timeout)
  280. !     do_exit(EXIT_REPRINT);
  281.   }
  282.   
  283. ***************
  284. *** 435,444 ****
  285.       printer_flushing();
  286.         else if (strcmp(key, "PrinterError") == 0) {
  287. !     syslog(LOG_ERR, "%s: %s",
  288. !            printer_name ? printer_name : "printer error",
  289. !            p);
  290. !     print_status_file("%s: %s",
  291. !               printer_name ? printer_name : "printer error",
  292. !               p);
  293.       want_status = 1;
  294.         }
  295. --- 453,457 ----
  296.       printer_flushing();
  297.         else if (strcmp(key, "PrinterError") == 0) {
  298. !     handle_printer_error(p);
  299.       want_status = 1;
  300.         }
  301. ***************
  302. *** 464,470 ****
  303.       else if (strcmp(p, "printing") == 0)
  304.         status = PRINTING;
  305. !     else
  306.         status = UNKNOWN;
  307.       switch (status) {
  308.       case BUSY:
  309.       case WAITING:
  310. --- 477,497 ----
  311.       else if (strcmp(p, "printing") == 0)
  312.         status = PRINTING;
  313. !     else if (strcmp(p, "warming up") == 0) {
  314. !       status = WARMING_UP;
  315. !       handle_printer_error(p);
  316. !     }
  317. !     else if (strcmp(p, "initializing") == 0)
  318. !       status = INITIALIZING;
  319. !     else if (strncmp(p, "PrinterError: ", sizeof("PrinterError: ") - 1)
  320. !          == 0) {
  321. !       status = PRINTER_ERROR;
  322. !       handle_printer_error(p + sizeof("PrinterError: ") - 1);
  323. !     }
  324. !     else {
  325. !       syslog(LOG_ERR, "unknown printer status `%s'", p);
  326.         status = UNKNOWN;
  327. +     }
  328.       switch (status) {
  329. +     case IDLE:
  330.       case BUSY:
  331.       case WAITING:
  332. ***************
  333. *** 471,474 ****
  334. --- 498,502 ----
  335.       case PRINTING:
  336.         restore_status_file();
  337. +       error_buf[0] = '\0';
  338.         break;
  339.       default:
  340. ***************
  341. *** 498,501 ****
  342. --- 526,543 ----
  343.   }
  344.   
  345. + void handle_printer_error(s)
  346. + char *s;
  347. + {
  348. +   if (strlen(s) + 1 > sizeof(error_buf)
  349. +       || strcmp(s, error_buf) == 0)
  350. +     return;
  351. +   strcpy(error_buf, s);
  352. +   syslog(LOG_ERR, "%s: %s",
  353. +      printer_name ? printer_name : "printer error",
  354. +      s);
  355. +   print_status_file("%s: %s",
  356. +             printer_name ? printer_name : "printer error",
  357. +             s);
  358. + }
  359.   
  360.   void process_input_char(c)
  361. ***************
  362. *** 582,587 ****
  363.     if (interrupt_flag)
  364.       handle_interrupt();
  365. !   if (timeout_flag)
  366.       handle_timeout();
  367.     while (select(psfd + 1, &rfds, &wfds, (fd_set *)NULL, (struct timeval *)NULL) 
  368.        < 0)
  369. --- 624,631 ----
  370.     if (interrupt_flag)
  371.       handle_interrupt();
  372. !   if (timeout_flag) {
  373.       handle_timeout();
  374. +     return;
  375. +   }
  376.     while (select(psfd + 1, &rfds, &wfds, (fd_set *)NULL, (struct timeval *)NULL) 
  377.        < 0)
  378. ***************
  379. *** 591,594 ****
  380. --- 635,639 ----
  381.         else if (interrupt_flag)
  382.       handle_interrupt();
  383. +       return;
  384.       }
  385.       else
  386. ***************
  387. *** 755,783 ****
  388.   void get_status()
  389.   {
  390. !   if (signal(SIGALRM, set_timeout_flag) == BADSIG)
  391. !     sys_error("signal");
  392. !   ioflush();
  393. !   (void)alarm(5);
  394. !   blocking_write(&ctrl_t, 1);
  395. !   in_job = 0;
  396. !   parse_state = NORMAL;
  397. !   ignore_input = 0;
  398. !   while (status == INVALID)
  399. !     process_some_input();
  400. !   switch (status) {
  401. !   case IDLE:
  402. !     break;
  403. !   case WAITING:
  404. !     blocking_write(&ctrl_d, 1);
  405. !     sleep(5);
  406. !     exit(EXIT_REPRINT);
  407. !   case BUSY:
  408. !   case PRINTING:
  409. !   case UNKNOWN:
  410. !     sleep(15);
  411. !     exit(EXIT_REPRINT);
  412.     }
  413. !   if (signal(SIGALRM, SIG_IGN) == BADSIG)
  414. !     sys_error("signal");
  415.   }
  416.   
  417. --- 800,844 ----
  418.   void get_status()
  419.   {
  420. !   int i;
  421. !   for (i = 0; i < MAX_TRIES; i++) {
  422. !     ioflush();
  423. !     if (signal(SIGALRM, set_timeout_flag) == BADSIG)
  424. !       sys_error("signal");
  425. !     (void)alarm(5);
  426. !     blocking_write(&ctrl_t, 1);
  427. !     in_job = 0;
  428. !     parse_state = NORMAL;
  429. !     ignore_input = 0;
  430. !     exit_on_timeout = 0;
  431. !     while (status == INVALID) {
  432. !       process_some_input();
  433. !       if (timeout_flag) {
  434. !     timeout_flag = 0;
  435. !     break;
  436. !       }
  437. !     }
  438. !     if (signal(SIGALRM, SIG_IGN) == BADSIG)
  439. !       sys_error("signal");
  440. !     switch (status) {
  441. !     case INVALID:
  442. !       /* we slept in handle_timeout(), so don't sleep here */
  443. !       break;
  444. !     case IDLE:
  445. !       return;
  446. !     case WAITING:
  447. !       blocking_write(&ctrl_d, 1);
  448. !       sleep(5);
  449. !       break;
  450. !     default:
  451. !       sleep(15);
  452. !       break;
  453. !     }
  454. !     status = INVALID;
  455.     }
  456. !   syslog(LOG_ERR, "%s%scouldn't make printer ready to receive job",
  457. !      printer_name ? printer_name : "",
  458. !      printer_name ? ": " : "");
  459. !   do_exit(EXIT_REPRINT);
  460.   }
  461.   
  462. ***************
  463. *** 974,977 ****
  464. --- 1035,1039 ----
  465.     read_status_file();
  466.     get_status();
  467. +   exit_on_timeout = 1;
  468.     get_start_pagecount();
  469.     send_file();
  470. *** lprps-2.3/psof.c    Tue Sep 29 10:18:24 1992
  471. --- lprps-2.4/psof.c    Tue Sep 29 10:15:53 1992
  472. ***************
  473. *** 1,6 ****
  474.   /* psof.c - lprps `of' filter for banner printing */
  475.   
  476. ! /* Assumes sb is set, sh is not set, and that there is also an if
  477. ! filter. */
  478.   
  479.   /* TODO: parse height and width command line arguments and pass them
  480. --- 1,6 ----
  481.   /* psof.c - lprps `of' filter for banner printing */
  482.   
  483. ! /* Assumes that the `sb' capability is present, that the `sh' capability
  484. ! is not present, and that there is an `if' filter. */
  485.   
  486.   /* TODO: parse height and width command line arguments and pass them
  487. ***************
  488. *** 8,12 ****
  489.   
  490.   #ifndef lint
  491. ! static char rcsid[] = "$Id: psof.c,v 1.1 1992/02/01 12:36:01 jjc Exp $";
  492.   #endif
  493.   
  494. --- 8,12 ----
  495.   
  496.   #ifndef lint
  497. ! static char rcsid[] = "$Id: psof.c,v 1.4 1992/08/30 10:23:27 jjc Exp $";
  498.   #endif
  499.   
  500. ***************
  501. *** 18,21 ****
  502. --- 18,25 ----
  503.   #include <ctype.h>
  504.   
  505. + #ifndef errno
  506. + extern int errno;
  507. + #endif
  508.   #ifndef LPRPS
  509.   #define LPRPS "/usr/local/lib/lprps"
  510. ***************
  511. *** 59,89 ****
  512.     else
  513.       prog = "psof";
  514.     openlog(prog, LOG_PID, LOG_LPR);
  515.     for (;;) {
  516.       int i = 0;
  517. !     int c = getchar();
  518. !     if (c == EOF)
  519. !       break;
  520. !     for (;;) {
  521. !       if (c == '\n')
  522. !     break;
  523. !       if (i >= LINE_MAX - 1 || c == '\0' || c == EOF || c == '\031')
  524.       error("bad banner line");
  525. !       buf[i++] = c;
  526.         c = getchar();
  527.       }
  528. !     buf[i++] = '\0';
  529. !     if (!parse_banner(buf))
  530. !       error("bad banner line");
  531. !     print_banner();
  532. !     c = getchar();
  533. !     if (c == EOF)
  534. !       break;
  535. !     if (c != '\031' || getchar() != '\001')
  536. !       error("more than one banner line");
  537.       if (kill(getpid(), SIGSTOP) < 0)
  538.         sys_error("kill");
  539.     }
  540. -   exit(0);
  541.     /*NOTREACHED*/
  542.   }
  543. --- 63,125 ----
  544.     else
  545.       prog = "psof";
  546.     openlog(prog, LOG_PID, LOG_LPR);
  547. +   /* lpd gets indigestion if the output filter exits unexpectedly,
  548. +      so we press on even when errors are encountered. */
  549.     for (;;) {
  550.       int i = 0;
  551. !     int c;
  552. !     int too_long_message = 0;
  553. !     int junk_message = 0;
  554. !     while ((c = getchar()) != EOF && c != '\n' && c != '\031') {
  555. !       if (c != '\f') {
  556. !     if (i >= LINE_MAX - 1) {
  557. !       if (!too_long_message) {
  558. !         error("banner line too long");
  559. !         too_long_message = 1;
  560. !       }
  561. !     }
  562. !     else
  563. !       buf[i++] = c;
  564. !       }
  565. !     }
  566. !     if (!too_long_message && i > 0) {
  567. !       buf[i] = '\0';
  568. !       if (parse_banner(buf))
  569. !     print_banner();
  570. !       else
  571.       error("bad banner line");
  572. !     }
  573. !     /* Skip till Control-Y Control-A sequence or end of file. */
  574. !     for (;;) {
  575. !       if (c == '\031') {
  576. !     c = getchar();
  577. !     if (c == '\001')
  578. !       break;
  579. !     if (c != EOF)
  580. !       ungetc(c, stdin);
  581. !     c = '\031';
  582. !       }
  583. !       if (c == EOF)
  584. !     exit(0);
  585. !       if (c != '\n' && c != '\f') {
  586. !     if (!junk_message) {
  587. !       if (i > 0)
  588. !         error("junk after banner line");
  589. !       else
  590. !         error("bad banner format (missing `sb' capability?)");
  591. !       junk_message = 1;
  592. !     }
  593. !       }
  594.         c = getchar();
  595.       }
  596.       if (kill(getpid(), SIGSTOP) < 0)
  597.         sys_error("kill");
  598.     }
  599.     /*NOTREACHED*/
  600.   }
  601. ***************
  602. *** 273,277 ****
  603.   {
  604.     syslog(LOG_ERR, "%s", s);
  605. -   exit(1);
  606.   }
  607.   
  608. --- 309,312 ----
  609. *** lprps-2.3/psrev.c    Tue Sep 29 10:18:23 1992
  610. --- lprps-2.4/psrev.c    Tue Sep 29 10:15:51 1992
  611. ***************
  612. *** 2,6 ****
  613.   
  614.   #ifndef lint
  615. ! static char rcsid[] = "$Id: psrev.c,v 1.3 1991/07/14 14:11:01 jjc Exp $";
  616.   #endif
  617.   
  618. --- 2,6 ----
  619.   
  620.   #ifndef lint
  621. ! static char rcsid[] = "$Id: psrev.c,v 1.4 1992/08/30 10:23:27 jjc Exp $";
  622.   #endif
  623.   
  624. ***************
  625. *** 10,13 ****
  626. --- 10,17 ----
  627.   #include <sys/stat.h>
  628.   #include <errno.h>
  629. + #ifndef errno
  630. + extern int errno;
  631. + #endif
  632.   
  633.   char *malloc();
  634. *** lprps-2.3/psof.man    Tue Sep 29 10:18:07 1992
  635. --- lprps-2.4/psof.man    Tue Sep 29 10:15:50 1992
  636. ***************
  637. *** 1,4 ****
  638.   .\" -*- nroff -*-
  639. ! .\" $Id: psof.man,v 1.1 1992/02/01 12:36:32 jjc Exp $
  640.   .TH PSOF @MAN8EXT@
  641.   .SH NAME
  642. --- 1,4 ----
  643.   .\" -*- nroff -*-
  644. ! .\" $Id: psof.man,v 1.2 1992/08/29 10:35:09 jjc Exp $
  645.   .TH PSOF @MAN8EXT@
  646.   .SH NAME
  647. ***************
  648. *** 34,37 ****
  649. --- 34,41 ----
  650.   .B sh
  651.   capability.
  652. + Include an
  653. + .B hl
  654. + capability to print the banner page at the end of a job rather
  655. + than at the beginning.
  656.   The
  657.   .B lpr
  658. ***************
  659. *** 61,67 ****
  660.   .B @BANNER@
  661.   \ \ PostScript code to print banner.
  662. - .SH BUGS
  663. - The banner page will be printed before the job even on printers
  664. - that stack face up.
  665.   .SH "SEE ALSO"
  666.   .BR printcap (5),
  667. --- 65,68 ----
  668.  
  669. exit 0 # Just in case...
  670.