home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 19 Printer
/
19-Printer.zip
/
PRMON.ZIP
/
PRMON.C
next >
Wrap
Text File
|
1989-01-30
|
8KB
|
298 lines
#define LINT_ARGS
#define INCL_BASE
#include <os2.h>
#include <stdio.h>
#include <process.h>
#include <malloc.h>
#define STK_SIZE 1024
#define LAST 2
void main(int, char**, char**);
int parsarg(char*, char*, int*,
char*, int*, int*);
int initcomm(int, char, int, int);
static struct {
int length;
char data[158];
} ibuffer;
static struct {
int length;
char data[158];
} obuffer;
static struct {
unsigned char mflag;
unsigned char dflag;
unsigned int sysfilenum;
char wdata[128];
} wbuffer;
char *usage ="\nPrMon - usage is:\r\n"
"\n\tprmon LPTx n [COMx:baudrate,parity,"
"databits,stopbits]"
"\n\twhere:"
"\n\t\t LPTx = printer to be filtered"
"\n\t\t n = number of records to drop from each print job"
"\n\n\t Include serial parameters for optional COMx redirection:\n"
"\n\t\t COMx = COM1, COM2, or COM3"
"\n\t\t baudrate = 300,1200,2400,"
"4800,9600, or 19200"
"\n\t\t parity = N,O,E,M, or S"
"\n\t\t databits = 5,6,7, or 8"
"\n\t\t stopbits = 1 or 2\r\n";
KBDKEYINFO keyinfo;
HMONITOR ddhand;
HFILE com;
unsigned short bytcount, act, written;
unsigned int rc, mid, dropcount, serial;
int baud, dbits, sbits;
char parity, comport[8];
void main(argc, argv, envp)
int argc;
char **argv;
char **envp;
{
int records_since_open = 0;
puts("JFG Printer Device Monitor v0.4");
if (argc < 3 || argc > 4)
{
puts(usage);
exit(1);
}
if (argc == 4)
{
if (parsarg(argv[3],comport,&baud,
&parity,&dbits,&sbits))
{
puts(usage);
exit(1);
}
/* Open com device driver: */
if (DosOpen(comport,&com,&act,
0L,0,0x01,0x0012,0L))
{
fprintf(stderr,"\nError opening port");
exit(1);
}
/* Initialize com device driver: */
if (initcomm(baud, parity, dbits, sbits))
{
fprintf(stderr,"\nPort setup error");
exit(1);
}
serial = TRUE;
}
else serial = FALSE;
rc = DosMonOpen(argv[1], &ddhand);
if (rc) printf("DosMonOpen returned code: %i", rc);
dropcount = atoi(argv[2]);
printf("This monitor will drop the first %i records of each print job.\r\n",
dropcount);
ibuffer.length = obuffer.length = 160;
rc = DosMonReg(ddhand, (PBYTE) &ibuffer, (PBYTE) &obuffer, LAST, 1);
if (rc) printf("DosMonReg returned code: %i", rc);
while (-1) /* Do forever: */
{
bytcount = 132;
rc = DosMonRead( (PBYTE) &ibuffer, 0, (PBYTE) &wbuffer, &bytcount);
if (rc) printf("DosMonRead returned code: %i", rc);
if (wbuffer.mflag & 0x03)
{
records_since_open = 0;
continue;
}
if (wbuffer.mflag & 0x04)
{
rc = DosMonWrite( (PBYTE) &obuffer, (PBYTE) &wbuffer, bytcount);
if (rc) printf("DosMonWrite returned code: %i", rc);
continue;
}
if (++records_since_open <= dropcount)
{
continue;
}
if (serial)
{
rc = DosWrite(com,wbuffer.wdata,bytcount-4,&written);
if (rc) printf("DosWrite returned code: %i", rc);
}
else
{
rc = DosMonWrite( (PBYTE) &obuffer, (PBYTE) &wbuffer, bytcount);
if (rc) printf("DosMonWrite returned code: %i", rc);
}
}
if (serial) DosClose(com);
DosMonClose(ddhand);
DosExit(0,0);
}
typedef struct _COMDEVICECTRL {
unsigned int wtime;
unsigned int rtime;
unsigned char flags1;
unsigned char flags2;
unsigned char flags3;
unsigned char errchar;
unsigned char brkchar;
unsigned char xonchar;
unsigned char xoffchar;
} COMDEVICECTRL;
typedef struct _COMLINECHAR {
unsigned char databits;
unsigned char parity;
unsigned char stopbits;
} COMLINECHAR;
typedef struct _COMMODEMCTRL{
unsigned char onmask;
unsigned char offmask;
} COMMODEMCTRL;
int initcomm(baud,parity,dbits,sbits)
char parity;
int baud,dbits,sbits;
/* this routine used by main thread */
{
static COMLINECHAR linechar;
static COMMODEMCTRL modemctrl;
static COMDEVICECTRL dcb;
int comerr,act;
/* Set bitrate: */
if (DosDevIOCtl(NULL,(char *)&baud,
0x41,01,com))
{
fprintf(stderr,"\nBitrate error");
return(1);
}
/* Set databits, stopbits, parity: */
if (parity == 'N') linechar.parity = 0;
if (parity == 'O') linechar.parity = 1;
if (parity == 'E') linechar.parity = 2;
if (parity == 'M') linechar.parity = 3;
if (parity == 'S') linechar.parity = 4;
if (sbits == 2) linechar.stopbits = 2;
if (sbits == 1) linechar.stopbits = 0;
linechar.databits = dbits;
if (DosDevIOCtl(NULL,(char *)&linechar,
0x42,01,com))
{
puts("Line characteristics error");
return(1);
}
/* Set modem control signals: */
modemctrl.onmask = 0x03; /* DTR & RTS on */
modemctrl.offmask = 0xff; /* nothing off */
if (DosDevIOCtl((char *)&comerr,
(char *)&modemctrl,0x46,01,com))
{
puts("Modem control error");
return(1);
}
/* Set com device processing parameters: */
dcb.wtime = 100; /* 1sec transmit timeout */
dcb.rtime = 100; /* 1sec receive timeout */
dcb.flags1 = 0x19; /* enable DTR, hardware handshake */
dcb.flags2 = 0x40; /* enable RTS, disable XON/XOFF */
dcb.flags3 = 0x05; /* recv timeout mode, infinite retry */
dcb.errchar = 0x00; /* no error translate */
dcb.brkchar = 0x00; /* no break translate */
dcb.xonchar = 0x11; /* standard XON */
dcb.xoffchar = 0x13; /* standard XOFF */
if (DosDevIOCtl(NULL,(char *)&dcb,
0x53,01,com))
{
puts("Device control block error");
return(1);
}
return(0);
}
int parsarg(arg,port,baud,parity,dbits,sbits)
char *arg,*port;
char *parity;
int *baud,*dbits,*sbits;
/* this routine used by main thread */
{
register unsigned int strptr;
char strhold[8];
strupr(arg); /* cvt to uppercase */
/* Parse cmdline for COM port: */
if ((strptr=strcspn(arg,":")) == 0)
return(1);
if (strptr > 8) return(1);
strncpy(port,arg,strptr);
*(port+strptr) = '\0';
arg = arg+strptr+1;
/* Parse for cmdline baudrate: */
if ((strptr=strcspn(arg,",")) == 0)
return(2);
strncpy(strhold,arg,strptr);
*(strhold+strptr) = '\0';
*baud = atoi(strhold);
if (*baud != 300 && *baud != 1200 &&
*baud != 2400 && *baud != 4800 &&
*baud != 9600 && *baud != 19200)
return(2);
arg = arg+strptr+1;
/* Parse cmdline for parity: */
if ((strptr = strcspn(arg,",")) == 0)
return(3);
*parity = *(arg+strptr-1);
if (*parity != 'N' && *parity != 'O' &&
*parity != 'E' && *parity != 'M' &&
*parity != 'S') return(3);
arg = arg+strptr+1;
/* Parse cmdline for databits: */
if ((strptr = strcspn(arg,",")) == 0)
return(4);
*dbits = *(arg+strptr-1) - '0';
if (*dbits != 5 && *dbits != 6 &&
*dbits != 7 && *dbits != 8)
return(4);
arg = arg+strptr+1;
/* Parse for stopbit value: */
if ((strptr = strcspn(arg,",")) == 0)
return(5);
*sbits = *(arg+strptr-1) - '0';
if (*sbits != 1 && *sbits != 2) return(5);
return(0);
}