123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /*
- *
- * Stuff that slows the transmission of jobs to PostScript printers. ONLY use it
- * if you appear to be having trouble with flow control. The idea is simple - only
- * send a significant amount of data when we're certain the printer is in the
- * WAITING state. Depends on receiving status messages and only works when the
- * program is run as a single process. What's done should stop printer generated
- * XOFFs - provided our input buffer (ie. blocksize) is sufficiently small. Was
- * originally included in the postio.tmp directory, but can now be requested with
- * the -S option. Considered eliminating this code, but some printers still depend
- * on it. In particular Datakit connections made using Datakit PVCs and DACUs seem
- * to have the most problems. Much of the new stuff that was added can't work when
- * you use this code and will be automatically disabled.
- *
- */
- #include <stdio.h>
- #include "gen.h"
- #include "postio.h"
- extern char *block;
- extern int blocksize;
- extern int head;
- extern int tail;
- extern char *line;
- extern char mesg[];
- extern int ttyo;
- /*****************************************************************************/
- slowsend(fd_in)
- int fd_in; /* next input file */
- {
- /*
- *
- * A slow version of send() that's very careful about when data is sent to the
- * printer. Should help prevent overflowing the printer's input buffer, provided
- * blocksize is sufficiently small (1024 should be safe). It's a totally kludged
- * up routine that should ONLY be used if you have constant transmission problems.
- * There's really no way it will be able to drive a printer much faster that about
- * six pages a minute, even for the simplest jobs. Get it by using the -S option.
- *
- */
- while ( readblock(fd_in) )
- switch ( getstatus(0) ) {
- case WAITING:
- writeblock(blocksize);
- break;
- case BUSY:
- case IDLE:
- case PRINTING:
- writeblock(30);
- break;
- case NOSTATUS:
- case UNKNOWN:
- break;
- case PRINTERERROR:
- sleep(30);
- break;
- case ERROR:
- fprintf(stderr, "%s", mesg); /* for csw */
- error(FATAL, "PostScript Error");
- break;
- case FLUSHING:
- error(FATAL, "Flushing Job");
- break;
- case DISCONNECT:
- error(FATAL, "Disconnected - printer may be offline");
- break;
- default:
- sleep(2);
- break;
- } /* End switch */
- } /* End of send */
- /*****************************************************************************/
- static writeblock(num)
- int num; /* most bytes we'll write */
- {
- int count; /* bytes successfully written */
- /*
- *
- * Called from send() when it's OK to send the next block to the printer. head
- * is adjusted after the write, and the number of bytes that were successfully
- * written is returned to the caller.
- *
- */
- if ( num > tail - head )
- num = tail - head;
- if ( (count = write(ttyo, &block[head], num)) == -1 )
- error(FATAL, "error writing to %s", line);
- else if ( count == 0 )
- error(FATAL, "printer appears to be offline");
- head += count;
- return(count);
- } /* End of writeblock */
- /*****************************************************************************/
|