Deleted Added
full compact
main.c (92922) main.c (94443)
1/*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 30 unchanged lines hidden (view full) ---

39
40#if 0
41#ifndef lint
42static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
43#endif
44#endif
45
46#include <sys/cdefs.h>
1/*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 30 unchanged lines hidden (view full) ---

39
40#if 0
41#ifndef lint
42static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
43#endif
44#endif
45
46#include <sys/cdefs.h>
47__FBSDID("$FreeBSD: head/usr.bin/tftp/main.c 92922 2002-03-22 01:42:45Z imp $");
47__FBSDID("$FreeBSD: head/usr.bin/tftp/main.c 94443 2002-04-11 17:14:22Z ume $");
48
49/* Many bug fixes are from Jim Guyton <guyton@rand-unix> */
50
51/*
52 * TFTP User Program -- Command Interface.
53 */
54#include <sys/param.h>
55#include <sys/types.h>

--- 16 unchanged lines hidden (view full) ---

72#include <string.h>
73#include <unistd.h>
74
75#include "extern.h"
76
77#define MAXLINE 200
78#define TIMEOUT 5 /* secs between rexmt's */
79
48
49/* Many bug fixes are from Jim Guyton <guyton@rand-unix> */
50
51/*
52 * TFTP User Program -- Command Interface.
53 */
54#include <sys/param.h>
55#include <sys/types.h>

--- 16 unchanged lines hidden (view full) ---

72#include <string.h>
73#include <unistd.h>
74
75#include "extern.h"
76
77#define MAXLINE 200
78#define TIMEOUT 5 /* secs between rexmt's */
79
80struct sockaddr_in peeraddr;
80struct sockaddr_storage peeraddr;
81int f;
81int f;
82short port;
83int trace;
84int verbose;
85int connected;
86char mode[32];
87char line[MAXLINE];
88int margc;
89char *margv[20];
90jmp_buf toplevel;
82int trace;
83int verbose;
84int connected;
85char mode[32];
86char line[MAXLINE];
87int margc;
88char *margv[20];
89jmp_buf toplevel;
91struct servent *sp;
92
93void get(int, char **);
94void help(int, char **);
95void intr(int);
96void modecmd(int, char **);
97void put(int, char **);
98void quit(int, char **);
99void setascii(int, char **);
100void setbinary(int, char **);
90
91void get(int, char **);
92void help(int, char **);
93void intr(int);
94void modecmd(int, char **);
95void put(int, char **);
96void quit(int, char **);
97void setascii(int, char **);
98void setbinary(int, char **);
99void setpeer0(char *, char *);
101void setpeer(int, char **);
102void setrexmt(int, char **);
103void settimeout(int, char **);
104void settrace(int, char **);
105void setverbose(int, char **);
106void status(int, char **);
107
108static void command(void) __dead2;

--- 46 unchanged lines hidden (view full) ---

