Hi, Patch contains modifications as suggested.
diff --git a/ChangeLog b/ChangeLog index 325f5ef..4df07a0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ + +2009-10-10 Oliver Naylor <[email protected]> + + * ftpd/ftpd.c (argp_options, parse_opt): New option: --port, specify + port for ftpd to listen on. + (MIN_PORT): New Define. + (MAX_PORT): New Define. + * ftpd/server_mode.c (server_mode): Removed variable port. + Added new argument port. + * doc/inetutils.texi (ftpd invocation): Updated. + 2009-10-06 Rakesh Pandit <[email protected]> * ping/ping_common.h (ping_data): New member `ping_start_time'. diff --git a/NEWS b/NEWS index 30beda0..6b755c7 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ Please send inetutils bug reports to <[email protected]>. Unreleased Version 1.7: +* ftpd + +New option --port=PORT, listen for connections on port PORT + * ping New option --timeout=N, stop sending packets after N seconds. diff --git a/doc/.gitignore b/doc/.gitignore index a5ee19f..24c6478 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,6 +1,6 @@ -inetutils.info* Makefile Makefile.in fdl-1.3.texi +inetutils.info* stamp-vti version.texi diff --git a/doc/inetutils.texi b/doc/inetutils.texi index aba0c28..0ebef97 100644 --- a/doc/inetutils.texi +++ b/doc/inetutils.texi @@ -2582,6 +2582,12 @@ is 15 minutes). @opindex -u @opindex --umask Set default umask(base 8). + +...@item -P @var{port} +...@item --po...@var{port} +...@opindex -p +...@opindex --port +Set the TCP port on which ftpd will listen when running in daemon mode. @end table The file @file{/etc/nologin} can be used to disable ftp access. If diff --git a/ftpd/extern.h b/ftpd/extern.h index ce1ac8c..f116524 100644 --- a/ftpd/extern.h +++ b/ftpd/extern.h @@ -112,7 +112,7 @@ extern char tmpline[]; extern off_t restart_point; /* Exported from server_mode.c. */ -extern int server_mode (const char *pidfile, struct sockaddr_in *phis_addr); +extern int server_mode (const char *pidfile, int port, struct sockaddr_in *phis_addr); /* Credential for the request. */ struct credentials diff --git a/ftpd/ftpd.c b/ftpd/ftpd.c index 8a951cf..04c0e9c 100644 --- a/ftpd/ftpd.c +++ b/ftpd/ftpd.c @@ -1,4 +1,5 @@ -/* - Ftp Server + + /* - Ftp Server * Copyright (c) 1985, 1988, 1990, 1992, 1993, 1994 * The Regents of the University of California. All rights reserved. * @@ -166,6 +167,15 @@ static off_t file_size; static off_t byte_count; static sig_atomic_t transflag; /* Flag where in a middle of transfer. */ static const char *pid_file = PATH_FTPDPID; + +/* Listen for connections on port (--port); + -1 means use default tcp/ftp port */ +static int port = -1; + +/* TCP port range */ +#define PORT_MIN 0 +#define PORT_MAX 65535 + #if !defined(CMASK) || CMASK == 0 # undef CMASK # define CMASK 027 @@ -294,6 +304,9 @@ static struct argp_option options[] = { { " default", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, "passwd authentication", GRID+3 }, + { "port", 'P', "PORT", 0, + "listen for connections on port PORT", + GRID+1 }, #ifdef WITH_PAM { " pam", 0, NULL, OPTION_DOC|OPTION_NO_TRANS, "using pam 'ftp' module", @@ -335,7 +348,7 @@ parse_opt (int key, char *arg, struct argp_state *state) cred.auth_type = AUTH_TYPE_PAM; #endif #ifdef WITH_KERBEROS - else if (strcasecmp (arg, "kerberos") == 0) + else if (strcasecmp (arg, "kerberos") == 0) cred.auth_type = AUTH_TYPE_KERBEROS; #endif #ifdef WITH_KERBEROS5 @@ -397,6 +410,14 @@ parse_opt (int key, char *arg, struct argp_state *state) defumask = val; break; } + + case 'P': /* Set port */ + { + port = strtol (arg, &arg, 0); + if (port < PORT_MIN || port > PORT_MAX) + argp_error (state, "bad port %d", port); + break; + } default: return ARGP_ERR_UNKNOWN; @@ -450,7 +471,7 @@ main (int argc, char *argv[], char **envp) fd = accept(). tcpd is check if compile with the support */ if (daemon_mode) { - if (server_mode (pid_file, &his_addr) < 0) + if (server_mode (pid_file, port, &his_addr) < 0) exit (1); } else diff --git a/ftpd/server_mode.c b/ftpd/server_mode.c index bc122dc..0a3e5b9 100644 --- a/ftpd/server_mode.c +++ b/ftpd/server_mode.c @@ -75,11 +75,10 @@ reapchild (int signo ARG_UNUSED) } int -server_mode (const char *pidfile, struct sockaddr_in *phis_addr) +server_mode (const char *pidfile, int port, struct sockaddr_in *phis_addr) { int ctl_sock, fd; - struct servent *sv; - int port; + struct servent *sv = NULL; static struct sockaddr_in server_addr; /* Our address. */ /* Become a daemon. */ @@ -90,9 +89,19 @@ server_mode (const char *pidfile, struct sockaddr_in *phis_addr) } signal (SIGCHLD, reapchild); - /* Get port for ftp/tcp. */ - sv = getservbyname ("ftp", "tcp"); - port = (sv == NULL) ? DEFPORT : ntohs (sv->s_port); + + memset (&server_addr, 0, sizeof server_addr); + server_addr.sin_family = AF_INET; + + /* If a port was not specified on the command line use the default + ftp/tcp port. */ + if (port == -1) + { + sv = getservbyname ("ftp", "tcp"); + port = (sv == NULL) ? DEFPORT : ntohs (sv->s_port); + } + + server_addr.sin_port = htons (port); /* Open socket, bind and start listen. */ ctl_sock = socket (AF_INET, SOCK_STREAM, 0); @@ -110,10 +119,6 @@ server_mode (const char *pidfile, struct sockaddr_in *phis_addr) syslog (LOG_ERR, "control setsockopt: %m"); } - memset (&server_addr, 0, sizeof server_addr); - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons (port); - if (bind (ctl_sock, (struct sockaddr *) &server_addr, sizeof server_addr)) { syslog (LOG_ERR, "control bind: %m"); diff --git a/lib/.gitignore b/lib/.gitignore index f9d57b1..2e7dfdd 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -23,9 +23,9 @@ basename.c btowc.c canonicalize-lgpl.c canonicalize.h +charset.alias chdir-long.c chdir-long.h -charset.alias chown.c close-hook.c close-hook.h @@ -56,6 +56,7 @@ fcntl-safer.h fcntl.h fcntl.in.h fd-safer.c +fdopendir.c filemode.c filemode.h float+.h @@ -66,6 +67,7 @@ fnmatch.h fnmatch.in.h fnmatch_loop.c fopen-safer.c +fopen.c fseeko.c fstatat.c getcwd.c @@ -111,6 +113,7 @@ memchr.valgrind mempcpy.c memrchr.c minmax.h +mkdir.c mkdirat.c obstack.c obstack.h @@ -151,6 +154,7 @@ regex.h regex_internal.c regex_internal.h regexec.c +rmdir.c same-inode.h save-cwd.c save-cwd.h @@ -161,6 +165,7 @@ sleep.c snprintf.c sockets.c sockets.h +stat.c stdarg.h stdarg.in.h stdbool.h @@ -210,6 +215,8 @@ unistd--.h unistd-safer.h unistd.h unistd.in.h +unlink.c +unlinkat.c unlocked-io.h vasnprintf.c vasnprintf.h On Sat, Oct 10, 2009 at 11:56 PM, Alfred M. Szmidt <[email protected]> wrote: > Please reply to the list. > > Thank you for your feedback. I should point out that it is Richard > Stallman's vision that I believe in not Eric Raymond's. I will be more > careful in the future with the terminology that I use :-) > > It is more useful to believe in freedom than in someones vision, since > a persons vision can change, but freedom does not. > > I have made most of the changes that you suggested and will supply > a new patch shortly. > > Thank you! > > The reason that I passed in port as a separate argument to server_mode > is because phis->sin_port is used for the data port. The command port > is set via server_addr.sin_port. > > I do not follow... I wasn't referring to sin_port, but to the usage > of "port = port_no;" in server_mode, which is redundant. > > Do we want to allow a user to specify 0 as a port number? I realise > this will cause the port to be generated dynamically. Not sure > about other FTP servers but I do not think the Solaris in.ftpd > allows you to use 0. > > Could you check? I have no preference if we accept 0 or not, but it > is a valid port number. > -- oli "During times of universal deceit, telling the truth becomes a revolutionary act." - George Orwell
