version 1.5, 2000/12/07 18:13:14 |
version 1.6, 2001/03/22 01:34:01 |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
|
#include <err.h> |
|
|
#include "extern.h" |
#include "extern.h" |
|
|
|
|
struct sockaddr_in s_in; |
struct sockaddr_in s_in; |
|
|
sp = getservbyname("tftp", "udp"); |
sp = getservbyname("tftp", "udp"); |
if (sp == 0) { |
if (sp == 0) |
fprintf(stderr, "tftp: udp/tftp: unknown service\n"); |
errx(1, "udp/tftp: unknown service"); |
exit(1); |
|
} |
|
f = socket(AF_INET, SOCK_DGRAM, 0); |
f = socket(AF_INET, SOCK_DGRAM, 0); |
if (f < 0) { |
if (f < 0) |
perror("tftp: socket"); |
err(3, "tftp: socket"); |
exit(3); |
|
} |
|
bzero((char *)&s_in, sizeof (s_in)); |
bzero((char *)&s_in, sizeof (s_in)); |
s_in.sin_family = AF_INET; |
s_in.sin_family = AF_INET; |
if (bind(f, (struct sockaddr *)&s_in, sizeof (s_in)) < 0) { |
if (bind(f, (struct sockaddr *)&s_in, sizeof (s_in)) < 0) |
perror("tftp: bind"); |
err(1, "tftp: bind"); |
exit(1); |
|
} |
|
strcpy(mode, "netascii"); |
strcpy(mode, "netascii"); |
signal(SIGINT, intr); |
signal(SIGINT, intr); |
if (argc > 1) { |
if (argc > 1) { |
|
|
setbinary(argc, argv) |
setbinary(argc, argv) |
int argc; |
int argc; |
char *argv[]; |
char *argv[]; |
{ |
{ |
|
|
settftpmode("octet"); |
settftpmode("octet"); |
} |
} |
|
|
*targ++ = 0; |
*targ++ = 0; |
hp = gethostbyname(cp); |
hp = gethostbyname(cp); |
if (hp == NULL) { |
if (hp == NULL) { |
fprintf(stderr, "tftp: %s: ", cp); |
warnx("%s: %s", cp, hstrerror(h_errno)); |
herror((char *)NULL); |
|
return; |
return; |
} |
} |
bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, hp->h_length); |
bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, hp->h_length); |
|
|
cp = argc == 2 ? tail(targ) : argv[1]; |
cp = argc == 2 ? tail(targ) : argv[1]; |
fd = open(cp, O_RDONLY); |
fd = open(cp, O_RDONLY); |
if (fd < 0) { |
if (fd < 0) { |
fprintf(stderr, "tftp: "); perror(cp); |
warn("open: %s", cp); |
return; |
return; |
} |
} |
if (verbose) |
if (verbose) |
|
|
} |
} |
/* this assumes the target is a directory */ |
/* this assumes the target is a directory */ |
/* on a remote unix system. hmmmm. */ |
/* on a remote unix system. hmmmm. */ |
cp = strchr(targ, '\0'); |
cp = strchr(targ, '\0'); |
*cp++ = '/'; |
*cp++ = '/'; |
for (n = 1; n < argc - 1; n++) { |
for (n = 1; n < argc - 1; n++) { |
strcpy(cp, tail(argv[n])); |
strcpy(cp, tail(argv[n])); |
fd = open(argv[n], O_RDONLY); |
fd = open(argv[n], O_RDONLY); |
if (fd < 0) { |
if (fd < 0) { |
fprintf(stderr, "tftp: "); perror(argv[n]); |
warn("open: %s", argv[n]); |
continue; |
continue; |
} |
} |
if (verbose) |
if (verbose) |
|
|
*src++ = 0; |
*src++ = 0; |
hp = gethostbyname(argv[n]); |
hp = gethostbyname(argv[n]); |
if (hp == NULL) { |
if (hp == NULL) { |
fprintf(stderr, "tftp: %s: ", argv[n]); |
warnx("%s: %s", argv[n], hstrerror(h_errno)); |
herror((char *)NULL); |
|
continue; |
continue; |
} |
} |
bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, |
bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, |
|
|
cp = argc == 3 ? argv[2] : tail(src); |
cp = argc == 3 ? argv[2] : tail(src); |
fd = creat(cp, 0644); |
fd = creat(cp, 0644); |
if (fd < 0) { |
if (fd < 0) { |
fprintf(stderr, "tftp: "); perror(cp); |
warn("create: %s", cp); |
return; |
return; |
} |
} |
if (verbose) |
if (verbose) |
|
|
cp = tail(src); /* new .. jdg */ |
cp = tail(src); /* new .. jdg */ |
fd = creat(cp, 0644); |
fd = creat(cp, 0644); |
if (fd < 0) { |
if (fd < 0) { |
fprintf(stderr, "tftp: "); perror(cp); |
warn("create: %s", cp); |
continue; |
continue; |
} |
} |
if (verbose) |
if (verbose) |
|
|
char *filename; |
char *filename; |
{ |
{ |
register char *s; |
register char *s; |
|
|
while (*filename) { |
while (*filename) { |
s = strrchr(filename, '/'); |
s = strrchr(filename, '/'); |
if (s == NULL) |
if (s == NULL) |