home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / mint / mntutl95.lzh / MNTUTL95 / LPD.C < prev    next >
C/C++ Source or Header  |  1993-08-03  |  4KB  |  183 lines

  1. /* a simple line printer daemon
  2.  * This code is provided "as is", for informational purposes only.
  3.  * No guarantee of correctness is made by either Eric R. Smith
  4.  * or Atari Corp.
  5.  */
  6.  
  7. #include <osbind.h>
  8. #ifdef __GNUC__
  9. #include <minimal.h>
  10. #endif
  11. #include "mintbind.h"
  12.  
  13. #define PRINTERFILE "U:\\DEV\\PRN"
  14. #define MSGQUEUE "U:\\PIPE\\LPD.MSG"
  15. #define MSGSIZ    128
  16. char msgbuf[MSGSIZ];
  17.  
  18. #define BUFSIZ 2048
  19.  
  20. int msgfd;    /* requests to print files come here */
  21. int printerfd;
  22.  
  23. /* make a copy of a file. the name of the copy is kept in local
  24.  * storage, and must be of the form XXXXXXXX.LPR. Moreover, it had
  25.  * better be unique.
  26.  * The string "from" is overwritten with an error message if an error
  27.  * occurs, otherwise from[0] is set to 0.
  28.  */
  29.  
  30. void
  31. copy_file(from)
  32.     char *from;
  33. {
  34.     static char buf[BUFSIZ];
  35.     static char topat[] = "AAAAAAA.LPR";
  36.     char *to;
  37.     int  infd, outfd;
  38.     long r;
  39.  
  40.     if ((infd = Fopen(from, 0)) < 0) {
  41.         strcpy(from, "File couldn't be opened for input.");
  42.         return;
  43.     }
  44.     for(;;) {
  45.         to = topat;
  46.         while (*to == 'Z')
  47.             *to++ = 'A';
  48.         if (*to != '.')
  49.             *to += 1;
  50.         outfd = Fopen(topat, 1);
  51.         if (outfd < 0) break;
  52.         Fclose(outfd);
  53.     }
  54.  
  55.     outfd = Fcreate(topat, 0);
  56.     
  57.     if (outfd < 0) {
  58.         Fclose(infd);
  59.         strcpy(from, "Error creating spool file.");
  60.         return;
  61.     }
  62.     while ((r = Fread(infd, (long)BUFSIZ, buf)) > 0) {
  63.         if (r != Fwrite(outfd, r, buf)) {
  64.             strcpy(from, "Write error on spool file (disk full?)");
  65.             break;
  66.         }
  67.     }
  68.  
  69.     Fclose(infd);
  70.     Fclose(outfd);
  71.  
  72.     if (r == 0)
  73.         from[0] = 0;
  74. }
  75.  
  76. /*
  77.  * get a file name to be printed, and queue it. The queueing is done
  78.  * simply by making a copy of the file (see copyfile(), above) in the
  79.  * current directory.
  80.  */
  81.  
  82. void
  83. get_request()
  84. {
  85.     Fread(msgfd, (long)MSGSIZ, msgbuf); /* read the request */
  86.  
  87. /* NOTE: on error, copy_file puts an error message in msgbuf */
  88.     copy_file(msgbuf);
  89.     Fwrite(msgfd, (long)MSGSIZ, msgbuf); /* reply to the request */
  90. }
  91.  
  92. /*
  93.  * print a file. periodically checks for incoming requests to print,
  94.  * and calls get_request if there are any.
  95.  */
  96.  
  97. void
  98. print_file(name)
  99.     char *name;
  100. {
  101.     int fd;
  102.     long r;
  103.     static char inbuf[80];
  104.  
  105.     fd = Fopen(name, 0);
  106.     if (fd < 0) {
  107.         Cconws("lpd: couldn't open a file???\r\n");
  108.         return;
  109.     }
  110.     for(;;) {
  111.         r = Fread(fd, 80L, inbuf);
  112.         if (r <= 0)
  113.             break;
  114.         Fwrite(printerfd, r, inbuf);
  115.     /* check for incoming messages */
  116.         if (Finstat(msgfd))
  117.             get_request();
  118.     }
  119.     Fclose(fd);
  120.     Fdelete(name);
  121. }
  122.  
  123. int
  124. main(argc, argv)
  125.     int argc;
  126.     char **argv;
  127. {
  128.     extern char *getenv();
  129.     char *tmpdir;
  130.     long r;
  131.     struct _dta p;
  132.     char printfile[80];
  133.  
  134. /* if a TEMP environment variable exists, use that
  135.  * as our working directory for creating the spool
  136.  * files
  137.  */
  138.     if ((tmpdir = getenv("TEMP"))) {
  139.         if (tmpdir[0] && tmpdir[1] == ':') {
  140.             Dsetdrv(toupper(tmpdir[0])-'A');
  141.             if (tmpdir[2])
  142.                 Dsetpath(tmpdir);
  143.             else
  144.                 Dsetpath("\\");
  145.         } else
  146.             Dsetpath(tmpdir);
  147.     }
  148.     msgfd = Fcreate(MSGQUEUE, 0);
  149.     if (msgfd == -36) {    /* access denied? */
  150.         Cconws("lpd: a printer daemon already exists\r\n");
  151.         Pterm0();
  152.     }
  153.     else if (msgfd < 0) {
  154.         Cconws("lpd: unable to create message queue\r\n");
  155.         Pterm(1);
  156.     }
  157.  
  158.     if (argv[1])
  159.         strcpy(printfile, argv[1]);
  160.     else
  161.         strcpy(printfile, PRINTERFILE);
  162.  
  163.     printerfd = Fcreate(printfile, 0);
  164.     if (printerfd < 0) {
  165.         Cconws("lpd: unable to open printer\r\n");
  166.         Pterm(1);
  167.     }
  168.  
  169.     Fsetdta(&p);
  170.  
  171. /* now just loop, printing .LPR files and servicing
  172.  * requests
  173.  */
  174.     for(;;) {
  175.         r = Fsfirst("*.LPR", 0);
  176.         while (r >= 0) {
  177.             print_file(p.dta_name);
  178.             r = Fsnext();
  179.         }
  180.         get_request();    /* get outstanding requests */
  181.     }
  182. }
  183.