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