Hello! The tftpd test broke on Hydra[*] because the call ‘getservbyname ("tftp", "udp")’ failed there since chroot builds lack /etc/services:
--8<---------------cut here---------------start------------->8--- 170+0 records in 170+0 records out 174080 bytes (174 kB) copied, 0.00138769 s, 125 MB/s trying with address `192.168.1.19'... tftp: udp/tftp: unknown service cmp: tftp-test-file: No such file or directory ./tftp.sh: line 76: kill: (10728) - No such process FAIL: tftp.sh --8<---------------cut here---------------end--------------->8--- In fact, that call is not needed for the test since it specifies a port number when invoking ‘tftp’. The attached patch fixes ‘tftp’ so that it only tries to resolve the “tftp” service when no port was explicitly specified. Thanks, Ludo’. [*] http://hydra.nixos.org/job/gnu/inetutils-master/build
>From 19d17c06a327b728bfc443bdc1c91f5f4da579be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <l...@gnu.org> Date: Sat, 23 Oct 2010 15:57:40 +0200 Subject: [PATCH] tftp: Resolve the "tftp" service only when no port is specified. * src/tftp.c (port): Change from `short' to `int'. Add comment. (sp): Remove variable. (main): Remove `getservbyname ("tftp", "udp")'. (setpeer): Add `getservbyname ("tftp", "udp")' call for when ARGC != 3. (put, get): Refer to PORT instead of SP->s_port. --- ChangeLog | 11 +++++++++++ src/tftp.c | 36 +++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index d2f4be6..11a3e64 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2010-10-23 Ludovic Courtès <l...@gnu.org> + + tftp: Resolve the "tftp" service only when no port is specified. + + * src/tftp.c (port): Change from `short' to `int'. Add comment. + (sp): Remove variable. + (main): Remove `getservbyname ("tftp", "udp")'. + (setpeer): Add `getservbyname ("tftp", "udp")' call for when + ARGC != 3. + (put, get): Refer to PORT instead of SP->s_port. + 2010-10-19 Alfred M. Szmidt <a...@gnu.org> Added gendocs module for generation of web manual. diff --git a/src/tftp.c b/src/tftp.c index 6515976..9364cb6 100644 --- a/src/tftp.c +++ b/src/tftp.c @@ -99,11 +99,13 @@ static int maxtimeout = 5 * TIMEOUT; static struct sockaddr_in peeraddr; /* filled in by main */ static int f; /* the opened socket */ -static short port; static int trace; static int verbose; static int connected; +/* Port number in network byte order of the server. */ +static int port; + char mode[32]; char line[200]; int margc; @@ -111,7 +113,6 @@ char *margv[20]; char *prompt = "tftp"; jmp_buf toplevel; void intr (int signo); -struct servent *sp; void get (int, char **); void help (int, char **); @@ -226,12 +227,6 @@ main (int argc, char *argv[]) iu_argp_init ("tftp", default_program_authors); argp_parse (&argp, argc, argv, 0, NULL, NULL); - sp = getservbyname ("tftp", "udp"); - if (sp == 0) - { - fprintf (stderr, "tftp: udp/tftp: unknown service\n"); - exit (EXIT_FAILURE); - } f = socket (AF_INET, SOCK_DGRAM, 0); if (f < 0) { @@ -345,9 +340,9 @@ setpeer (int argc, char *argv[]) hostname = xstrdup (argv[1]); } - port = sp->s_port; if (argc == 3) { + /* Take the user-specified port number. */ port = atoi (argv[2]); if (port < 0) { @@ -357,6 +352,21 @@ setpeer (int argc, char *argv[]) } port = htons (port); } + else + { + /* Use the standard TFTP port. */ + struct servent *sp; + + sp = getservbyname ("tftp", "udp"); + if (sp == 0) + { + fprintf (stderr, "tftp: udp/tftp: unknown service\n"); + exit (EXIT_FAILURE); + } + + port = sp->s_port; + } + connected = 1; } @@ -483,7 +493,7 @@ put (int argc, char *argv[]) } if (verbose) printf ("putting %s to %s:%s [%s]\n", cp, hostname, targ, mode); - peeraddr.sin_port = port ? port : sp->s_port; + peeraddr.sin_port = port; send_file (fd, targ, mode); return; } @@ -503,7 +513,7 @@ put (int argc, char *argv[]) } if (verbose) printf ("putting %s to %s:%s [%s]\n", argv[n], hostname, targ, mode); - peeraddr.sin_port = port ? port : sp->s_port; + peeraddr.sin_port = port; send_file (fd, targ, mode); } } @@ -568,7 +578,7 @@ get (int argc, char *argv[]) if (verbose) printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode); - peeraddr.sin_port = port ? port : sp->s_port; + peeraddr.sin_port = port; recvfile (fd, src, mode); break; } @@ -582,7 +592,7 @@ get (int argc, char *argv[]) } if (verbose) printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode); - peeraddr.sin_port = port ? port : sp->s_port; + peeraddr.sin_port = port; recvfile (fd, src, mode); } } -- 1.7.0