mirror of
https://github.com/openvswitch/ovs
synced 2025-10-29 15:28:56 +00:00
socket-util: Allow binding without a port number in inet_open_passive().
The test-vconn program binds a socket to a nonspecific port number. To add SSL support to this program, it needs to be able to use SSL, and the stream library is the easiest way to do that. But the stream library can't bind to a nonspecific port. This commit adds that feature, by adding it to the function that the stream SSL library uses as a building block.
This commit is contained in:
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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
|
/* Opens a non-blocking IPv4 socket of the specified 'style', binds to
|
||||||
* 'target', and listens for incoming connections. 'target' should be a string
|
* 'target', and listens for incoming connections. 'target' should be a string
|
||||||
* in the format "[<port>][:<ip>]". <port> may be omitted if 'default_port' is
|
* in the format "[<port>][:<ip>]":
|
||||||
* nonzero, in which case it defaults to 'default_port'. If <ip> is omitted it
|
*
|
||||||
* defaults to the wildcard IP address.
|
* - 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).
|
* '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
|
* On success, returns a non-negative file descriptor. On failure, returns a
|
||||||
* negative errno value. */
|
* negative errno value. */
|
||||||
int
|
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 *target = xstrdup(target_);
|
||||||
char *string_ptr = target;
|
char *string_ptr = target;
|
||||||
struct sockaddr_in sin;
|
struct sockaddr_in sin;
|
||||||
const char *host_name;
|
const char *host_name;
|
||||||
const char *port_string;
|
const char *port_string;
|
||||||
int fd, error;
|
int fd, error, port;
|
||||||
unsigned int yes = 1;
|
unsigned int yes = 1;
|
||||||
|
|
||||||
/* Address defaults. */
|
/* Address defaults. */
|
||||||
@@ -414,9 +420,9 @@ inet_open_passive(int style, const char *target_, uint16_t default_port)
|
|||||||
|
|
||||||
/* Parse optional port number. */
|
/* Parse optional port number. */
|
||||||
port_string = strsep(&string_ptr, ":");
|
port_string = strsep(&string_ptr, ":");
|
||||||
if (port_string && atoi(port_string)) {
|
if (port_string && str_to_int(port_string, 10, &port)) {
|
||||||
sin.sin_port = htons(atoi(port_string));
|
sin.sin_port = htons(port);
|
||||||
} else if (!default_port) {
|
} else if (default_port < 0) {
|
||||||
VLOG_ERR("%s: port number must be specified", target_);
|
VLOG_ERR("%s: port number must be specified", target_);
|
||||||
error = EAFNOSUPPORT;
|
error = EAFNOSUPPORT;
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|||||||
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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,
|
int inet_open_active(int style, const char *target, uint16_t default_port,
|
||||||
struct sockaddr_in *sinp, int *fdp);
|
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 read_fully(int fd, void *, size_t, size_t *bytes_read);
|
||||||
int write_fully(int fd, const void *, size_t, size_t *bytes_written);
|
int write_fully(int fd, const void *, size_t, size_t *bytes_written);
|
||||||
|
|||||||
@@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with 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;
|
int fd;
|
||||||
|
|
||||||
fd = inet_open_passive(SOCK_STREAM, suffix, 0);
|
fd = inet_open_passive(SOCK_STREAM, suffix, -1);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
return -fd;
|
return -fd;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user