X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvppinfra%2Fsocket.c;h=3271393529d8d82600f2b00b4aa8bd1d62cf6ac9;hb=5a41fd5ee7af8d39106d5fc5de7f2d17d7356b30;hp=109cbad7bb81457e1fe190125046d9ab36ea1d6f;hpb=0215fb4aee78543470d3f1538859b387fa70fb01;p=vpp.git diff --git a/src/vppinfra/socket.c b/src/vppinfra/socket.c index 109cbad7bb8..3271393529d 100644 --- a/src/vppinfra/socket.c +++ b/src/vppinfra/socket.c @@ -38,6 +38,7 @@ #include #include /* strchr */ #define __USE_GNU +#define _GNU_SOURCE #include #include #include @@ -54,7 +55,12 @@ #include #include -void +#ifndef __GLIBC__ +/* IPPORT_USERRESERVED is not part of musl libc. */ +#define IPPORT_USERRESERVED 5000 +#endif + +__clib_export void clib_socket_tx_add_formatted (clib_socket_t * s, char *fmt, ...) { va_list va; @@ -356,7 +362,8 @@ default_socket_recvmsg (clib_socket_t * s, void *msg, int msglen, #endif if (cmsg->cmsg_type == SCM_RIGHTS) { - clib_memcpy (fds, CMSG_DATA (cmsg), num_fds * sizeof (int)); + clib_memcpy_fast (fds, CMSG_DATA (cmsg), + num_fds * sizeof (int)); } } cmsg = CMSG_NXTHDR (&mh, cmsg); @@ -379,7 +386,7 @@ socket_init_funcs (clib_socket_t * s) s->recvmsg_func = default_socket_recvmsg; } -clib_error_t * +__clib_export clib_error_t * clib_socket_init (clib_socket_t * s) { union @@ -388,7 +395,7 @@ clib_socket_init (clib_socket_t * s) struct sockaddr_un su; } addr; socklen_t addr_len = 0; - int socket_type; + int socket_type, rv; clib_error_t *error = 0; word port; @@ -501,9 +508,11 @@ clib_socket_init (clib_socket_t * s) goto done; } - if (connect (s->fd, &addr.sa, addr_len) < 0 - && !((s->flags & CLIB_SOCKET_F_NON_BLOCKING_CONNECT) && - errno == EINPROGRESS)) + while ((rv = connect (s->fd, &addr.sa, addr_len)) < 0 + && errno == EAGAIN) + ; + if (rv < 0 && !((s->flags & CLIB_SOCKET_F_NON_BLOCKING_CONNECT) && + errno == EINPROGRESS)) { error = clib_error_return_unix (0, "connect (fd %d, '%s')", s->fd, s->config); @@ -519,7 +528,7 @@ done: return error; } -clib_error_t * +__clib_export clib_error_t * clib_socket_accept (clib_socket_t * server, clib_socket_t * client) { clib_error_t *err = 0;