gn@yamnet.UUCP (The Remittance Man @ Delphi Information Sys.) (03/17/89)
I'm currently having a hell of a problem, when opening the system printer I always get a FID back, no failure, no matter what state printer is in. I could ship the printer to North Dakota and *STILL* get a file identifier. Try the following program, --- #include <fcntl.h> main() { printf("%d\n",open("/dev/lp0",O_WRONLY)); } and as mentioned, ship your printer to North Dakota.... you should get a positive value, if you don't please talk to me. The open always returns successfully. Further Problems..... So, how about the following write's? Well they hang, never to return. --- #include <fcntl.h> char *test_buf="xxxxxxxxxxxxxxx"; main() { int printer_fid; printer_fid=open("/dev/lp0",O_WRONLY); printf("%d\n",write(printer_fid,test_buf,strlen(test_buf))); } This will hang forever......or until the printer is put back on line. Some of you I'm sure are saying, well sure it will hang, you haven't set O_NDELAY. Ok, try it....NO DIFFERENCE, the printer will still hang. Ok, Ok, you shrug, how about the ioctl flags from <sys/lprio.h>? Certainly that will allow fuller control. First let us set LPRALLERR flag (documented in v2.5 (5-112,2.2) as ALLERR (Liars!)), this flag changes the default from "Wait Until Error Correction", to "Report All Errors". --- #include <fcntl.h> #include <sys/lprio.h> char *test_buf="xxxxxxxxxxxxxxxxxxxxxxx"; int main() { int printer_fid, bytes_written; struct oprmode printer_mode; /* See the Arcane sys/lprio.h */ printer_fid=open("/dev/lp0",O_WRONLY); /* Write Only */ printer_mode.flags=LPRALLERR ; /* ALL ERROR Flag */ if(ioctl(printer_fid,LPRSMOD,&printer_mode)==-1) { printf("Ioctl failed...."); exit(); } bytes_written=write(printer_fid,test_buf,strlen(test_buf)); printf("The Write Returns: %d\n",bytes_written); } Upon running this the write will block until the printer is put back on-line, whereupon you get the message SIGNAL 27. So lets bring in an even bigger hammer, the signal handler to ignore SIGIOINT. and add a close to round out the picture. -- 26a printf("The Close Returns: %d\n",close(printer_fid)); . 15a signal(SIGIOINT,SIG_IGN); /* Ignore, don't exit on IOINT */ . 2a #include <sys/signal.h> . Any guesses as to what happens? The output is "The Write Returns: -1", and the program blocks on the close (flushing the buffer?!?), until the printer is put back on line. I have tried everything, including dividing by zero, to try to get the program to exit...all to no avail. Funny thing is that piobe is able to determine the state of the printer on what appears to be the open. How? What can be done to get the open to fail? Do I need to run 'splp +err' on nights of a full moon? Set kpoe in /etc/ddi/opprinter to 'maybe' ? What's the deal? I have the printer configured as an 'opp', and have tryed this on two different RT 6150s with no luck. Any help would be greatly appreciated.... (If by the way you want to here an the equally horrible saga of the single bay portafile 6156, just let me know ) -- Greg Noel [Gn] Delphi Information Systems, Westlake Vlg, Ca. The food is bad, and the portions are small. -W Allen