xref: /plan9-contrib/sys/src/cmd/lp/lpdsend.c (revision 027288c8a8763d34db13dc89d8bcd6514dbc2163)
17dd7cddfSDavid du Colombier #include <stdio.h>
27dd7cddfSDavid du Colombier #include <string.h>
37ec5746aSDavid du Colombier #include <stdlib.h>
47ec5746aSDavid du Colombier #include <fcntl.h>
57ec5746aSDavid du Colombier #include <unistd.h>
67dd7cddfSDavid du Colombier #include <signal.h>
77ec5746aSDavid du Colombier #include <sys/types.h>
87ec5746aSDavid du Colombier #include <sys/stat.h>
97ec5746aSDavid du Colombier #include <sys/param.h>
107dd7cddfSDavid du Colombier 
117dd7cddfSDavid du Colombier #define	REDIALTIMEOUT	15
127dd7cddfSDavid du Colombier #ifdef PLAN9
137dd7cddfSDavid du Colombier #include <Plan9libnet.h>
147dd7cddfSDavid du Colombier #endif
157ec5746aSDavid du Colombier 
167ec5746aSDavid du Colombier enum {
177ec5746aSDavid du Colombier 	TIMEOUT = 30*60,
187ec5746aSDavid du Colombier 	SBSIZE = 8192,
197ec5746aSDavid du Colombier };
207dd7cddfSDavid du Colombier 
217dd7cddfSDavid du Colombier char tmpfilename[L_tmpnam+1];
227ec5746aSDavid du Colombier unsigned char sendbuf[SBSIZE];
237ec5746aSDavid du Colombier 
247dd7cddfSDavid du Colombier int alarmstate = 0;
257dd7cddfSDavid du Colombier int debugflag = 0;
267dd7cddfSDavid du Colombier int killflag = 0;
277dd7cddfSDavid du Colombier int statflag = 0;
287dd7cddfSDavid du Colombier 
297dd7cddfSDavid du Colombier void
cleanup(void)307ec5746aSDavid du Colombier cleanup(void)
317ec5746aSDavid du Colombier {
327dd7cddfSDavid du Colombier 	unlink(tmpfilename);
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier 
357dd7cddfSDavid du Colombier void
debug(char * str)367ec5746aSDavid du Colombier debug(char *str)
377ec5746aSDavid du Colombier {
387dd7cddfSDavid du Colombier 	if (debugflag)
397dd7cddfSDavid du Colombier 		fprintf(stderr, "%s", str);
407dd7cddfSDavid du Colombier }
417dd7cddfSDavid du Colombier 
427dd7cddfSDavid du Colombier void
alarmhandler(int sig)437ec5746aSDavid du Colombier alarmhandler(int sig)
447ec5746aSDavid du Colombier {
457dd7cddfSDavid du Colombier 	fprintf(stderr, "timeout occurred, check printer.\n");
467dd7cddfSDavid du Colombier 	exit(2);
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier /* send a message after each WARNPC percent of data sent */
507dd7cddfSDavid du Colombier #define WARNPC	5
517dd7cddfSDavid du Colombier 
527dd7cddfSDavid du Colombier int
copyfile(int in,int out,long tosend)537ec5746aSDavid du Colombier copyfile(int in, int out, long tosend)
547ec5746aSDavid du Colombier {
557dd7cddfSDavid du Colombier 	int n;
567dd7cddfSDavid du Colombier 	int sent = 0;
577dd7cddfSDavid du Colombier 	int percent = 0;
587dd7cddfSDavid du Colombier 
59d9306527SDavid du Colombier 	if (debugflag)
60d9306527SDavid du Colombier 		fprintf(stderr, "lpdsend: copyfile(%d,%d,%ld)\n",
61d9306527SDavid du Colombier 			in, out, tosend);
627dd7cddfSDavid du Colombier 	while ((n=read(in, sendbuf, SBSIZE)) > 0) {
63d9306527SDavid du Colombier 		if (debugflag)
64d9306527SDavid du Colombier 			fprintf(stderr, "lpdsend: copyfile read %d bytes from %d\n",
65d9306527SDavid du Colombier 				n, in);
667ec5746aSDavid du Colombier 		alarm(TIMEOUT);
677ec5746aSDavid du Colombier 		alarmstate = 1;
687dd7cddfSDavid du Colombier 		if (write(out, sendbuf, n) != n) {
697dd7cddfSDavid du Colombier 			alarm(0);
70d9306527SDavid du Colombier 			fprintf(stderr, "write to fd %d failed\n", out);
717dd7cddfSDavid du Colombier 			return(0);
727dd7cddfSDavid du Colombier 		}
737dd7cddfSDavid du Colombier 		alarm(0);
74d9306527SDavid du Colombier 		if (debugflag)
75d9306527SDavid du Colombier 			fprintf(stderr, "lpdsend: copyfile wrote %d bytes to %d\n",
76d9306527SDavid du Colombier 				n, out);
777dd7cddfSDavid du Colombier 		sent += n;
787ec5746aSDavid du Colombier 		if (tosend && sent*100/tosend >= percent+WARNPC) {
797dd7cddfSDavid du Colombier 			percent += WARNPC;
807dd7cddfSDavid du Colombier 			fprintf(stderr, ": %5.2f%% sent\n", sent*100.0/tosend);
817dd7cddfSDavid du Colombier 		}
827dd7cddfSDavid du Colombier 	}
83d9306527SDavid du Colombier 	if (debugflag)
84d9306527SDavid du Colombier 		fprintf(stderr, "lpdsend: copyfile read %d bytes from %d\n",
85d9306527SDavid du Colombier 			n, in);
867dd7cddfSDavid du Colombier 	return(!n);
877dd7cddfSDavid du Colombier }
887dd7cddfSDavid du Colombier 
897dd7cddfSDavid du Colombier char  strbuf[120];
907dd7cddfSDavid du Colombier char hostname[MAXHOSTNAMELEN], *username, *printername, *killarg;
917dd7cddfSDavid du Colombier char *inputname;
927dd7cddfSDavid du Colombier char filetype = 'o';	/* 'o' is for PostScript */
939a747e4fSDavid du Colombier int seqno = 0;
949a747e4fSDavid du Colombier char *seqfilename;
957dd7cddfSDavid du Colombier 
967dd7cddfSDavid du Colombier void
killjob(int printerfd)977ec5746aSDavid du Colombier killjob(int printerfd)
987ec5746aSDavid du Colombier {
997dd7cddfSDavid du Colombier 	int strlength;
1007ec5746aSDavid du Colombier 
1017dd7cddfSDavid du Colombier 	if (printername==0) {
1027dd7cddfSDavid du Colombier 		fprintf(stderr, "no printer name\n");
1037dd7cddfSDavid du Colombier 		exit(1);
1047dd7cddfSDavid du Colombier 	}
1057dd7cddfSDavid du Colombier 	if (username==0) {
1067dd7cddfSDavid du Colombier 		fprintf(stderr, "no user name given\n");
1077dd7cddfSDavid du Colombier 		exit(1);
1087dd7cddfSDavid du Colombier 	}
1097dd7cddfSDavid du Colombier 	if (killarg==0) {
1107dd7cddfSDavid du Colombier 		fprintf(stderr, "no job to kill\n");
1117dd7cddfSDavid du Colombier 		exit(1);
1127dd7cddfSDavid du Colombier 	}
1137dd7cddfSDavid du Colombier 	sprintf(strbuf, "%c%s %s %s\n", '\5', printername, username, killarg);
1147dd7cddfSDavid du Colombier 	strlength = strlen(strbuf);
1157dd7cddfSDavid du Colombier 	if (write(printerfd, strbuf, strlength) != strlength) {
1167dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1177dd7cddfSDavid du Colombier 		exit(1);
1187dd7cddfSDavid du Colombier 	}
119d9306527SDavid du Colombier 	copyfile(printerfd, 2, 0L);
1207dd7cddfSDavid du Colombier }
1217dd7cddfSDavid du Colombier 
1227dd7cddfSDavid du Colombier void
checkqueue(int printerfd)1237ec5746aSDavid du Colombier checkqueue(int printerfd)
1247ec5746aSDavid du Colombier {
1257dd7cddfSDavid du Colombier 	int n, strlength;
12680ee5cbfSDavid du Colombier 	unsigned char sendbuf[1];
1277dd7cddfSDavid du Colombier 
1287dd7cddfSDavid du Colombier 	sprintf(strbuf, "%c%s\n", '\4', printername);
1297dd7cddfSDavid du Colombier 	strlength = strlen(strbuf);
1307dd7cddfSDavid du Colombier 	if (write(printerfd, strbuf, strlength) != strlength) {
1317dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1327dd7cddfSDavid du Colombier 		exit(1);
1337dd7cddfSDavid du Colombier 	}
134d9306527SDavid du Colombier 	copyfile(printerfd, 2, 0L);
1357dd7cddfSDavid du Colombier /*
1367dd7cddfSDavid du Colombier 	while ((n=read(printerfd, sendbuf, 1)) > 0) {
1377dd7cddfSDavid du Colombier 		write(2, sendbuf, n);
1387dd7cddfSDavid du Colombier 	}
1397dd7cddfSDavid du Colombier */
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier 
1427dd7cddfSDavid du Colombier void
getack(int printerfd,int as)1437ec5746aSDavid du Colombier getack(int printerfd, int as)
1447ec5746aSDavid du Colombier {
1457dd7cddfSDavid du Colombier 	char resp;
1467dd7cddfSDavid du Colombier 	int rv;
1477dd7cddfSDavid du Colombier 
1487ec5746aSDavid du Colombier 	alarm(TIMEOUT);
1497ec5746aSDavid du Colombier 	alarmstate = as;
1507dd7cddfSDavid du Colombier 	if ((rv = read(printerfd, &resp, 1)) != 1 || resp != '\0') {
1517ec5746aSDavid du Colombier 		fprintf(stderr, "getack failed: read returned %d, "
1527ec5746aSDavid du Colombier 			"read value (if any) %d, alarmstate=%d\n",
1537dd7cddfSDavid du Colombier 			rv, resp, alarmstate);
1547dd7cddfSDavid du Colombier 		exit(1);
1557dd7cddfSDavid du Colombier 	}
1567dd7cddfSDavid du Colombier 	alarm(0);
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier 
1597dd7cddfSDavid du Colombier /* send control file */
1607dd7cddfSDavid du Colombier void
sendctrl(int printerfd)1617ec5746aSDavid du Colombier sendctrl(int printerfd)
1627ec5746aSDavid du Colombier {
1637dd7cddfSDavid du Colombier 	char cntrlstrbuf[256];
1647dd7cddfSDavid du Colombier 	int strlength, cntrlen;
1657dd7cddfSDavid du Colombier 
1667dd7cddfSDavid du Colombier 	sprintf(cntrlstrbuf, "H%s\nP%s\n%cdfA%3.3d%s\n", hostname, username, filetype, seqno, hostname);
1677dd7cddfSDavid du Colombier 	cntrlen = strlen(cntrlstrbuf);
1687dd7cddfSDavid du Colombier 	sprintf(strbuf, "%c%d cfA%3.3d%s\n", '\2', cntrlen, seqno, hostname);
1697dd7cddfSDavid du Colombier 	strlength = strlen(strbuf);
1707dd7cddfSDavid du Colombier 	if (write(printerfd, strbuf, strlength) != strlength) {
1717dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1727dd7cddfSDavid du Colombier 		exit(1);
1737dd7cddfSDavid du Colombier 	}
1747dd7cddfSDavid du Colombier 	getack(printerfd, 3);
1757dd7cddfSDavid du Colombier 	if (write(printerfd, cntrlstrbuf, cntrlen) != cntrlen) {
1767dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1777dd7cddfSDavid du Colombier 		exit(1);
1787dd7cddfSDavid du Colombier 	}
1797dd7cddfSDavid du Colombier 	if (write(printerfd, "\0", 1) != 1) {
1807dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1817dd7cddfSDavid du Colombier 		exit(1);
1827dd7cddfSDavid du Colombier 	}
1837dd7cddfSDavid du Colombier 	getack(printerfd, 4);
1847dd7cddfSDavid du Colombier }
1857dd7cddfSDavid du Colombier 
1867dd7cddfSDavid du Colombier /* send data file */
1877dd7cddfSDavid du Colombier void
senddata(int inputfd,int printerfd,long size)1887ec5746aSDavid du Colombier senddata(int inputfd, int printerfd, long size)
1897ec5746aSDavid du Colombier {
1907dd7cddfSDavid du Colombier 	int strlength;
1917dd7cddfSDavid du Colombier 
1927dd7cddfSDavid du Colombier 	sprintf(strbuf, "%c%d dfA%3.3d%s\n", '\3', size, seqno, hostname);
1937dd7cddfSDavid du Colombier 	strlength = strlen(strbuf);
1947dd7cddfSDavid du Colombier 	if (write(printerfd, strbuf, strlength) != strlength) {
1957dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
1967dd7cddfSDavid du Colombier 		exit(1);
1977dd7cddfSDavid du Colombier 	}
1987dd7cddfSDavid du Colombier 	getack(printerfd, 5);
1997dd7cddfSDavid du Colombier 	if (!copyfile(inputfd, printerfd, size)) {
2007dd7cddfSDavid du Colombier 		fprintf(stderr, "failed to send file to printer\n");
2017dd7cddfSDavid du Colombier 		exit(1);
2027dd7cddfSDavid du Colombier 	}
2037dd7cddfSDavid du Colombier 	if (write(printerfd, "\0", 1) != 1) {
2047dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
2057dd7cddfSDavid du Colombier 		exit(1);
2067dd7cddfSDavid du Colombier 	}
2077dd7cddfSDavid du Colombier 	fprintf(stderr, "%d bytes sent, status: waiting for end of job\n", size);
2087dd7cddfSDavid du Colombier 	getack(printerfd, 6);
2097dd7cddfSDavid du Colombier }
2107dd7cddfSDavid du Colombier 
2117dd7cddfSDavid du Colombier void
sendjob(int inputfd,int printerfd)2127ec5746aSDavid du Colombier sendjob(int inputfd, int printerfd)
2137ec5746aSDavid du Colombier {
2147dd7cddfSDavid du Colombier 	struct stat statbuf;
2157dd7cddfSDavid du Colombier 	int strlength;
2167dd7cddfSDavid du Colombier 
2177dd7cddfSDavid du Colombier 	if (fstat(inputfd, &statbuf) < 0) {
2187dd7cddfSDavid du Colombier 		fprintf(stderr, "fstat(%s) failed\n", inputname);
2197dd7cddfSDavid du Colombier 		exit(1);
2207dd7cddfSDavid du Colombier 	}
2217dd7cddfSDavid du Colombier 	sprintf(strbuf, "%c%s\n", '\2', printername);
2227dd7cddfSDavid du Colombier 	strlength = strlen(strbuf);
2237dd7cddfSDavid du Colombier 	if (write(printerfd, strbuf, strlength) != strlength) {
2247dd7cddfSDavid du Colombier 		fprintf(stderr, "write(printer) error\n");
2257dd7cddfSDavid du Colombier 		exit(1);
2267dd7cddfSDavid du Colombier 	}
2277dd7cddfSDavid du Colombier 	getack(printerfd, 2);
2287dd7cddfSDavid du Colombier 	debug("send data\n");
2297dd7cddfSDavid du Colombier 	senddata(inputfd, printerfd, statbuf.st_size);
2307dd7cddfSDavid du Colombier 	debug("send control info\n");
2317dd7cddfSDavid du Colombier 	sendctrl(printerfd);
232d9306527SDavid du Colombier 	fprintf(stderr, "%ld bytes sent, status: end of job\n", statbuf.st_size);
233d9306527SDavid du Colombier }
234d9306527SDavid du Colombier 
235d9306527SDavid du Colombier /*
236d9306527SDavid du Colombier  *  make an address, add the defaults
237d9306527SDavid du Colombier  */
238d9306527SDavid du Colombier char *
netmkaddr(char * linear,char * defnet,char * defsrv)239d9306527SDavid du Colombier netmkaddr(char *linear, char *defnet, char *defsrv)
240d9306527SDavid du Colombier {
241d9306527SDavid du Colombier 	static char addr[512];
242d9306527SDavid du Colombier 	char *cp;
243d9306527SDavid du Colombier 
244d9306527SDavid du Colombier 	/*
245d9306527SDavid du Colombier 	 *  dump network name
246d9306527SDavid du Colombier 	 */
247d9306527SDavid du Colombier 	cp = strchr(linear, '!');
248d9306527SDavid du Colombier 	if(cp == 0){
249d9306527SDavid du Colombier 		if(defnet==0){
250d9306527SDavid du Colombier 			if(defsrv)
2514d44ba9bSDavid du Colombier 				snprintf(addr, sizeof addr, "net!%s!%s", linear, defsrv);
252d9306527SDavid du Colombier 			else
2534d44ba9bSDavid du Colombier 				snprintf(addr, sizeof addr, "net!%s", linear);
254d9306527SDavid du Colombier 		}
255d9306527SDavid du Colombier 		else {
256d9306527SDavid du Colombier 			if(defsrv)
2574d44ba9bSDavid du Colombier 				snprintf(addr, sizeof addr, "%s!%s!%s", defnet, linear, defsrv);
258d9306527SDavid du Colombier 			else
2594d44ba9bSDavid du Colombier 				snprintf(addr, sizeof addr, "%s!%s", defnet, linear);
260d9306527SDavid du Colombier 		}
261d9306527SDavid du Colombier 		return addr;
262d9306527SDavid du Colombier 	}
263d9306527SDavid du Colombier 
264d9306527SDavid du Colombier 	/*
265d9306527SDavid du Colombier 	 *  if there is already a service, use it
266d9306527SDavid du Colombier 	 */
267d9306527SDavid du Colombier 	cp = strchr(cp+1, '!');
268d9306527SDavid du Colombier 	if(cp)
269d9306527SDavid du Colombier 		return linear;
270d9306527SDavid du Colombier 
271d9306527SDavid du Colombier 	/*
272d9306527SDavid du Colombier 	 *  add default service
273d9306527SDavid du Colombier 	 */
274d9306527SDavid du Colombier 	if(defsrv == 0)
275d9306527SDavid du Colombier 		return linear;
276d9306527SDavid du Colombier 	sprintf(addr, "%s!%s", linear, defsrv);
277d9306527SDavid du Colombier 
278d9306527SDavid du Colombier 	return addr;
2797dd7cddfSDavid du Colombier }
2807dd7cddfSDavid du Colombier 
281*027288c8SDavid du Colombier void
main(int argc,char * argv[])2827ec5746aSDavid du Colombier main(int argc, char *argv[])
2837ec5746aSDavid du Colombier {
2847ec5746aSDavid du Colombier 	int c, usgflg = 0, inputfd, printerfd, sendport;
2857ec5746aSDavid du Colombier 	char *desthostname, *hnend;
2867dd7cddfSDavid du Colombier 	char portstr[4];
2877dd7cddfSDavid du Colombier 
2887dd7cddfSDavid du Colombier 	if (signal(SIGALRM, alarmhandler) == SIG_ERR) {
2897dd7cddfSDavid du Colombier 		fprintf(stderr, "failed to set alarm handler\n");
2907dd7cddfSDavid du Colombier 		exit(1);
2917dd7cddfSDavid du Colombier 	}
2929a747e4fSDavid du Colombier 	while ((c = getopt(argc, argv, "Dd:k:qs:t:H:P:")) != -1)
2937dd7cddfSDavid du Colombier 		switch (c) {
2947dd7cddfSDavid du Colombier 		case 'D':
2957dd7cddfSDavid du Colombier 			debugflag = 1;
2967dd7cddfSDavid du Colombier 			debug("debugging on\n");
2977dd7cddfSDavid du Colombier 			break;
2987dd7cddfSDavid du Colombier 		case 'd':
2997dd7cddfSDavid du Colombier 			printername = optarg;
3007dd7cddfSDavid du Colombier 			break;
3017dd7cddfSDavid du Colombier 		case 'k':
3027dd7cddfSDavid du Colombier 			if (statflag) {
3037dd7cddfSDavid du Colombier 				fprintf(stderr, "cannot have both -k and -q flags\n");
3047dd7cddfSDavid du Colombier 				exit(1);
3057dd7cddfSDavid du Colombier 			}
3067dd7cddfSDavid du Colombier 			killflag = 1;
3077dd7cddfSDavid du Colombier 			killarg = optarg;
3087dd7cddfSDavid du Colombier 			break;
3097dd7cddfSDavid du Colombier 		case 'q':
3107dd7cddfSDavid du Colombier 			if (killflag) {
3117dd7cddfSDavid du Colombier 				fprintf(stderr, "cannot have both -q and -k flags\n");
3127dd7cddfSDavid du Colombier 				exit(1);
3137dd7cddfSDavid du Colombier 			}
3147dd7cddfSDavid du Colombier 			statflag = 1;
3157dd7cddfSDavid du Colombier 			break;
3169a747e4fSDavid du Colombier 		case 's':
3179a747e4fSDavid du Colombier 			seqno = strtol(optarg, NULL, 10);
3189a747e4fSDavid du Colombier 			if (seqno < 0 || seqno > 999)
3199a747e4fSDavid du Colombier 				seqno = 0;
3209a747e4fSDavid du Colombier 			break;
3217dd7cddfSDavid du Colombier 		case 't':
3227dd7cddfSDavid du Colombier 			switch (filetype) {
3237dd7cddfSDavid du Colombier 			case 'c':
3247dd7cddfSDavid du Colombier 			case 'd':
3257dd7cddfSDavid du Colombier 			case 'f':
3267dd7cddfSDavid du Colombier 			case 'g':
3277dd7cddfSDavid du Colombier 			case 'l':
3287dd7cddfSDavid du Colombier 			case 'n':
3297dd7cddfSDavid du Colombier 			case 'o':
3307dd7cddfSDavid du Colombier 			case 'p':
3317dd7cddfSDavid du Colombier 			case 'r':
3327dd7cddfSDavid du Colombier 			case 't':
3337dd7cddfSDavid du Colombier 			case 'v':
3347dd7cddfSDavid du Colombier 			case 'z':
3357dd7cddfSDavid du Colombier 				filetype = optarg[0];
3367dd7cddfSDavid du Colombier 				break;
3377dd7cddfSDavid du Colombier 			default:
3387dd7cddfSDavid du Colombier 				usgflg++;
3397dd7cddfSDavid du Colombier 				break;
3407dd7cddfSDavid du Colombier 			}
3417dd7cddfSDavid du Colombier 			break;
3427dd7cddfSDavid du Colombier 		case 'H':
3437dd7cddfSDavid du Colombier 			strncpy(hostname, optarg, MAXHOSTNAMELEN);
3447dd7cddfSDavid du Colombier 			break;
3457dd7cddfSDavid du Colombier 		case 'P':
3467dd7cddfSDavid du Colombier 			username = optarg;
3477dd7cddfSDavid du Colombier 			break;
3487dd7cddfSDavid du Colombier 		default:
3497dd7cddfSDavid du Colombier 		case '?':
3507dd7cddfSDavid du Colombier 			fprintf(stderr, "unknown option %c\n", c);
3517dd7cddfSDavid du Colombier 			usgflg++;
3527dd7cddfSDavid du Colombier 		}
3537dd7cddfSDavid du Colombier 	if (argc < 2) usgflg++;
3547dd7cddfSDavid du Colombier 	if (optind < argc) {
3557dd7cddfSDavid du Colombier 		desthostname = argv[optind++];
3567dd7cddfSDavid du Colombier 	} else
3577dd7cddfSDavid du Colombier 		usgflg++;
3587dd7cddfSDavid du Colombier 	if (usgflg) {
3599a747e4fSDavid du Colombier 		fprintf(stderr, "usage: to send a job - %s -d printer -H hostname -P username [-s seqno] [-t[cdfgklnoprtvz]] desthost [filename]\n", argv[0]);
3607dd7cddfSDavid du Colombier 		fprintf(stderr, "     to check status - %s -d printer -q desthost\n", argv[0]);
3617dd7cddfSDavid du Colombier 		fprintf(stderr, "       to kill a job - %s -d printer -P username -k jobname desthost\n", argv[0]);
3627dd7cddfSDavid du Colombier 		exit(1);
3637dd7cddfSDavid du Colombier 	}
3647dd7cddfSDavid du Colombier 
3657dd7cddfSDavid du Colombier /* make sure the file to send is here and ready
3667dd7cddfSDavid du Colombier  * otherwise the TCP connection times out.
3677dd7cddfSDavid du Colombier  */
3687dd7cddfSDavid du Colombier 	if (!statflag && !killflag) {
3697dd7cddfSDavid du Colombier 		if (optind < argc) {
3707dd7cddfSDavid du Colombier 			inputname = argv[optind++];
3717dd7cddfSDavid du Colombier 			debug("open("); debug(inputname); debug(")\n");
3727dd7cddfSDavid du Colombier 			inputfd = open(inputname, O_RDONLY);
3737dd7cddfSDavid du Colombier 			if (inputfd < 0) {
3747dd7cddfSDavid du Colombier 				fprintf(stderr, "open(%s) failed\n", inputname);
3757dd7cddfSDavid du Colombier 				exit(1);
3767dd7cddfSDavid du Colombier 			}
3777dd7cddfSDavid du Colombier 		} else {
3787dd7cddfSDavid du Colombier 			inputname = "stdin";
3797dd7cddfSDavid du Colombier 			tmpnam(tmpfilename);
3807dd7cddfSDavid du Colombier 			debug("using stdin\n");
3817dd7cddfSDavid du Colombier 			if ((inputfd = open(tmpfilename, O_RDWR|O_CREAT, 0600)) < 0) {
3827dd7cddfSDavid du Colombier 				fprintf(stderr, "open(%s) failed\n", tmpfilename);
3837dd7cddfSDavid du Colombier 				exit(1);
3847dd7cddfSDavid du Colombier 			}
3857dd7cddfSDavid du Colombier 			atexit(cleanup);
386d9306527SDavid du Colombier 			debug("copy input to temp file ");
387d9306527SDavid du Colombier 			debug(tmpfilename);
388d9306527SDavid du Colombier 			debug("\n");
389d9306527SDavid du Colombier 			if (!copyfile(0, inputfd, 0L)) {
3907dd7cddfSDavid du Colombier 				fprintf(stderr, "failed to copy file to temporary file\n");
3917dd7cddfSDavid du Colombier 				exit(1);
3927dd7cddfSDavid du Colombier 			}
393d9306527SDavid du Colombier 			if (lseek(inputfd, 0L, 0) < 0) {
3947dd7cddfSDavid du Colombier 				fprintf(stderr, "failed to seek back to the beginning of the temporary file\n");
3957dd7cddfSDavid du Colombier 				exit(1);
3967dd7cddfSDavid du Colombier 			}
3977dd7cddfSDavid du Colombier 		}
3987dd7cddfSDavid du Colombier 	}
3997dd7cddfSDavid du Colombier 
400d9306527SDavid du Colombier 	sprintf(strbuf, "%s", netmkaddr(desthostname, "tcp", "printer"));
401d9306527SDavid du Colombier 	fprintf(stderr, "connecting to %s\n", strbuf);
4027dd7cddfSDavid du Colombier 	for (sendport=721; sendport<=731; sendport++) {
4037dd7cddfSDavid du Colombier 		sprintf(portstr, "%3.3d", sendport);
4047dd7cddfSDavid du Colombier 		fprintf(stderr, " trying from port %s...", portstr);
4057dd7cddfSDavid du Colombier 		debug(" dial("); debug(strbuf); debug(", "); debug(portstr); debug(", 0, 0) ...");
4067dd7cddfSDavid du Colombier 		printerfd = dial(strbuf, portstr, 0, 0);
4077dd7cddfSDavid du Colombier 		if (printerfd >= 0) {
4087dd7cddfSDavid du Colombier 			fprintf(stderr, "connected\n");
4097dd7cddfSDavid du Colombier 			break;
4107dd7cddfSDavid du Colombier 		}
4117dd7cddfSDavid du Colombier 		fprintf(stderr, "failed\n");
4127dd7cddfSDavid du Colombier 		sleep(REDIALTIMEOUT);
4137dd7cddfSDavid du Colombier 	}
4147dd7cddfSDavid du Colombier 	if (printerfd < 0) {
4157dd7cddfSDavid du Colombier 		fprintf(stderr, "Cannot open a valid port!\n");
4167dd7cddfSDavid du Colombier 		fprintf(stderr, "-  All source ports [721-731] may be busy.\n");
4177dd7cddfSDavid du Colombier 		fprintf(stderr, "-  Is recipient ready and online?\n");
4187dd7cddfSDavid du Colombier 		fprintf(stderr, "-  If all else fails, cycle the power!\n");
4197dd7cddfSDavid du Colombier 		exit(1);
4207dd7cddfSDavid du Colombier 	}
4217dd7cddfSDavid du Colombier /*	hostname[8] = '\0'; */
4227dd7cddfSDavid du Colombier #ifndef PLAN9
4237dd7cddfSDavid du Colombier 	if (gethostname(hostname, sizeof(hostname)) < 0) {
4247dd7cddfSDavid du Colombier 		perror("gethostname");
4257dd7cddfSDavid du Colombier 		exit(1);
4267dd7cddfSDavid du Colombier 	}
4277dd7cddfSDavid du Colombier #endif
4287dd7cddfSDavid du Colombier /*	if ((hnend = strchr(hostname, '.')) != NULL)
4297dd7cddfSDavid du Colombier 		*hnend = '\0';
4307dd7cddfSDavid du Colombier  */
4317dd7cddfSDavid du Colombier 	if (statflag) {
4327dd7cddfSDavid du Colombier 		checkqueue(printerfd);
4337dd7cddfSDavid du Colombier 	} else if (killflag) {
4347dd7cddfSDavid du Colombier 		killjob(printerfd);
4357dd7cddfSDavid du Colombier 	} else {
4367dd7cddfSDavid du Colombier 		sendjob(inputfd, printerfd);
4377dd7cddfSDavid du Colombier 	}
4387dd7cddfSDavid du Colombier 	exit(0);
4397dd7cddfSDavid du Colombier }
440