diff options
-rw-r--r-- | lib/socket-util.c | 24 | ||||
-rw-r--r-- | lib/socket-util.h | 4 | ||||
-rw-r--r-- | lib/stream-tcp.c | 4 |
3 files changed, 19 insertions, 13 deletions
diff --git a/lib/socket-util.c b/lib/socket-util.c index ed190130..adc1c6b2 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -385,9 +385,15 @@ exit: /* Opens a non-blocking IPv4 socket of the specified 'style', binds to * 'target', and listens for incoming connections. 'target' should be a string - * in the format "[<port>][:<ip>]". <port> may be omitted if 'default_port' is - * nonzero, in which case it defaults to 'default_port'. If <ip> is omitted it - * defaults to the wildcard IP address. + * in the format "[<port>][:<ip>]": + * + * - If 'default_port' is -1, then <port> is required. Otherwise, if + * <port> is omitted, then 'default_port' is used instead. + * + * - If <port> (or 'default_port', if used) is 0, then no port is bound + * and the TCP/IP stack will select a port. + * + * - If <ip> is omitted then the IP address is wildcarded. * * 'style' should be SOCK_STREAM (for TCP) or SOCK_DGRAM (for UDP). * @@ -396,14 +402,14 @@ exit: * On success, returns a non-negative file descriptor. On failure, returns a * negative errno value. */ int -inet_open_passive(int style, const char *target_, uint16_t default_port) +inet_open_passive(int style, const char *target_, int default_port) { char *target = xstrdup(target_); char *string_ptr = target; struct sockaddr_in sin; const char *host_name; const char *port_string; - int fd, error; + int fd, error, port; unsigned int yes = 1; /* Address defaults. */ @@ -414,9 +420,9 @@ inet_open_passive(int style, const char *target_, uint16_t default_port) /* Parse optional port number. */ port_string = strsep(&string_ptr, ":"); - if (port_string && atoi(port_string)) { - sin.sin_port = htons(atoi(port_string)); - } else if (!default_port) { + if (port_string && str_to_int(port_string, 10, &port)) { + sin.sin_port = htons(port); + } else if (default_port < 0) { VLOG_ERR("%s: port number must be specified", target_); error = EAFNOSUPPORT; goto exit; diff --git a/lib/socket-util.h b/lib/socket-util.h index 4259115d..def2132c 100644 --- a/lib/socket-util.h +++ b/lib/socket-util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,7 +36,7 @@ int get_null_fd(void); int inet_open_active(int style, const char *target, uint16_t default_port, struct sockaddr_in *sinp, int *fdp); -int inet_open_passive(int style, const char *target, uint16_t default_port); +int inet_open_passive(int style, const char *target, int default_port); int read_fully(int fd, void *, size_t, size_t *bytes_read); int write_fully(int fd, const void *, size_t, size_t *bytes_written); diff --git a/lib/stream-tcp.c b/lib/stream-tcp.c index bfcf35c7..94ff74cb 100644 --- a/lib/stream-tcp.c +++ b/lib/stream-tcp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -105,7 +105,7 @@ ptcp_open(const char *name UNUSED, char *suffix, struct pstream **pstreamp) { int fd; - fd = inet_open_passive(SOCK_STREAM, suffix, 0); + fd = inet_open_passive(SOCK_STREAM, suffix, -1); if (fd < 0) { return -fd; } else { |