libbb: new option FEATURE_ETC_SERVICES: if off, /etc/services reads often avoided

In practice, "wget http://host.com/" always uses port 80.
People explicitly set non-standard ports via options or parameters
("telnet 1.2.3.4 567" or "telnet 1.2.3.4 ftp") instead of modifying
/etc/services.

function                                             old     new   delta
telnet_main                                         1466    1464      -2
rdate_main                                           215     198     -17
fakeidentd_main                                      269     252     -17
parse_url                                            459     392     -67
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-103)           Total: -103 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-04-17 12:43:54 +02:00
parent 816d8d7a66
commit 2aeb201c97
6 changed files with 25 additions and 7 deletions

View File

@ -640,6 +640,11 @@ int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC;
int bb_getsockname(int sockfd, void *addr, socklen_t addrlen) FAST_FUNC; int bb_getsockname(int sockfd, void *addr, socklen_t addrlen) FAST_FUNC;
/* NB: returns port in host byte order */ /* NB: returns port in host byte order */
unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC; unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC;
#if ENABLE_FEATURE_ETC_SERVICES
# define bb_lookup_std_port(portstr, protocol, portnum) bb_lookup_port(portstr, protocol, portnum)
#else
# define bb_lookup_std_port(portstr, protocol, portnum) (portnum)
#endif
typedef struct len_and_sockaddr { typedef struct len_and_sockaddr {
socklen_t len; socklen_t len;
union { union {

View File

@ -76,6 +76,18 @@ config FEATURE_ETC_NETWORKS
a rarely used feature which allows you to use names a rarely used feature which allows you to use names
instead of IP/mask pairs in route command. instead of IP/mask pairs in route command.
config FEATURE_ETC_SERVICES
bool "Consult /etc/services even for well-known ports"
default n
help
Look up e.g. "telnet" and "http" in /etc/services file
instead of assuming ports 23 and 80.
This is almost never necessary (everybody uses standard ports),
and it makes sense to avoid reading this file.
If you disable this option, in the cases where port is explicitly
specified as a service name (e.g. "telnet HOST PORTNAME"),
it will still be looked up in /etc/services.
config FEATURE_EDITING config FEATURE_EDITING
bool "Command line editing" bool "Command line editing"
default y default y

View File

@ -159,7 +159,7 @@ int fakeidentd_main(int argc UNUSED_PARAM, char **argv)
fd = 0; fd = 0;
if (!(opt & OPT_inetdwait)) { if (!(opt & OPT_inetdwait)) {
fd = create_and_bind_stream_or_die(bind_address, fd = create_and_bind_stream_or_die(bind_address,
bb_lookup_port("identd", "tcp", 113)); bb_lookup_std_port("identd", "tcp", 113));
xlisten(fd, 5); xlisten(fd, 5);
} }

View File

@ -643,7 +643,8 @@ int telnet_main(int argc UNUSED_PARAM, char **argv)
if (!*argv) if (!*argv)
bb_show_usage(); bb_show_usage();
host = *argv++; host = *argv++;
port = bb_lookup_port(*argv ? *argv++ : "telnet", "tcp", 23); port = *argv ? bb_lookup_port(*argv++, "tcp", 23)
: bb_lookup_std_port("telnet", "tcp", 23);
if (*argv) /* extra params?? */ if (*argv) /* extra params?? */
bb_show_usage(); bb_show_usage();

View File

@ -505,23 +505,23 @@ static void parse_url(const char *src_url, struct host_info *h)
*p = '\0'; *p = '\0';
h->host = p + 3; h->host = p + 3;
if (strcmp(url, P_FTP) == 0) { if (strcmp(url, P_FTP) == 0) {
h->port = bb_lookup_port(P_FTP, "tcp", 21); h->port = bb_lookup_std_port(P_FTP, "tcp", 21);
} else } else
#if SSL_SUPPORTED #if SSL_SUPPORTED
# if ENABLE_FEATURE_WGET_HTTPS # if ENABLE_FEATURE_WGET_HTTPS
if (strcmp(url, P_FTPS) == 0) { if (strcmp(url, P_FTPS) == 0) {
h->port = bb_lookup_port(P_FTPS, "tcp", 990); h->port = bb_lookup_std_port(P_FTPS, "tcp", 990);
h->protocol = P_FTPS; h->protocol = P_FTPS;
} else } else
# endif # endif
if (strcmp(url, P_HTTPS) == 0) { if (strcmp(url, P_HTTPS) == 0) {
h->port = bb_lookup_port(P_HTTPS, "tcp", 443); h->port = bb_lookup_std_port(P_HTTPS, "tcp", 443);
h->protocol = P_HTTPS; h->protocol = P_HTTPS;
} else } else
#endif #endif
if (strcmp(url, P_HTTP) == 0) { if (strcmp(url, P_HTTP) == 0) {
http: http:
h->port = bb_lookup_port(P_HTTP, "tcp", 80); h->port = bb_lookup_std_port(P_HTTP, "tcp", 80);
h->protocol = P_HTTP; h->protocol = P_HTTP;
} else { } else {
*p = ':'; *p = ':';

View File

@ -45,7 +45,7 @@ static time_t askremotedate(const char *host)
alarm(10); alarm(10);
signal(SIGALRM, socket_timeout); signal(SIGALRM, socket_timeout);
fd = create_and_connect_stream_or_die(host, bb_lookup_port("time", "tcp", 37)); fd = create_and_connect_stream_or_die(host, bb_lookup_std_port("time", "tcp", 37));
if (safe_read(fd, &nett, 4) != 4) /* read time from server */ if (safe_read(fd, &nett, 4) != 4) /* read time from server */
bb_error_msg_and_die("%s: %s", host, "short read"); bb_error_msg_and_die("%s: %s", host, "short read");