This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.
Pablo Neira Ayuso pablo at gnumonks.orgThis description is wrong, I've resend this patch with the good one.
On 12/06/11 16:30, Pablo Neira Ayuso wrote:
> From: Pablo Neira Ayuso <pablo at gnumonks.org>
>
> * add OSMO_SOCK_F_[CONNECT|BIND|NON_BLOCK] flags
> * osmo_sock_connect() to call connect once the non-blocking connect
> becomes ready.
>
> This extends the socket infrastructure in libosmocore to allow
> to create non-blocking sockets.
>
> Basically, it replaces the connect0_bind1 parameter by one
> flags parameter.
> ---
> include/osmocom/core/socket.h | 11 ++++++++---
> src/gsmtap_util.c | 6 ++++--
> src/socket.c | 38 ++++++++++++++++++++++++++++----------
> 3 files changed, 40 insertions(+), 15 deletions(-)
>
> diff --git a/include/osmocom/core/socket.h b/include/osmocom/core/socket.h
> index b2601c7..612b12c 100644
> --- a/include/osmocom/core/socket.h
> +++ b/include/osmocom/core/socket.h
> @@ -5,14 +5,19 @@
>
> struct sockaddr;
>
> +/* flags for osmo_sock_init. */
> +#define OSMO_SOCK_F_CONNECT (1 << 0)
> +#define OSMO_SOCK_F_BIND (1 << 1)
> +#define OSMO_SOCK_F_NONBLOCK (1 << 2)
> +
> int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> - const char *host, uint16_t port, int connect0_bind1);
> + const char *host, uint16_t port, unsigned int flags);
>
> int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto,
> - const char *host, uint16_t port, int connect0_bind1);
> + const char *host, uint16_t port, unsigned int flags);
>
> int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type,
> - uint8_t proto, int connect0_bind1);
> + uint8_t proto, unsigned int flags);
>
> /* determine if the given address is a local address */
> int osmo_sockaddr_is_local(struct sockaddr *addr, unsigned int addrlen);
> diff --git a/src/gsmtap_util.c b/src/gsmtap_util.c
> index eddde04..47fa37d 100644
> --- a/src/gsmtap_util.c
> +++ b/src/gsmtap_util.c
> @@ -124,7 +124,8 @@ int gsmtap_source_init_fd(const char *host, uint16_t port)
> if (host == NULL)
> host = "localhost";
>
> - return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port, 0);
> + return osmo_sock_init(AF_UNSPEC, SOCK_DGRAM, IPPROTO_UDP, host, port,
> + OSMO_SOCK_F_CONNECT);
> }
>
> int gsmtap_source_add_sink_fd(int gsmtap_fd)
> @@ -138,7 +139,8 @@ int gsmtap_source_add_sink_fd(int gsmtap_fd)
> return rc;
>
> if (osmo_sockaddr_is_local((struct sockaddr *)&ss, ss_len) == 1) {
> - rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM, IPPROTO_UDP, 1);
> + rc = osmo_sock_init_sa((struct sockaddr *)&ss, SOCK_DGRAM,
> + IPPROTO_UDP, OSMO_SOCK_F_BIND);
> if (rc >= 0)
> return rc;
> }
> diff --git a/src/socket.c b/src/socket.c
> index 0be98b9..f1fcccd 100644
> --- a/src/socket.c
> +++ b/src/socket.c
> @@ -6,6 +6,7 @@
> #include <osmocom/core/select.h>
> #include <osmocom/core/socket.h>
>
> +#include <sys/ioctl.h>
> #include <sys/socket.h>
> #include <sys/types.h>
>
> @@ -18,12 +19,16 @@
> #include <ifaddrs.h>
>
> int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> - const char *host, uint16_t port, int connect0_bind1)
> + const char *host, uint16_t port, unsigned int flags)
> {
> struct addrinfo hints, *result, *rp;
> int sfd, rc, on = 1;
> char portbuf[16];
>
> + if ((flags & (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT)) ==
> + (OSMO_SOCK_F_BIND | OSMO_SOCK_F_CONNECT))
> + return -EINVAL;
> +
> sprintf(portbuf, "%u", port);
> memset(&hints, 0, sizeof(struct addrinfo));
> hints.ai_family = family;
> @@ -31,7 +36,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> hints.ai_flags = 0;
> hints.ai_protocol = proto;
>
> - if (connect0_bind1)
> + if (flags & OSMO_SOCK_F_BIND)
> hints.ai_flags |= AI_PASSIVE;
>
> rc = getaddrinfo(host, portbuf, &hints, &result);
> @@ -44,10 +49,24 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
> if (sfd == -1)
> continue;
> - if (connect0_bind1 == 0) {
> - if (connect(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
> + if (flags & OSMO_SOCK_F_NONBLOCK) {
> + if (ioctl(sfd, FIONBIO, (unsigned char *)&on) < 0) {
> + perror("cannot set this socket unblocking");
> + close(sfd);
> + return -EINVAL;
> + }
> + }
> + if (flags & OSMO_SOCK_F_CONNECT) {
> + rc = connect(sfd, rp->ai_addr, rp->ai_addrlen);
> + if (rc != -1 || (rc == -1 && errno == EINPROGRESS))
> break;
> } else {
> + rc = setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR,
> + &on, sizeof(on));
> + if (rc < 0) {
> + perror("cannot setsockopt socket");
> + break;
> + }
> if (bind(sfd, rp->ai_addr, rp->ai_addrlen) != -1)
> break;
> }
> @@ -63,7 +82,7 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
>
> /* Make sure to call 'listen' on a bound, connection-oriented sock */
> - if (connect0_bind1 == 1) {
> + if (flags & OSMO_SOCK_F_BIND) {
> switch (type) {
> case SOCK_STREAM:
> case SOCK_SEQPACKET:
> @@ -75,11 +94,11 @@ int osmo_sock_init(uint16_t family, uint16_t type, uint8_t proto,
> }
>
> int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto,
> - const char *host, uint16_t port, int connect0_bind1)
> + const char *host, uint16_t port, unsigned int flags)
> {
> int sfd, rc;
>
> - sfd = osmo_sock_init(family, type, proto, host, port, connect0_bind1);
> + sfd = osmo_sock_init(family, type, proto, host, port, flags);
> if (sfd < 0)
> return sfd;
>
> @@ -96,7 +115,7 @@ int osmo_sock_init_ofd(struct osmo_fd *ofd, int family, int type, int proto,
> }
>
> int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type,
> - uint8_t proto, int connect0_bind1)
> + uint8_t proto, unsigned int flags)
> {
> char host[NI_MAXHOST];
> uint16_t port;
> @@ -127,8 +146,7 @@ int osmo_sock_init_sa(struct sockaddr *ss, uint16_t type,
> return s;
> }
>
> - return osmo_sock_init(ss->sa_family, type, proto, host,
> - port, connect0_bind1);
> + return osmo_sock_init(ss->sa_family, type, proto, host, port, flags);
> }
>
> static int sockaddr_equal(const struct sockaddr *a,
>
>