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 >
Wrap
C/C++ Source or Header
|
1993-08-03
|
3KB
|
134 lines
/*
* a print program; this one interfaces with the line printer
* daemon in lpd.c. All we do is send a request to lpd's port
* identifying the file we want printed. lpd sends back either
* a null string (everything's OK) or an error message.
* The only tricky part about the whole process is that we
* lock the port once we've opened it, so as to be sure
* that we don't interleave messages and read the error
* return intended for some other instantiation of lpr
*
* This code is provided as a sample only. No guarantee is made of
* its correctness by either Eric R. Smith or Atari Corp.
*/
#include <osbind.h>
#ifdef __GNUC__
#include <minimal.h>
#endif
#include "mintbind.h"
#define F_SETLK 6
struct flock {
short l_type;
#define F_RDLCK 0
#define F_WRLCK 1
#define F_UNLCK 3
short l_whence;
long l_start;
long l_len;
short l_pid;
} mylock;
#define MSGQUEUE "U:\\PIPE\\LPD.MSG"
#define MSGSIZ 128
char msgbuf[MSGSIZ];
int msgfd;
/*
* return the full pathname of the file "foo"
*/
char *
fullpath(foo)
char *foo;
{
static char ans[128];
char *s;
s = ans;
if (*foo && foo[1] == ':') /* already a full path? */
return foo;
*s++ = Dgetdrv()+'A'; /* put in the drive letter */
*s++ = ':';
if (*foo == '\\') {
strcpy(s, foo);
return ans;
}
*s = 0;
Dgetpath(s, 0); /* put in the current directory */
strcat(s, "\\"); /* plus a path seperator */
strcat(s, foo); /* and the file name */
return ans;
}
main(argc, argv)
int argc;
char **argv;
{
long r;
if (argc != 2) {
Cconws("Usage: lpr file\r\n");
Pterm(2);
}
msgfd = Fopen(MSGQUEUE, 2); /* read/write access needed */
if (msgfd < 0) {
Cconws("lpr: couldn't open lpd's message queue\r\n");
Pterm(1);
}
/*
* acquire a lock on the message queue
*/
mylock.l_type = F_WRLCK;
mylock.l_whence = 0;
mylock.l_start = 0;
mylock.l_len = 0;
do {
r = Fcntl(msgfd, &mylock, F_SETLK);
/* old versions of MiNT return -36 (EACCDN) for lock failures.
* newer versions of MiNT (and MultiTOS) return -58 (ELOCKED)
*/
if (r == -36 || r == -58) {
Cconws("lpr: waiting to acquire lock...\r\n");
Syield();
Syield();
} else if (r < 0) {
Cconws("lpr: fcntl failed??\r\n");
Pterm(3);
}
} while (r < 0);
/*
* queue the file to be printed
*/
strcpy(msgbuf, fullpath(argv[1]));
/* write the request */
Fwrite(msgfd, (long)MSGSIZ, msgbuf);
/* read the server's reply */
Fread(msgfd, (long)MSGSIZ, msgbuf);
/*
* Normally, we should release the lock on msgfs. However, we're going
* to exit now, and the kernel will release the lock for us.
*/
/* check for errors from the server */
if (msgbuf[0]) {
Cconws("lpd said: ");
Cconws(msgbuf);
Cconws("\r\n");
Pterm(1);
}
Pterm0();
}