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 --- |