home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 19 Printer / 19-Printer.zip / PRMON.ZIP / PRMON.C next >
Text File  |  1989-01-30  |  8KB  |  298 lines

  1. #define   LINT_ARGS
  2. #define   INCL_BASE
  3. #include <os2.h>
  4. #include <stdio.h>
  5. #include <process.h>
  6. #include <malloc.h>
  7. #define   STK_SIZE    1024
  8. #define   LAST        2
  9.  
  10. void main(int, char**, char**);
  11. int      parsarg(char*, char*, int*,
  12.                  char*, int*, int*);
  13. int      initcomm(int, char, int, int);
  14.  
  15.  static struct {
  16.         int length;
  17.         char data[158];
  18.         } ibuffer;
  19.  
  20.  static struct {
  21.         int length;
  22.         char data[158];
  23.         } obuffer;
  24.  
  25.  static struct {
  26.         unsigned char mflag;
  27.         unsigned char dflag;
  28.         unsigned int sysfilenum;
  29.         char wdata[128];
  30.         } wbuffer;
  31.  
  32. char *usage ="\nPrMon - usage is:\r\n"
  33. "\n\tprmon LPTx n [COMx:baudrate,parity,"
  34.                       "databits,stopbits]"
  35. "\n\twhere:"
  36. "\n\t\t LPTx     = printer to be filtered"
  37. "\n\t\t n        = number of records to drop from each print job"
  38. "\n\n\t Include serial parameters for optional COMx redirection:\n"
  39. "\n\t\t COMx     = COM1, COM2, or COM3"
  40. "\n\t\t baudrate = 300,1200,2400,"
  41.                   "4800,9600, or 19200"
  42. "\n\t\t parity   = N,O,E,M, or S"
  43. "\n\t\t databits = 5,6,7, or 8"
  44. "\n\t\t stopbits = 1 or 2\r\n";
  45.  
  46.  KBDKEYINFO keyinfo;
  47.  HMONITOR ddhand;
  48.  HFILE  com;
  49.  unsigned short bytcount, act, written;
  50.  unsigned int rc, mid, dropcount, serial;
  51.  int baud, dbits, sbits;
  52.  char parity, comport[8];
  53.  
  54. void main(argc, argv, envp)
  55. int argc;
  56. char **argv;
  57. char **envp;
  58. {
  59.  int records_since_open = 0;
  60.  
  61.  puts("JFG Printer Device Monitor v0.4");
  62.  
  63.  if (argc < 3 || argc > 4)
  64.     {
  65.      puts(usage);
  66.      exit(1);
  67.     }
  68.  
  69.  if (argc == 4)
  70.      {
  71.      if (parsarg(argv[3],comport,&baud,
  72.                  &parity,&dbits,&sbits))
  73.         {
  74.          puts(usage);
  75.          exit(1);
  76.         }
  77.  
  78.      /* Open com device driver: */
  79.      if (DosOpen(comport,&com,&act,
  80.                  0L,0,0x01,0x0012,0L))
  81.          {
  82.          fprintf(stderr,"\nError opening port");
  83.          exit(1);
  84.          }
  85.  
  86.      /* Initialize com device driver: */
  87.      if (initcomm(baud, parity, dbits, sbits))
  88.         {
  89.         fprintf(stderr,"\nPort setup error");
  90.         exit(1);
  91.         }
  92.      serial = TRUE;
  93.      }
  94.  else serial = FALSE;
  95.  
  96.  rc = DosMonOpen(argv[1], &ddhand);
  97.  if (rc) printf("DosMonOpen returned code: %i", rc);
  98.  
  99.  dropcount = atoi(argv[2]);
  100.  printf("This monitor will drop the first %i records of each print job.\r\n",
  101.          dropcount);
  102.  
  103.  ibuffer.length = obuffer.length = 160;
  104.  
  105.  rc = DosMonReg(ddhand, (PBYTE) &ibuffer, (PBYTE) &obuffer, LAST, 1);
  106.  if (rc) printf("DosMonReg returned code: %i", rc);
  107.  
  108.  while (-1)   /* Do forever: */
  109.  {
  110.     bytcount = 132;
  111.     rc = DosMonRead( (PBYTE) &ibuffer, 0, (PBYTE) &wbuffer, &bytcount);
  112.     if (rc) printf("DosMonRead returned code: %i", rc);
  113.  
  114.     if (wbuffer.mflag & 0x03)
  115.        {
  116.        records_since_open = 0;
  117.        continue;
  118.        }
  119.  
  120.     if (wbuffer.mflag & 0x04)
  121.        {
  122.        rc = DosMonWrite( (PBYTE) &obuffer, (PBYTE) &wbuffer, bytcount);
  123.        if (rc) printf("DosMonWrite returned code: %i", rc);
  124.        continue;
  125.        }
  126.  
  127.     if (++records_since_open <= dropcount)
  128.        {
  129.        continue;
  130.        }
  131.  
  132.     if (serial)
  133.        {
  134.        rc = DosWrite(com,wbuffer.wdata,bytcount-4,&written);
  135.        if (rc) printf("DosWrite returned code: %i", rc);
  136.        }
  137.     else
  138.        {
  139.        rc = DosMonWrite( (PBYTE) &obuffer, (PBYTE) &wbuffer, bytcount);
  140.        if (rc) printf("DosMonWrite returned code: %i", rc);
  141.        }
  142.  
  143.  }
  144.  
  145.  if (serial) DosClose(com);
  146.  DosMonClose(ddhand);
  147.  
  148.  DosExit(0,0);
  149. }
  150.  
  151. typedef struct _COMDEVICECTRL {
  152.       unsigned int wtime;
  153.       unsigned int rtime;
  154.       unsigned char flags1;
  155.       unsigned char flags2;
  156.       unsigned char flags3;
  157.       unsigned char errchar;
  158.       unsigned char brkchar;
  159.       unsigned char xonchar;
  160.       unsigned char xoffchar;
  161.       } COMDEVICECTRL;
  162.  
  163. typedef struct _COMLINECHAR {
  164.       unsigned char databits;
  165.       unsigned char parity;
  166.       unsigned char stopbits;
  167.       } COMLINECHAR;
  168.  
  169. typedef struct _COMMODEMCTRL{
  170.       unsigned char onmask;
  171.       unsigned char offmask;
  172.       } COMMODEMCTRL;
  173.  
  174.  
  175. int initcomm(baud,parity,dbits,sbits)
  176. char parity;
  177. int baud,dbits,sbits;
  178.    /* this routine used by main thread */
  179. {
  180. static COMLINECHAR linechar;
  181.  
  182. static COMMODEMCTRL modemctrl;
  183.  
  184. static COMDEVICECTRL dcb;
  185.  
  186. int comerr,act;
  187.  
  188.  /* Set bitrate: */
  189.  if (DosDevIOCtl(NULL,(char *)&baud,
  190.                      0x41,01,com))
  191.      {
  192.      fprintf(stderr,"\nBitrate error");
  193.      return(1);
  194.      }
  195.  
  196.  /* Set databits, stopbits, parity: */
  197.  if (parity == 'N') linechar.parity = 0;
  198.  if (parity == 'O') linechar.parity = 1;
  199.  if (parity == 'E') linechar.parity = 2;
  200.  if (parity == 'M') linechar.parity = 3;
  201.  if (parity == 'S') linechar.parity = 4;
  202.  if (sbits == 2) linechar.stopbits = 2;
  203.  if (sbits == 1) linechar.stopbits = 0;
  204.  linechar.databits = dbits;
  205.  if (DosDevIOCtl(NULL,(char *)&linechar,
  206.                      0x42,01,com))
  207.      {
  208.      puts("Line characteristics error");
  209.      return(1);
  210.      }
  211.  
  212.  /* Set modem control signals: */
  213.  modemctrl.onmask = 0x03;  /* DTR & RTS on */
  214.  modemctrl.offmask = 0xff; /* nothing off */
  215.  if (DosDevIOCtl((char *)&comerr,
  216.        (char *)&modemctrl,0x46,01,com))
  217.      {
  218.      puts("Modem control error");
  219.      return(1);
  220.      }
  221.  
  222.  /* Set com device processing parameters:  */
  223.  dcb.wtime = 100; /* 1sec transmit timeout */
  224.  dcb.rtime = 100; /* 1sec receive  timeout */
  225.  dcb.flags1 = 0x19;  /* enable DTR, hardware handshake */
  226.  dcb.flags2 = 0x40;  /* enable RTS, disable XON/XOFF  */
  227.  dcb.flags3 = 0x05;  /* recv timeout mode, infinite retry */
  228.  dcb.errchar = 0x00; /* no error translate */
  229.  dcb.brkchar = 0x00; /* no break translate */
  230.  dcb.xonchar = 0x11;  /* standard XON  */
  231.  dcb.xoffchar = 0x13; /* standard XOFF */
  232.  if (DosDevIOCtl(NULL,(char *)&dcb,
  233.                        0x53,01,com))
  234.      {
  235.      puts("Device control block error");
  236.      return(1);
  237.      }
  238.  
  239.  return(0);
  240. }
  241.  
  242. int parsarg(arg,port,baud,parity,dbits,sbits)
  243. char *arg,*port;
  244. char *parity;
  245. int *baud,*dbits,*sbits;
  246.     /* this routine used by main thread */
  247. {
  248.   register unsigned int strptr;
  249.   char strhold[8];
  250.   strupr(arg);   /* cvt to uppercase */
  251.  
  252.   /* Parse cmdline for COM port: */
  253.   if ((strptr=strcspn(arg,":")) == 0)
  254.                                   return(1);
  255.   if (strptr > 8) return(1);
  256.   strncpy(port,arg,strptr);
  257.   *(port+strptr) = '\0';
  258.   arg = arg+strptr+1;
  259.  
  260.   /* Parse for cmdline baudrate: */
  261.   if ((strptr=strcspn(arg,",")) == 0)
  262.                                   return(2);
  263.   strncpy(strhold,arg,strptr);
  264.   *(strhold+strptr) = '\0';
  265.   *baud = atoi(strhold);
  266.   if (*baud != 300 &&  *baud != 1200 &&
  267.       *baud != 2400 && *baud != 4800 &&
  268.       *baud != 9600 && *baud != 19200)
  269.                                   return(2);
  270.   arg = arg+strptr+1;
  271.  
  272.   /* Parse cmdline for parity: */
  273.   if ((strptr = strcspn(arg,",")) == 0)
  274.                                   return(3);
  275.   *parity = *(arg+strptr-1);
  276.   if (*parity != 'N' && *parity != 'O' &&
  277.       *parity != 'E' && *parity != 'M' &&
  278.       *parity != 'S')             return(3);
  279.   arg = arg+strptr+1;
  280.  
  281.   /* Parse cmdline for databits: */
  282.   if ((strptr = strcspn(arg,",")) == 0)
  283.                                   return(4);
  284.   *dbits = *(arg+strptr-1) - '0';
  285.   if (*dbits != 5 &&   *dbits != 6 &&
  286.       *dbits != 7 &&   *dbits != 8)
  287.       return(4);
  288.   arg = arg+strptr+1;
  289.  
  290.   /* Parse for stopbit value: */
  291.   if ((strptr = strcspn(arg,",")) == 0)
  292.                                   return(5);
  293.   *sbits = *(arg+strptr-1) - '0';
  294.   if (*sbits != 1 && *sbits != 2) return(5);
  295.  
  296.   return(0);
  297. }
  298.