Blame


1 262ecfed 2005-08-31 devnull #include <u.h>
2 262ecfed 2005-08-31 devnull #include <sys/types.h>
3 262ecfed 2005-08-31 devnull #include <unistd.h>
4 262ecfed 2005-08-31 devnull #include <sys/stat.h>
5 262ecfed 2005-08-31 devnull #include <sys/param.h>
6 262ecfed 2005-08-31 devnull #include <stdlib.h>
7 262ecfed 2005-08-31 devnull #include <fcntl.h>
8 262ecfed 2005-08-31 devnull #include <stdio.h>
9 262ecfed 2005-08-31 devnull #include <string.h>
10 262ecfed 2005-08-31 devnull #include <signal.h>
11 262ecfed 2005-08-31 devnull #include <libc.h>
12 262ecfed 2005-08-31 devnull
13 262ecfed 2005-08-31 devnull #define REDIALTIMEOUT 15
14 262ecfed 2005-08-31 devnull #define TIMEOUT 600
15 262ecfed 2005-08-31 devnull
16 262ecfed 2005-08-31 devnull char tmpfilename[L_tmpnam+1];
17 262ecfed 2005-08-31 devnull int alarmstate = 0;
18 262ecfed 2005-08-31 devnull int debugflag = 0;
19 262ecfed 2005-08-31 devnull int killflag = 0;
20 262ecfed 2005-08-31 devnull int statflag = 0;
21 262ecfed 2005-08-31 devnull
22 262ecfed 2005-08-31 devnull void
23 262ecfed 2005-08-31 devnull cleanup(void) {
24 262ecfed 2005-08-31 devnull unlink(tmpfilename);
25 262ecfed 2005-08-31 devnull }
26 262ecfed 2005-08-31 devnull
27 262ecfed 2005-08-31 devnull #define SBSIZE 8192
28 262ecfed 2005-08-31 devnull unsigned char sendbuf[SBSIZE];
29 262ecfed 2005-08-31 devnull
30 262ecfed 2005-08-31 devnull void
31 262ecfed 2005-08-31 devnull debug(char *str) {
32 262ecfed 2005-08-31 devnull if (debugflag)
33 262ecfed 2005-08-31 devnull fprintf(stderr, "%s", str);
34 262ecfed 2005-08-31 devnull }
35 262ecfed 2005-08-31 devnull
36 262ecfed 2005-08-31 devnull void
37 262ecfed 2005-08-31 devnull alarmhandler(int sig) {
38 262ecfed 2005-08-31 devnull fprintf(stderr, "timeout occurred, check printer.\n");
39 262ecfed 2005-08-31 devnull exit(2);
40 262ecfed 2005-08-31 devnull }
41 262ecfed 2005-08-31 devnull
42 262ecfed 2005-08-31 devnull /* send a message after each WARNPC percent of data sent */
43 262ecfed 2005-08-31 devnull #define WARNPC 5
44 262ecfed 2005-08-31 devnull
45 262ecfed 2005-08-31 devnull int
46 262ecfed 2005-08-31 devnull copyfile(int in, int out, long tosend) {
47 262ecfed 2005-08-31 devnull int n;
48 262ecfed 2005-08-31 devnull int sent = 0;
49 262ecfed 2005-08-31 devnull int percent = 0;
50 262ecfed 2005-08-31 devnull
51 262ecfed 2005-08-31 devnull if (debugflag)
52 262ecfed 2005-08-31 devnull fprintf(stderr, "lpdsend: copyfile(%d,%d,%ld)\n",
53 262ecfed 2005-08-31 devnull in, out, tosend);
54 262ecfed 2005-08-31 devnull while ((n=read(in, sendbuf, SBSIZE)) > 0) {
55 262ecfed 2005-08-31 devnull if (debugflag)
56 262ecfed 2005-08-31 devnull fprintf(stderr, "lpdsend: copyfile read %d bytes from %d\n",
57 262ecfed 2005-08-31 devnull n, in);
58 262ecfed 2005-08-31 devnull alarm(TIMEOUT); alarmstate = 1;
59 262ecfed 2005-08-31 devnull if (write(out, sendbuf, n) != n) {
60 262ecfed 2005-08-31 devnull alarm(0);
61 262ecfed 2005-08-31 devnull fprintf(stderr, "write to fd %d failed\n", out);
62 262ecfed 2005-08-31 devnull return(0);
63 262ecfed 2005-08-31 devnull }
64 262ecfed 2005-08-31 devnull alarm(0);
65 262ecfed 2005-08-31 devnull if (debugflag)
66 262ecfed 2005-08-31 devnull fprintf(stderr, "lpdsend: copyfile wrote %d bytes to %d\n",
67 262ecfed 2005-08-31 devnull n, out);
68 262ecfed 2005-08-31 devnull sent += n;
69 262ecfed 2005-08-31 devnull if (tosend && ((sent*100/tosend)>=(percent+WARNPC))) {
70 262ecfed 2005-08-31 devnull percent += WARNPC;
71 262ecfed 2005-08-31 devnull fprintf(stderr, ": %5.2f%% sent\n", sent*100.0/tosend);
72 262ecfed 2005-08-31 devnull }
73 262ecfed 2005-08-31 devnull }
74 262ecfed 2005-08-31 devnull if (debugflag)
75 262ecfed 2005-08-31 devnull fprintf(stderr, "lpdsend: copyfile read %d bytes from %d\n",
76 262ecfed 2005-08-31 devnull n, in);
77 262ecfed 2005-08-31 devnull return(!n);
78 262ecfed 2005-08-31 devnull }
79 262ecfed 2005-08-31 devnull
80 262ecfed 2005-08-31 devnull char strbuf[120];
81 262ecfed 2005-08-31 devnull char hostname[MAXHOSTNAMELEN], *username, *printername, *killarg;
82 262ecfed 2005-08-31 devnull char *inputname;
83 262ecfed 2005-08-31 devnull char filetype = 'o'; /* 'o' is for PostScript */
84 262ecfed 2005-08-31 devnull int seqno = 0;
85 262ecfed 2005-08-31 devnull char *seqfilename;
86 262ecfed 2005-08-31 devnull
87 262ecfed 2005-08-31 devnull void
88 262ecfed 2005-08-31 devnull killjob(int printerfd) {
89 262ecfed 2005-08-31 devnull int strlength;
90 262ecfed 2005-08-31 devnull if (printername==0) {
91 262ecfed 2005-08-31 devnull fprintf(stderr, "no printer name\n");
92 262ecfed 2005-08-31 devnull exit(1);
93 262ecfed 2005-08-31 devnull }
94 262ecfed 2005-08-31 devnull if (username==0) {
95 262ecfed 2005-08-31 devnull fprintf(stderr, "no user name given\n");
96 262ecfed 2005-08-31 devnull exit(1);
97 262ecfed 2005-08-31 devnull }
98 262ecfed 2005-08-31 devnull if (killarg==0) {
99 262ecfed 2005-08-31 devnull fprintf(stderr, "no job to kill\n");
100 262ecfed 2005-08-31 devnull exit(1);
101 262ecfed 2005-08-31 devnull }
102 262ecfed 2005-08-31 devnull sprintf(strbuf, "%c%s %s %s\n", '\5', printername, username, killarg);
103 262ecfed 2005-08-31 devnull strlength = strlen(strbuf);
104 262ecfed 2005-08-31 devnull if (write(printerfd, strbuf, strlength) != strlength) {
105 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
106 262ecfed 2005-08-31 devnull exit(1);
107 262ecfed 2005-08-31 devnull }
108 262ecfed 2005-08-31 devnull copyfile(printerfd, 2, 0L);
109 262ecfed 2005-08-31 devnull }
110 262ecfed 2005-08-31 devnull
111 262ecfed 2005-08-31 devnull void
112 262ecfed 2005-08-31 devnull checkqueue(int printerfd) {
113 262ecfed 2005-08-31 devnull int strlength;
114 262ecfed 2005-08-31 devnull
115 262ecfed 2005-08-31 devnull sprintf(strbuf, "%c%s\n", '\4', printername);
116 262ecfed 2005-08-31 devnull strlength = strlen(strbuf);
117 262ecfed 2005-08-31 devnull if (write(printerfd, strbuf, strlength) != strlength) {
118 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
119 262ecfed 2005-08-31 devnull exit(1);
120 262ecfed 2005-08-31 devnull }
121 262ecfed 2005-08-31 devnull copyfile(printerfd, 2, 0L);
122 262ecfed 2005-08-31 devnull /*
123 262ecfed 2005-08-31 devnull { int n;
124 262ecfed 2005-08-31 devnull unsigned char sendbuf[1];
125 262ecfed 2005-08-31 devnull while ((n=read(printerfd, sendbuf, 1)) > 0) {
126 262ecfed 2005-08-31 devnull write(2, sendbuf, n);
127 262ecfed 2005-08-31 devnull }
128 262ecfed 2005-08-31 devnull }
129 262ecfed 2005-08-31 devnull */
130 262ecfed 2005-08-31 devnull }
131 262ecfed 2005-08-31 devnull
132 262ecfed 2005-08-31 devnull void
133 262ecfed 2005-08-31 devnull getack(int printerfd, int as) {
134 262ecfed 2005-08-31 devnull char resp;
135 262ecfed 2005-08-31 devnull int rv;
136 262ecfed 2005-08-31 devnull
137 262ecfed 2005-08-31 devnull alarm(TIMEOUT); alarmstate = as;
138 262ecfed 2005-08-31 devnull if ((rv=read(printerfd, &resp, 1)) != 1 || resp != '\0') {
139 262ecfed 2005-08-31 devnull fprintf(stderr, "getack failed: read returned %d, read value (if any) %d, alarmstate=%d\n",
140 262ecfed 2005-08-31 devnull rv, resp, alarmstate);
141 262ecfed 2005-08-31 devnull exit(1);
142 262ecfed 2005-08-31 devnull }
143 262ecfed 2005-08-31 devnull alarm(0);
144 262ecfed 2005-08-31 devnull }
145 262ecfed 2005-08-31 devnull
146 262ecfed 2005-08-31 devnull /* send control file */
147 262ecfed 2005-08-31 devnull void
148 262ecfed 2005-08-31 devnull sendctrl(int printerfd) {
149 262ecfed 2005-08-31 devnull char cntrlstrbuf[256];
150 262ecfed 2005-08-31 devnull int strlength, cntrlen;
151 262ecfed 2005-08-31 devnull
152 262ecfed 2005-08-31 devnull sprintf(cntrlstrbuf, "H%s\nP%s\n%cdfA%3.3d%s\n", hostname, username, filetype, seqno, hostname);
153 262ecfed 2005-08-31 devnull cntrlen = strlen(cntrlstrbuf);
154 262ecfed 2005-08-31 devnull sprintf(strbuf, "%c%d cfA%3.3d%s\n", '\2', cntrlen, seqno, hostname);
155 262ecfed 2005-08-31 devnull strlength = strlen(strbuf);
156 262ecfed 2005-08-31 devnull if (write(printerfd, strbuf, strlength) != strlength) {
157 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
158 262ecfed 2005-08-31 devnull exit(1);
159 262ecfed 2005-08-31 devnull }
160 262ecfed 2005-08-31 devnull getack(printerfd, 3);
161 262ecfed 2005-08-31 devnull if (write(printerfd, cntrlstrbuf, cntrlen) != cntrlen) {
162 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
163 262ecfed 2005-08-31 devnull exit(1);
164 262ecfed 2005-08-31 devnull }
165 262ecfed 2005-08-31 devnull if (write(printerfd, "\0", 1) != 1) {
166 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
167 262ecfed 2005-08-31 devnull exit(1);
168 262ecfed 2005-08-31 devnull }
169 262ecfed 2005-08-31 devnull getack(printerfd, 4);
170 262ecfed 2005-08-31 devnull }
171 262ecfed 2005-08-31 devnull
172 262ecfed 2005-08-31 devnull /* send data file */
173 262ecfed 2005-08-31 devnull void
174 262ecfed 2005-08-31 devnull senddata(int inputfd, int printerfd, long size) {
175 262ecfed 2005-08-31 devnull int strlength;
176 262ecfed 2005-08-31 devnull
177 262ecfed 2005-08-31 devnull sprintf(strbuf, "%c%ld dfA%3.3d%s\n", '\3', size, seqno, hostname);
178 262ecfed 2005-08-31 devnull strlength = strlen(strbuf);
179 262ecfed 2005-08-31 devnull if (write(printerfd, strbuf, strlength) != strlength) {
180 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
181 262ecfed 2005-08-31 devnull exit(1);
182 262ecfed 2005-08-31 devnull }
183 262ecfed 2005-08-31 devnull getack(printerfd, 5);
184 262ecfed 2005-08-31 devnull if (!copyfile(inputfd, printerfd, size)) {
185 262ecfed 2005-08-31 devnull fprintf(stderr, "failed to send file to printer\n");
186 262ecfed 2005-08-31 devnull exit(1);
187 262ecfed 2005-08-31 devnull }
188 262ecfed 2005-08-31 devnull if (write(printerfd, "\0", 1) != 1) {
189 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
190 262ecfed 2005-08-31 devnull exit(1);
191 262ecfed 2005-08-31 devnull }
192 262ecfed 2005-08-31 devnull fprintf(stderr, "%ld bytes sent, status: waiting for end of job\n", size);
193 262ecfed 2005-08-31 devnull getack(printerfd, 6);
194 262ecfed 2005-08-31 devnull }
195 262ecfed 2005-08-31 devnull
196 262ecfed 2005-08-31 devnull void
197 262ecfed 2005-08-31 devnull sendjob(int inputfd, int printerfd) {
198 262ecfed 2005-08-31 devnull struct stat statbuf;
199 262ecfed 2005-08-31 devnull int strlength;
200 262ecfed 2005-08-31 devnull
201 262ecfed 2005-08-31 devnull if (fstat(inputfd, &statbuf) < 0) {
202 262ecfed 2005-08-31 devnull fprintf(stderr, "fstat(%s) failed\n", inputname);
203 262ecfed 2005-08-31 devnull exit(1);
204 262ecfed 2005-08-31 devnull }
205 262ecfed 2005-08-31 devnull sprintf(strbuf, "%c%s\n", '\2', printername);
206 262ecfed 2005-08-31 devnull strlength = strlen(strbuf);
207 262ecfed 2005-08-31 devnull if (write(printerfd, strbuf, strlength) != strlength) {
208 262ecfed 2005-08-31 devnull fprintf(stderr, "write(printer) error\n");
209 262ecfed 2005-08-31 devnull exit(1);
210 262ecfed 2005-08-31 devnull }
211 262ecfed 2005-08-31 devnull getack(printerfd, 2);
212 262ecfed 2005-08-31 devnull debug("send data\n");
213 262ecfed 2005-08-31 devnull senddata(inputfd, printerfd, statbuf.st_size);
214 262ecfed 2005-08-31 devnull debug("send control info\n");
215 262ecfed 2005-08-31 devnull sendctrl(printerfd);
216 262ecfed 2005-08-31 devnull fprintf(stderr, "%ld bytes sent, status: end of job\n", (long)statbuf.st_size);
217 262ecfed 2005-08-31 devnull }
218 262ecfed 2005-08-31 devnull
219 262ecfed 2005-08-31 devnull /*
220 262ecfed 2005-08-31 devnull * make an address, add the defaults
221 262ecfed 2005-08-31 devnull */
222 262ecfed 2005-08-31 devnull char *
223 262ecfed 2005-08-31 devnull netmkaddr(char *linear, char *defnet, char *defsrv)
224 262ecfed 2005-08-31 devnull {
225 262ecfed 2005-08-31 devnull static char addr[512];
226 262ecfed 2005-08-31 devnull char *cp;
227 262ecfed 2005-08-31 devnull
228 262ecfed 2005-08-31 devnull /*
229 262ecfed 2005-08-31 devnull * dump network name
230 262ecfed 2005-08-31 devnull */
231 262ecfed 2005-08-31 devnull cp = strchr(linear, '!');
232 262ecfed 2005-08-31 devnull if(cp == 0){
233 262ecfed 2005-08-31 devnull if(defnet==0){
234 262ecfed 2005-08-31 devnull if(defsrv)
235 262ecfed 2005-08-31 devnull sprintf(addr, "net!%s!%s", linear, defsrv);
236 262ecfed 2005-08-31 devnull else
237 262ecfed 2005-08-31 devnull sprintf(addr, "net!%s", linear);
238 262ecfed 2005-08-31 devnull }
239 262ecfed 2005-08-31 devnull else {
240 262ecfed 2005-08-31 devnull if(defsrv)
241 262ecfed 2005-08-31 devnull sprintf(addr, "%s!%s!%s", defnet, linear, defsrv);
242 262ecfed 2005-08-31 devnull else
243 262ecfed 2005-08-31 devnull sprintf(addr, "%s!%s", defnet, linear);
244 262ecfed 2005-08-31 devnull }
245 262ecfed 2005-08-31 devnull return addr;
246 262ecfed 2005-08-31 devnull }
247 262ecfed 2005-08-31 devnull
248 262ecfed 2005-08-31 devnull /*
249 262ecfed 2005-08-31 devnull * if there is already a service, use it
250 262ecfed 2005-08-31 devnull */
251 262ecfed 2005-08-31 devnull cp = strchr(cp+1, '!');
252 262ecfed 2005-08-31 devnull if(cp)
253 262ecfed 2005-08-31 devnull return linear;
254 262ecfed 2005-08-31 devnull
255 262ecfed 2005-08-31 devnull /*
256 262ecfed 2005-08-31 devnull * add default service
257 262ecfed 2005-08-31 devnull */
258 262ecfed 2005-08-31 devnull if(defsrv == 0)
259 262ecfed 2005-08-31 devnull return linear;
260 262ecfed 2005-08-31 devnull sprintf(addr, "%s!%s", linear, defsrv);
261 262ecfed 2005-08-31 devnull
262 262ecfed 2005-08-31 devnull return addr;
263 262ecfed 2005-08-31 devnull }
264 262ecfed 2005-08-31 devnull
265 262ecfed 2005-08-31 devnull void
266 262ecfed 2005-08-31 devnull main(int argc, char *argv[]) {
267 262ecfed 2005-08-31 devnull int c, usgflg = 0;
268 262ecfed 2005-08-31 devnull char *desthostname;
269 262ecfed 2005-08-31 devnull int printerfd;
270 262ecfed 2005-08-31 devnull int inputfd;
271 262ecfed 2005-08-31 devnull int sendport;
272 262ecfed 2005-08-31 devnull char portstr[4];
273 262ecfed 2005-08-31 devnull
274 262ecfed 2005-08-31 devnull desthostname = nil;
275 262ecfed 2005-08-31 devnull if (signal(SIGALRM, alarmhandler) == SIG_ERR) {
276 262ecfed 2005-08-31 devnull fprintf(stderr, "failed to set alarm handler\n");
277 262ecfed 2005-08-31 devnull exit(1);
278 262ecfed 2005-08-31 devnull }
279 262ecfed 2005-08-31 devnull while ((c = getopt(argc, argv, "Dd:k:qs:t:H:P:")) != -1)
280 262ecfed 2005-08-31 devnull switch (c) {
281 262ecfed 2005-08-31 devnull case 'D':
282 262ecfed 2005-08-31 devnull debugflag = 1;
283 262ecfed 2005-08-31 devnull debug("debugging on\n");
284 262ecfed 2005-08-31 devnull break;
285 262ecfed 2005-08-31 devnull case 'd':
286 262ecfed 2005-08-31 devnull printername = optarg;
287 262ecfed 2005-08-31 devnull break;
288 262ecfed 2005-08-31 devnull case 'k':
289 262ecfed 2005-08-31 devnull if (statflag) {
290 262ecfed 2005-08-31 devnull fprintf(stderr, "cannot have both -k and -q flags\n");
291 262ecfed 2005-08-31 devnull exit(1);
292 fa325e9b 2020-01-10 cross }
293 262ecfed 2005-08-31 devnull killflag = 1;
294 262ecfed 2005-08-31 devnull killarg = optarg;
295 262ecfed 2005-08-31 devnull break;
296 262ecfed 2005-08-31 devnull case 'q':
297 262ecfed 2005-08-31 devnull if (killflag) {
298 262ecfed 2005-08-31 devnull fprintf(stderr, "cannot have both -q and -k flags\n");
299 262ecfed 2005-08-31 devnull exit(1);
300 fa325e9b 2020-01-10 cross }
301 262ecfed 2005-08-31 devnull statflag = 1;
302 262ecfed 2005-08-31 devnull break;
303 262ecfed 2005-08-31 devnull case 's':
304 262ecfed 2005-08-31 devnull seqno = strtol(optarg, NULL, 10);
305 262ecfed 2005-08-31 devnull if (seqno < 0 || seqno > 999)
306 262ecfed 2005-08-31 devnull seqno = 0;
307 262ecfed 2005-08-31 devnull break;
308 262ecfed 2005-08-31 devnull case 't':
309 262ecfed 2005-08-31 devnull switch (filetype) {
310 262ecfed 2005-08-31 devnull case 'c':
311 262ecfed 2005-08-31 devnull case 'd':
312 262ecfed 2005-08-31 devnull case 'f':
313 262ecfed 2005-08-31 devnull case 'g':
314 262ecfed 2005-08-31 devnull case 'l':
315 262ecfed 2005-08-31 devnull case 'n':
316 262ecfed 2005-08-31 devnull case 'o':
317 262ecfed 2005-08-31 devnull case 'p':
318 262ecfed 2005-08-31 devnull case 'r':
319 262ecfed 2005-08-31 devnull case 't':
320 262ecfed 2005-08-31 devnull case 'v':
321 262ecfed 2005-08-31 devnull case 'z':
322 262ecfed 2005-08-31 devnull filetype = optarg[0];
323 262ecfed 2005-08-31 devnull break;
324 262ecfed 2005-08-31 devnull default:
325 262ecfed 2005-08-31 devnull usgflg++;
326 262ecfed 2005-08-31 devnull break;
327 262ecfed 2005-08-31 devnull }
328 262ecfed 2005-08-31 devnull break;
329 262ecfed 2005-08-31 devnull case 'H':
330 262ecfed 2005-08-31 devnull strncpy(hostname, optarg, MAXHOSTNAMELEN);
331 262ecfed 2005-08-31 devnull break;
332 262ecfed 2005-08-31 devnull case 'P':
333 262ecfed 2005-08-31 devnull username = optarg;
334 262ecfed 2005-08-31 devnull break;
335 262ecfed 2005-08-31 devnull default:
336 262ecfed 2005-08-31 devnull case '?':
337 262ecfed 2005-08-31 devnull fprintf(stderr, "unknown option %c\n", c);
338 262ecfed 2005-08-31 devnull usgflg++;
339 262ecfed 2005-08-31 devnull }
340 262ecfed 2005-08-31 devnull if (argc < 2) usgflg++;
341 262ecfed 2005-08-31 devnull if (optind < argc) {
342 262ecfed 2005-08-31 devnull desthostname = argv[optind++];
343 262ecfed 2005-08-31 devnull } else
344 262ecfed 2005-08-31 devnull usgflg++;
345 262ecfed 2005-08-31 devnull if (usgflg) {
346 262ecfed 2005-08-31 devnull fprintf(stderr, "usage: to send a job - %s -d printer -H hostname -P username [-s seqno] [-t[cdfgklnoprtvz]] desthost [filename]\n", argv[0]);
347 262ecfed 2005-08-31 devnull fprintf(stderr, " to check status - %s -d printer -q desthost\n", argv[0]);
348 262ecfed 2005-08-31 devnull fprintf(stderr, " to kill a job - %s -d printer -P username -k jobname desthost\n", argv[0]);
349 262ecfed 2005-08-31 devnull exit(1);
350 262ecfed 2005-08-31 devnull }
351 262ecfed 2005-08-31 devnull
352 262ecfed 2005-08-31 devnull /* make sure the file to send is here and ready
353 262ecfed 2005-08-31 devnull * otherwise the TCP connection times out.
354 262ecfed 2005-08-31 devnull */
355 262ecfed 2005-08-31 devnull inputfd = -1;
356 262ecfed 2005-08-31 devnull if (!statflag && !killflag) {
357 262ecfed 2005-08-31 devnull if (optind < argc) {
358 262ecfed 2005-08-31 devnull inputname = argv[optind++];
359 262ecfed 2005-08-31 devnull debug("open("); debug(inputname); debug(")\n");
360 262ecfed 2005-08-31 devnull inputfd = open(inputname, O_RDONLY);
361 262ecfed 2005-08-31 devnull if (inputfd < 0) {
362 262ecfed 2005-08-31 devnull fprintf(stderr, "open(%s) failed\n", inputname);
363 262ecfed 2005-08-31 devnull exit(1);
364 262ecfed 2005-08-31 devnull }
365 262ecfed 2005-08-31 devnull } else {
366 262ecfed 2005-08-31 devnull inputname = "stdin";
367 262ecfed 2005-08-31 devnull tmpnam(tmpfilename);
368 262ecfed 2005-08-31 devnull debug("using stdin\n");
369 262ecfed 2005-08-31 devnull if ((inputfd = create(tmpfilename, ORDWR, 0600)) < 0) {
370 262ecfed 2005-08-31 devnull fprintf(stderr, "open(%s) failed\n", tmpfilename);
371 262ecfed 2005-08-31 devnull exit(1);
372 262ecfed 2005-08-31 devnull }
373 262ecfed 2005-08-31 devnull atexit(cleanup);
374 262ecfed 2005-08-31 devnull debug("copy input to temp file ");
375 262ecfed 2005-08-31 devnull debug(tmpfilename);
376 262ecfed 2005-08-31 devnull debug("\n");
377 262ecfed 2005-08-31 devnull if (!copyfile(0, inputfd, 0L)) {
378 262ecfed 2005-08-31 devnull fprintf(stderr, "failed to copy file to temporary file\n");
379 262ecfed 2005-08-31 devnull exit(1);
380 262ecfed 2005-08-31 devnull }
381 262ecfed 2005-08-31 devnull if (lseek(inputfd, 0L, 0) < 0) {
382 262ecfed 2005-08-31 devnull fprintf(stderr, "failed to seek back to the beginning of the temporary file\n");
383 262ecfed 2005-08-31 devnull exit(1);
384 262ecfed 2005-08-31 devnull }
385 262ecfed 2005-08-31 devnull }
386 262ecfed 2005-08-31 devnull }
387 262ecfed 2005-08-31 devnull
388 262ecfed 2005-08-31 devnull sprintf(strbuf, "%s", netmkaddr(desthostname, "tcp", "printer"));
389 262ecfed 2005-08-31 devnull fprintf(stderr, "connecting to %s\n", strbuf);
390 262ecfed 2005-08-31 devnull for (sendport=721; sendport<=731; sendport++) {
391 262ecfed 2005-08-31 devnull sprintf(portstr, "%3.3d", sendport);
392 262ecfed 2005-08-31 devnull fprintf(stderr, " trying from port %s...", portstr);
393 262ecfed 2005-08-31 devnull debug(" dial("); debug(strbuf); debug(", "); debug(portstr); debug(", 0, 0) ...");
394 262ecfed 2005-08-31 devnull printerfd = dial(strbuf, portstr, 0, 0);
395 262ecfed 2005-08-31 devnull if (printerfd >= 0) {
396 262ecfed 2005-08-31 devnull fprintf(stderr, "connected\n");
397 262ecfed 2005-08-31 devnull break;
398 262ecfed 2005-08-31 devnull }
399 262ecfed 2005-08-31 devnull fprintf(stderr, "failed\n");
400 262ecfed 2005-08-31 devnull sleep(REDIALTIMEOUT);
401 262ecfed 2005-08-31 devnull }
402 262ecfed 2005-08-31 devnull if (printerfd < 0) {
403 262ecfed 2005-08-31 devnull fprintf(stderr, "Cannot open a valid port!\n");
404 262ecfed 2005-08-31 devnull fprintf(stderr, "- All source ports [721-731] may be busy.\n");
405 262ecfed 2005-08-31 devnull fprintf(stderr, "- Is recipient ready and online?\n");
406 262ecfed 2005-08-31 devnull fprintf(stderr, "- If all else fails, cycle the power!\n");
407 262ecfed 2005-08-31 devnull exit(1);
408 262ecfed 2005-08-31 devnull }
409 262ecfed 2005-08-31 devnull /* hostname[8] = '\0'; */
410 262ecfed 2005-08-31 devnull #ifndef PLAN9
411 262ecfed 2005-08-31 devnull if (gethostname(hostname, sizeof(hostname)) < 0) {
412 262ecfed 2005-08-31 devnull perror("gethostname");
413 262ecfed 2005-08-31 devnull exit(1);
414 262ecfed 2005-08-31 devnull }
415 262ecfed 2005-08-31 devnull #endif
416 262ecfed 2005-08-31 devnull /* char *hnend;
417 262ecfed 2005-08-31 devnull if ((hnend = strchr(hostname, '.')) != NULL)
418 262ecfed 2005-08-31 devnull *hnend = '\0';
419 262ecfed 2005-08-31 devnull */
420 262ecfed 2005-08-31 devnull if (statflag) {
421 262ecfed 2005-08-31 devnull checkqueue(printerfd);
422 262ecfed 2005-08-31 devnull } else if (killflag) {
423 262ecfed 2005-08-31 devnull killjob(printerfd);
424 262ecfed 2005-08-31 devnull } else {
425 262ecfed 2005-08-31 devnull sendjob(inputfd, printerfd);
426 262ecfed 2005-08-31 devnull }
427 262ecfed 2005-08-31 devnull exit(0);
428 262ecfed 2005-08-31 devnull }