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

  1. /*
  2.  * a print program; this one interfaces with the line printer
  3.  * daemon in lpd.c. All we do is send a request to lpd's port
  4.  * identifying the file we want printed. lpd sends back either
  5.  * a null string (everything's OK) or an error message.
  6.  * The only tricky part about the whole process is that we
  7.  * lock the port once we've opened it, so as to be sure
  8.  * that we don't interleave messages and read the error
  9.  * return intended for some other instantiation of lpr
  10.  *
  11.  * This code is provided as a sample only. No guarantee is made of
  12.  * its correctness by either Eric R. Smith or Atari Corp.
  13.  */
  14.  
  15. #include <osbind.h>
  16. #ifdef __GNUC__
  17. #include <minimal.h>
  18. #endif
  19. #include "mintbind.h"
  20.  
  21. #define F_SETLK    6
  22. struct flock {
  23.     short l_type;
  24. #define F_RDLCK        0
  25. #define F_WRLCK        1
  26. #define F_UNLCK        3
  27.     short l_whence;
  28.     long l_start;
  29.     long l_len;
  30.     short l_pid;
  31. } mylock;
  32.  
  33. #define MSGQUEUE "U:\\PIPE\\LPD.MSG"
  34. #define MSGSIZ    128
  35. char msgbuf[MSGSIZ];
  36. int msgfd;
  37.  
  38. /*
  39.  * return the full pathname of the file "foo"
  40.  */
  41.  
  42. char *
  43. fullpath(foo)
  44.     char *foo;
  45. {
  46.     static char ans[128];
  47.     char *s;
  48.  
  49.     s = ans;
  50.     if (*foo && foo[1] == ':')    /* already a full path? */
  51.         return foo;
  52.  
  53.     *s++ = Dgetdrv()+'A';        /* put in the drive letter */
  54.     *s++ = ':';
  55.     if (*foo == '\\') {
  56.         strcpy(s, foo);
  57.         return ans;
  58.     }
  59.     *s = 0;
  60.     Dgetpath(s, 0);            /* put in the current directory */
  61.     strcat(s, "\\");        /* plus a path seperator */
  62.     strcat(s, foo);            /* and the file name */
  63.     return ans;
  64. }
  65.  
  66. main(argc, argv)
  67.     int argc;
  68.     char **argv;
  69. {
  70.     long r;
  71.  
  72.     if (argc != 2) {
  73.         Cconws("Usage: lpr file\r\n");
  74.         Pterm(2);
  75.     }
  76.  
  77.     msgfd = Fopen(MSGQUEUE, 2);    /* read/write access needed */
  78.     if (msgfd < 0) {
  79.         Cconws("lpr: couldn't open lpd's message queue\r\n");
  80.         Pterm(1);
  81.     }
  82.  
  83. /*
  84.  * acquire a lock on the message queue
  85.  */
  86.     mylock.l_type = F_WRLCK;
  87.     mylock.l_whence = 0;
  88.     mylock.l_start = 0;
  89.     mylock.l_len = 0;
  90.  
  91.     do {
  92.         r = Fcntl(msgfd, &mylock, F_SETLK);
  93.  
  94. /* old versions of MiNT return -36 (EACCDN) for lock failures.
  95.  * newer versions of MiNT (and MultiTOS) return -58 (ELOCKED)
  96.  */
  97.         if (r == -36 || r == -58) {
  98.             Cconws("lpr: waiting to acquire lock...\r\n");
  99.             Syield();
  100.             Syield();
  101.         } else if (r < 0) {
  102.             Cconws("lpr: fcntl failed??\r\n");
  103.             Pterm(3);
  104.         }
  105.     } while (r < 0);
  106.  
  107. /*
  108.  * queue the file to be printed
  109.  */
  110.     strcpy(msgbuf, fullpath(argv[1]));
  111.  
  112. /* write the request */
  113.     Fwrite(msgfd, (long)MSGSIZ, msgbuf);
  114.  
  115. /* read the server's reply */
  116.     Fread(msgfd, (long)MSGSIZ, msgbuf);
  117.  
  118. /*
  119.  * Normally, we should release the lock on msgfs. However, we're going
  120.  * to exit now, and the kernel will release the lock for us.
  121.  */
  122.  
  123. /* check for errors from the server */
  124.  
  125.     if (msgbuf[0]) {
  126.         Cconws("lpd said: ");
  127.         Cconws(msgbuf);
  128.         Cconws("\r\n");
  129.         Pterm(1);
  130.     }
  131.  
  132.     Pterm0();
  133. }
  134.