home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
TELECOM
/
OS9_Unix.lzh
/
RSHSRC
/
lpr.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-06
|
4KB
|
193 lines
/*
* LPR
* Print one or more files on a remote line printer.
* See usage() below for details. The OS9 version of this
* utility is based upon original code by W. Richard Stevens,
*
* OS9 port by Ivan Powis (pczip@chem.nott.ac.uk) Aug 92
*
*/
#define LPRMAIN /*to include storage in defs.h*/
#include "lpr.h"
char *pname;
int nfiles=0, tmpfile=0;
main(argc, argv)
int argc;
char *argv[];
{
FILE *fp, *fopen(), *xtemp();
char *s, *filename, *getenv();
int i;
if ((s=getenv("LPHOST")) != 0) hostname=s;
if ((s=getenv("LPDEST")) != 0) printername=s;
#ifdef SET_USER
if ((s=getenv("LPUSER")) != 0) rusername=s;
#endif
pname = argv[0];
while (--argc > 0 && (*++argv)[0] == '-'){
for (s = argv[0]+1; *s != '\0'; s++){
switch (*s) {
case 'H': /* specify host name */
case 'h': /* specify host name */
if(*++s == '=') ++s; /*skip over = */
hostname=s;
s="h";
break;
case 'p': /* specify printer device name */
case 'P':
if(*++s == '=') ++s; /*skip over = */
printername=s;
s="p";
break;
#ifdef SET_USER
case 'u': /* specify username to ues on server */
if(*++s == '=') ++s;
rusername=s;
s="u";
break;
#endif
case 'C': /* specify Classname */
if(*++s == '=') ++s; /*skip over = */
Cname=s;
s="C";
break;
case 'J': /* specify Jobname */
case 't':
case 'T':
if(*++s == '=') ++s; /*skip over = */
Jname=s;
s="J";
break;
case 'D': /* debug */
case 'd':
debugflag = 1;
break;
case 'b': /* raw */
case 'l':
rflag = 1;
break;
case 'm': /* mail */
mailflag = 1;
break;
case 'q': /* quiet */
qflag = 1;
break;
case 's': /* status */
case 'S':
s++;
query_server(s);
exit(0);
case 'k': /* kill */
case 'K':
if(*++s == '=') ++s; /*skip over = */
send_kill(s);
exit(0);
case 'r': /* rm - remove file after printing */
if (*(s+1)=='m'){
delflag=1;
break;
}
/* else fall thru .... */
default:
printf("Option -%s ?\n",s);
case '?':
usage();
break;
} /*switch*/
} /*for*/
} /*while*/
i = 0;
send_start();
do {
tmpfile=0;
if (argc > 0) {
filename = argv[i];
if (strcmp(filename, "-") == 0) {
fp = xtemp(&filename); /*copy stdin to temp filename*/
if(fp==NULL) continue;
tmpfile=1;
} else if ( (fp = fopen(argv[i], "r")) == NULL) {
fprintf(stderr, "%s: can't open %s\n",
pname, argv[i]);
continue;
}
} else {
fp = xtemp(&filename); /*copy stdin to temp filename*/
if( fp == NULL) continue;
tmpfile=1;
}
send_file(filename, fp);
fclose(fp);
nfiles++;
if(delflag || tmpfile){
if(unlink(filename) )
printf("Error %d deleting %s\n",errno,filename);
}
} while (++i < argc);
send_done();
if(nfiles && !qflag)
printf("Job %s - %d files submitted to %s:%s\n",
jcname,nfiles,hostname,printername);
exit(0);
}
FILE *xtemp(str)
char **str;
{
register int c;
FILE *fp, *fopen();
static char buf[25]="lpr_temp_XXXXXX";
char *mktemp();
if( mktemp(buf) == NULL) return NULL;
*str=buf;
/* open a temporary file */
fp=fopen(buf,"w+");
if(fp == NULL) return NULL;
/* copy stdin to it */
while( (c=getchar()) != EOF ) putc(c,fp);
/* rewind it */
rewind(fp);
return fp;
}
usage()
{
printf("lpr [modes] [options] [file(s)...]\nlpr [modes] -s[+[secs]]\n");
printf("lpr [modes] -k[=]id\n\n");
printf("Functions:\n\tremote printing of `files' ... \"-\" implies standard input.\n");
printf("\t-s\t\tprint queue status\n");
printf("\t-s+[n]\trepeat every n secs (default=5)\n");
printf("\t-k[=]n\tdelete entry id=n from queue (n is numeric)\n");
printf("Modes:\n\t-h[=]server_host {or use $LPHOST}\n");
printf("\t-p[=]printer {or use $LPDEST}\n");
#ifdef SET_USER
printf("\t-u[=]server_uname {or use $LPUSER}\n");
#endif
printf("Options:\n\t-C[=]class_name\t\t-{T,J}[=]title\n");
printf("\t-d\tdebug\t\t\t-b,l\tbinary xfer\n");
printf("\t-m\tmail back\t\t-q\tquiet operation\n");
printf("\t-rm\tremove (delete) file after printing\n");
exit(0);
}