155 { NULL, NULL, NULL }
156};
157
158int
159main(argc, argv)
160 int argc;
161 char *argv[];
162{
100void setpeer(int, char **);
101void setrexmt(int, char **);
102void settimeout(int, char **);
103void settrace(int, char **);
104void setverbose(int, char **);
105void status(int, char **);
106
107static void command(void) __dead2;

--- 46 unchanged lines hidden (view full) ---

154 { NULL, NULL, NULL }
155};
156
157int
158main(argc, argv)
159 int argc;
160 char *argv[];
161{
163 struct sockaddr_in lsin;
164
165 sp = getservbyname("tftp", "udp");
166 if (sp == 0)
167 errx(1, "udp/tftp: unknown service");
168 f = socket(AF_INET, SOCK_DGRAM, 0);
169 if (f < 0)
170 err(3, "socket");
171 bzero((char *)&lsin, sizeof(lsin));
172 lsin.sin_family = AF_INET;
173 if (bind(f, (struct sockaddr *)&lsin, sizeof(lsin)) < 0)
174 err(1, "bind");
162 f = -1;
175 strcpy(mode, "netascii");
176 signal(SIGINT, intr);
177 if (argc > 1) {
178 if (setjmp(toplevel) != 0)
179 exit(0);
180 setpeer(argc, argv);
181 }
182 if (setjmp(toplevel) != 0)
183 (void)putchar('\n');
184 command();
185}
186
187char hostname[MAXHOSTNAMELEN];
188
189void
163 strcpy(mode, "netascii");
164 signal(SIGINT, intr);
165 if (argc > 1) {
166 if (setjmp(toplevel) != 0)
167 exit(0);
168 setpeer(argc, argv);
169 }
170 if (setjmp(toplevel) != 0)
171 (void)putchar('\n');
172 command();
173}
174
175char hostname[MAXHOSTNAMELEN];
176
177void
178setpeer0(host, port)
179 char *host;
180 char *port;
181{
182 struct addrinfo hints, *res0, *res;
183 int error;
184 struct sockaddr_storage ss;
185 char *cause = "unknown";
186
187 if (connected) {
188 close(f);
189 f = -1;
190 }
191 connected = 0;
192
193 memset(&hints, 0, sizeof(hints));
194 hints.ai_family = PF_UNSPEC;
195 hints.ai_socktype = SOCK_DGRAM;
196 hints.ai_protocol = IPPROTO_UDP;
197 hints.ai_flags = AI_CANONNAME;
198 if (!port)
199 port = "tftp";
200 error = getaddrinfo(host, port, &hints, &res0);
201 if (error) {
202 warnx("%s", gai_strerror(error));
203 return;
204 }
205
206 for (res = res0; res; res = res->ai_next) {
207 if (res->ai_addrlen > sizeof(peeraddr))
208 continue;
209 f = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
210 if (f < 0) {
211 cause = "socket";
212 continue;
213 }
214
215 memset(&ss, 0, sizeof(ss));
216 ss.ss_family = res->ai_family;
217 ss.ss_len = res->ai_addrlen;
218 if (bind(f, (struct sockaddr *)&ss, ss.ss_len) < 0) {
219 cause = "bind";
220 close(f);
221 f = -1;
222 continue;
223 }
224
225 break;
226 }
227
228 if (f < 0)
229 warn("%s", cause);
230 else {
231 /* res->ai_addr <= sizeof(peeraddr) is guaranteed */
232 memcpy(&peeraddr, res->ai_addr, res->ai_addrlen);
233 if (res->ai_canonname) {
234 (void) strncpy(hostname, res->ai_canonname,
235 sizeof(hostname));
236 } else
237 (void) strncpy(hostname, host, sizeof(hostname));
238 hostname[sizeof(hostname)-1] = 0;
239 connected = 1;
240 }
241
242 freeaddrinfo(res0);
243}
244
245void
190setpeer(argc, argv)
191 int argc;
192 char *argv[];
193{
246setpeer(argc, argv)
247 int argc;
248 char *argv[];
249{
194 struct hostent *host;
195
196 if (argc < 2) {
197 strcpy(line, "Connect ");
198 printf("(to) ");
199 fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
200 makeargv();
201 argc = margc;
202 argv = margv;
203 }
204 if ((argc < 2) || (argc > 3)) {
205 printf("usage: %s host-name [port]\n", argv[0]);
206 return;
207 }
250
251 if (argc < 2) {
252 strcpy(line, "Connect ");
253 printf("(to) ");
254 fgets(&line[strlen(line)], sizeof line - strlen(line), stdin);
255 makeargv();
256 argc = margc;
257 argv = margv;
258 }
259 if ((argc < 2) || (argc > 3)) {
260 printf("usage: %s host-name [port]\n", argv[0]);
261 return;
262 }
208 host = gethostbyname(argv[1]);
209 if (host) {
210 peeraddr.sin_family = host->h_addrtype;
211 bcopy(host->h_addr, &peeraddr.sin_addr,
212 MIN(sizeof(peeraddr.sin_addr), (size_t)host->h_length));
213 strncpy(hostname, host->h_name, sizeof(hostname));
214 } else {
215 peeraddr.sin_family = AF_INET;
216 peeraddr.sin_addr.s_addr = inet_addr(argv[1]);
217 if (peeraddr.sin_addr.s_addr == INADDR_NONE) {
218 connected = 0;
219 printf("%s: unknown host\n", argv[1]);
220 return;
221 }
222 strncpy(hostname, argv[1], sizeof(hostname));
223 }
224 hostname[sizeof(hostname) - 1] = '\0';
225 port = sp->s_port;
226 if (argc == 3) {
227 port = atoi(argv[2]);
228 if (port < 0) {
229 printf("%s: bad port number\n", argv[2]);
230 connected = 0;
231 return;
232 }
233 port = htons(port);
234 }
235 connected = 1;
263 if (argc == 3)
264 setpeer0(argv[1], NULL);
265 else
266 setpeer0(argv[1], argv[2]);
236}
237
238struct modes {
239 const char *m_name;
240 const char *m_mode;
241} modes[] = {
242 { "ascii", "netascii" },
243 { "netascii", "netascii" },

--- 87 unchanged lines hidden (view full) ---

331 argc = margc;
332 argv = margv;
333 }
334 if (argc < 2) {
335 putusage(argv[0]);
336 return;
337 }
338 targ = argv[argc - 1];
267}
268
269struct modes {
270 const char *m_name;
271 const char *m_mode;
272} modes[] = {
273 { "ascii", "netascii" },
274 { "netascii", "netascii" },

--- 87 unchanged lines hidden (view full) ---

362 argc = margc;
363 argv = margv;
364 }
365 if (argc < 2) {
366 putusage(argv[0]);
367 return;
368 }
369 targ = argv[argc - 1];
339 if (index(argv[argc - 1], ':')) {
370 if (rindex(argv[argc - 1], ':')) {
340 char *lcp;
371 char *lcp;
341 struct hostent *hp;
342
343 for (n = 1; n < argc - 1; n++)
344 if (index(argv[n], ':')) {
345 putusage(argv[0]);
346 return;
347 }
348 lcp = argv[argc - 1];
372
373 for (n = 1; n < argc - 1; n++)
374 if (index(argv[n], ':')) {
375 putusage(argv[0]);
376 return;
377 }
378 lcp = argv[argc - 1];
349 targ = index(lcp, ':');
379 targ = rindex(lcp, ':');
350 *targ++ = 0;
380 *targ++ = 0;
351 hp = gethostbyname(lcp);
352 if (hp == NULL) {
353 fprintf(stderr, "tftp: %s: ", lcp);
354 herror((char *)NULL);
355 return;
381 if (lcp[0] == '[' && lcp[strlen(lcp) - 1] == ']') {
382 lcp[strlen(lcp) - 1] = '\0';
383 lcp++;
356 }
384 }
357 bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr,
358 MIN(sizeof(peeraddr.sin_addr), (size_t)hp->h_length));
359 peeraddr.sin_family = hp->h_addrtype;
360 connected = 1;
361 strncpy(hostname, hp->h_name, sizeof(hostname));
362 hostname[sizeof(hostname) - 1] = '\0';
385 setpeer0(lcp, NULL);
363 }
364 if (!connected) {
365 printf("No target machine specified.\n");
366 return;
367 }
368 if (argc < 4) {
369 cp = argc == 2 ? tail(targ) : argv[1];
370 fd = open(cp, O_RDONLY);
371 if (fd < 0) {
372 warn("%s", cp);
373 return;
374 }
375 if (verbose)
376 printf("putting %s to %s:%s [%s]\n",
377 cp, hostname, targ, mode);
386 }
387 if (!connected) {
388 printf("No target machine specified.\n");
389 return;
390 }
391 if (argc < 4) {
392 cp = argc == 2 ? tail(targ) : argv[1];
393 fd = open(cp, O_RDONLY);
394 if (fd < 0) {
395 warn("%s", cp);
396 return;
397 }
398 if (verbose)
399 printf("putting %s to %s:%s [%s]\n",
400 cp, hostname, targ, mode);
378 peeraddr.sin_port = port;
379 xmitfile(fd, targ, mode);
380 return;
381 }
382 /* this assumes the target is a directory */
383 /* on a remote unix system. hmmmm. */
384 cp = index(targ, '\0');
385 *cp++ = '/';
386 for (n = 1; n < argc - 1; n++) {
387 strcpy(cp, tail(argv[n]));
388 fd = open(argv[n], O_RDONLY);
389 if (fd < 0) {
390 warn("%s", argv[n]);
391 continue;
392 }
393 if (verbose)
394 printf("putting %s to %s:%s [%s]\n",
395 argv[n], hostname, targ, mode);
401 xmitfile(fd, targ, mode);
402 return;
403 }
404 /* this assumes the target is a directory */
405 /* on a remote unix system. hmmmm. */
406 cp = index(targ, '\0');
407 *cp++ = '/';
408 for (n = 1; n < argc - 1; n++) {
409 strcpy(cp, tail(argv[n]));
410 fd = open(argv[n], O_RDONLY);
411 if (fd < 0) {
412 warn("%s", argv[n]);
413 continue;
414 }
415 if (verbose)
416 printf("putting %s to %s:%s [%s]\n",
417 argv[n], hostname, targ, mode);
396 peeraddr.sin_port = port;
397 xmitfile(fd, targ, mode);
398 }
399}
400
401static void
402putusage(s)
403 char *s;
404{

--- 23 unchanged lines hidden (view full) ---

428 argv = margv;
429 }
430 if (argc < 2) {
431 getusage(argv[0]);
432 return;
433 }
434 if (!connected) {
435 for (n = 1; n < argc ; n++)
418 xmitfile(fd, targ, mode);
419 }
420}
421
422static void
423putusage(s)
424 char *s;
425{

--- 23 unchanged lines hidden (view full) ---

449 argv = margv;
450 }
451 if (argc < 2) {
452 getusage(argv[0]);
453 return;
454 }
455 if (!connected) {
456 for (n = 1; n < argc ; n++)
436 if (index(argv[n], ':') == 0) {
457 if (rindex(argv[n], ':') == 0) {
437 getusage(argv[0]);
438 return;
439 }
440 }
441 for (n = 1; n < argc ; n++) {
458 getusage(argv[0]);
459 return;
460 }
461 }
462 for (n = 1; n < argc ; n++) {
442 src = index(argv[n], ':');
463 src = rindex(argv[n], ':');
443 if (src == NULL)
444 src = argv[n];
445 else {
464 if (src == NULL)
465 src = argv[n];
466 else {
446 struct hostent *hp;
467 char *lcp;
447
448 *src++ = 0;
468
469 *src++ = 0;
449 hp = gethostbyname(argv[n]);
450 if (hp == NULL) {
451 fprintf(stderr, "tftp: %s: ", argv[n]);
452 herror((char *)NULL);
453 continue;
470 lcp = argv[n];
471 if (lcp[0] == '[' && lcp[strlen(lcp) - 1] == ']') {
472 lcp[strlen(lcp) - 1] = '\0';
473 lcp++;
454 }
474 }
455 bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr,
456 MIN(sizeof(peeraddr.sin_addr), (size_t)hp->h_length));
457 peeraddr.sin_family = hp->h_addrtype;
458 connected = 1;
459 strncpy(hostname, hp->h_name, sizeof(hostname));
460 hostname[sizeof(hostname) - 1] = '\0';
475 setpeer0(lcp, NULL);
476 if (!connected)
477 continue;
461 }
462 if (argc < 4) {
463 cp = argc == 3 ? argv[2] : tail(src);
464 fd = creat(cp, 0644);
465 if (fd < 0) {
466 warn("%s", cp);
467 return;
468 }
469 if (verbose)
470 printf("getting from %s:%s to %s [%s]\n",
471 hostname, src, cp, mode);
478 }
479 if (argc < 4) {
480 cp = argc == 3 ? argv[2] : tail(src);
481 fd = creat(cp, 0644);
482 if (fd < 0) {
483 warn("%s", cp);
484 return;
485 }
486 if (verbose)
487 printf("getting from %s:%s to %s [%s]\n",
488 hostname, src, cp, mode);
472 peeraddr.sin_port = port;
473 recvfile(fd, src, mode);
474 break;
475 }
476 cp = tail(src); /* new .. jdg */
477 fd = creat(cp, 0644);
478 if (fd < 0) {
479 warn("%s", cp);
480 continue;
481 }
482 if (verbose)
483 printf("getting from %s:%s to %s [%s]\n",
484 hostname, src, cp, mode);
489 recvfile(fd, src, mode);
490 break;
491 }
492 cp = tail(src); /* new .. jdg */
493 fd = creat(cp, 0644);
494 if (fd < 0) {
495 warn("%s", cp);
496 continue;
497 }
498 if (verbose)
499 printf("getting from %s:%s to %s [%s]\n",
500 hostname, src, cp, mode);
485 peeraddr.sin_port = port;
486 recvfile(fd, src, mode);
487 }
488}
489
490static void
491getusage(s)
492 char *s;
493{

--- 283 unchanged lines hidden ---
501 recvfile(fd, src, mode);
502 }
503}
504
505static void
506getusage(s)
507 char *s;
508{

--- 283 unchanged lines hidden ---