forked from mirrors/tftp-hpa-google
Support running the TFTP client from the command line
This commit is contained in:
parent
cabc969c25
commit
8796832723
3 changed files with 108 additions and 57 deletions
5
CHANGES
5
CHANGES
|
@ -7,6 +7,11 @@ Changes in 0.33:
|
||||||
|
|
||||||
Configuration fix: readline needs termcap.
|
Configuration fix: readline needs termcap.
|
||||||
|
|
||||||
|
Support running the tftp client from the command line. For
|
||||||
|
example:
|
||||||
|
|
||||||
|
tftp -m binary -c get hostname:file
|
||||||
|
|
||||||
|
|
||||||
Changes in 0.32:
|
Changes in 0.32:
|
||||||
Better error messages; including the capability to send a
|
Better error messages; including the capability to send a
|
||||||
|
|
60
tftp/main.c
60
tftp/main.c
|
@ -187,12 +187,15 @@ int
|
||||||
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct sockaddr_in s_in;
|
struct sockaddr_in s_in;
|
||||||
int c;
|
int o;
|
||||||
int pargc;
|
int pargc;
|
||||||
|
int iscmd = 0;
|
||||||
char **pargv;
|
char **pargv;
|
||||||
|
|
||||||
while ((c = getopt(argc, argv, "Vv")) != -1) {
|
mode = MODE_DEFAULT;
|
||||||
switch (c) {
|
|
||||||
|
while ((o = getopt(argc, argv, "chm:Vv")) != -1) {
|
||||||
|
switch (o) {
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = 1;
|
verbose = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -200,11 +203,31 @@ main(int argc, char *argv[])
|
||||||
/* Print version and configuration to stdout and exit */
|
/* Print version and configuration to stdout and exit */
|
||||||
printf("%s\n", TFTP_CONFIG_STR);
|
printf("%s\n", TFTP_CONFIG_STR);
|
||||||
exit(0);
|
exit(0);
|
||||||
default:
|
case 'm':
|
||||||
fprintf(stderr, "Usage: %s [-v] [host]\n", argv[0]);
|
{
|
||||||
|
const struct modes *p;
|
||||||
|
|
||||||
|
for ( p = modes ; p->m_name ; p++ ) {
|
||||||
|
if (!strcmp(optarg, p->m_name))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (p->m_name) {
|
||||||
|
settftpmode(p);
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "%s: invalid mode: %s\n", argv[0], optarg);
|
||||||
exit(EX_USAGE);
|
exit(EX_USAGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
iscmd = 1;
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Usage: %s [-v][-m mode] [-c command|host]\n", argv[0]);
|
||||||
|
exit(o == 'h' ? 0 : EX_USAGE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pargc = argc - (optind-1);
|
pargc = argc - (optind-1);
|
||||||
pargv = argv + (optind-1);
|
pargv = argv + (optind-1);
|
||||||
|
@ -212,32 +235,49 @@ main(int argc, char *argv[])
|
||||||
sp = getservbyname("tftp", "udp");
|
sp = getservbyname("tftp", "udp");
|
||||||
if (sp == 0) {
|
if (sp == 0) {
|
||||||
/* Use canned values */
|
/* Use canned values */
|
||||||
|
if (verbose)
|
||||||
fprintf(stderr, "tftp: tftp/udp: unknown service, faking it...\n");
|
fprintf(stderr, "tftp: tftp/udp: unknown service, faking it...\n");
|
||||||
sp = xmalloc(sizeof(struct servent));
|
sp = xmalloc(sizeof(struct servent));
|
||||||
sp->s_name = (char *)"tftp";
|
sp->s_name = (char *)"tftp";
|
||||||
sp->s_aliases = NULL;
|
sp->s_aliases = NULL;
|
||||||
sp->s_port = htons(IPPORT_TFTP);
|
sp->s_port = htons(IPPORT_TFTP);
|
||||||
sp->s_proto = (char *)"udp";
|
sp->s_proto = (char *)"udp";
|
||||||
exit(1);
|
|
||||||
}
|
}
|
||||||
|
port = sp->s_port; /* Default port */
|
||||||
f = socket(AF_INET, SOCK_DGRAM, 0);
|
f = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (f < 0) {
|
if (f < 0) {
|
||||||
perror("tftp: socket");
|
perror("tftp: socket");
|
||||||
exit(3);
|
exit(EX_OSERR);
|
||||||
}
|
}
|
||||||
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");
|
perror("tftp: bind");
|
||||||
exit(1);
|
exit(EX_OSERR);
|
||||||
}
|
}
|
||||||
mode = MODE_DEFAULT;
|
|
||||||
bsd_signal(SIGINT, intr);
|
bsd_signal(SIGINT, intr);
|
||||||
if (pargc > 1) {
|
if (pargc > 1) {
|
||||||
|
if ( iscmd ) {
|
||||||
|
/* -c specified; execute command and exit */
|
||||||
|
struct cmd *c;
|
||||||
|
|
||||||
|
if (sigsetjmp(toplevel,1) != 0)
|
||||||
|
exit(EX_UNAVAILABLE);
|
||||||
|
|
||||||
|
c = getcmd(pargv[1]);
|
||||||
|
if ( c == (struct cmd *)-1 || c == (struct cmd *)0 ) {
|
||||||
|
fprintf(stderr, "%s: invalid command: %s\n", argv[0], pargv[1]);
|
||||||
|
exit(EX_USAGE);
|
||||||
|
}
|
||||||
|
(*c->handler)(pargc-1, pargv+1);
|
||||||
|
exit(0);
|
||||||
|
} else {
|
||||||
|
/* No -c */
|
||||||
if (sigsetjmp(toplevel,1) != 0)
|
if (sigsetjmp(toplevel,1) != 0)
|
||||||
exit(0);
|
exit(0);
|
||||||
setpeer(pargc, pargv);
|
setpeer(pargc, pargv);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (sigsetjmp(toplevel,1) != 0)
|
if (sigsetjmp(toplevel,1) != 0)
|
||||||
(void)putchar('\n');
|
(void)putchar('\n');
|
||||||
|
|
||||||
|
@ -438,7 +478,7 @@ put(int argc, char *argv[])
|
||||||
herror((char *)NULL);
|
herror((char *)NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bcopy(hp->h_addr, (caddr_t)&peeraddr.sin_addr, hp->h_length);
|
bcopy(hp->h_addr, &peeraddr.sin_addr, hp->h_length);
|
||||||
peeraddr.sin_family = hp->h_addrtype;
|
peeraddr.sin_family = hp->h_addrtype;
|
||||||
connected = 1;
|
connected = 1;
|
||||||
hostname = xstrdup(hp->h_name);
|
hostname = xstrdup(hp->h_name);
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
.\" SUCH DAMAGE.
|
.\" SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.\"----------------------------------------------------------------------- */
|
.\"----------------------------------------------------------------------- */
|
||||||
.TH TFTP 1 "13 November 2001" "tftp-hpa @@VERSION@@" "UNIX User's Manual"
|
.TH TFTP 1 "2 February 2003" "tftp-hpa @@VERSION@@" "User's Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
.B tftp
|
.B tftp
|
||||||
\- IPv4 Trivial File Transfer Protocol client
|
\- IPv4 Trivial File Transfer Protocol client
|
||||||
|
@ -55,6 +55,12 @@ as the default host for future transfers (see the
|
||||||
command below.)
|
command below.)
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
|
\fB\-c\fP \fIcommand\fP
|
||||||
|
Execute \fIcommand\fP as if it had been entered on the tftp prompt.
|
||||||
|
.TP
|
||||||
|
\fB\-m\fP \fImode\fP
|
||||||
|
Set the default transfer mode to \fImode\fP. This is usually used with \-c.
|
||||||
|
.TP
|
||||||
.B \-v
|
.B \-v
|
||||||
Default to verbose mode.
|
Default to verbose mode.
|
||||||
.TP
|
.TP
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue