diff options
Diffstat (limited to 'src/vlibmemory/socket_client.c')
-rw-r--r-- | src/vlibmemory/socket_client.c | 79 |
1 files changed, 53 insertions, 26 deletions
diff --git a/src/vlibmemory/socket_client.c b/src/vlibmemory/socket_client.c index 237d2224d24..ad28136dc07 100644 --- a/src/vlibmemory/socket_client.c +++ b/src/vlibmemory/socket_client.c @@ -22,6 +22,14 @@ #define _GNU_SOURCE #include <sys/socket.h> +#ifdef __FreeBSD__ +#define _WANT_UCRED +#include <sys/types.h> +#include <sys/param.h> +#include <sys/ucred.h> +#include <sys/un.h> +#endif /* __FreeBSD__ */ + #include <svm/ssvm.h> #include <vlibmemory/socket_client.h> #include <vlibmemory/memory_client.h> @@ -41,7 +49,6 @@ #undef vl_calcsizefun /* instantiate all the print functions we know about */ -#define vl_print(handle, ...) clib_warning (__VA_ARGS__) #define vl_printfun #include <vlibmemory/vl_memory_api_h.h> #undef vl_printfun @@ -88,12 +95,11 @@ vl_socket_client_read_internal (socket_client_main_t * scm, int wait) while (1) { - while (vec_len (scm->socket_rx_buffer) < sizeof (*mbp)) + current_rx_index = vec_len (scm->socket_rx_buffer); + while (current_rx_index < sizeof (*mbp)) { - current_rx_index = vec_len (scm->socket_rx_buffer); vec_validate (scm->socket_rx_buffer, current_rx_index + scm->socket_buffer_size - 1); - vec_set_len (scm->socket_rx_buffer, current_rx_index); n = read (scm->socket_fd, scm->socket_rx_buffer + current_rx_index, scm->socket_buffer_size); if (n < 0) @@ -102,10 +108,12 @@ vl_socket_client_read_internal (socket_client_main_t * scm, int wait) continue; clib_unix_warning ("socket_read"); + vec_set_len (scm->socket_rx_buffer, current_rx_index); return -1; } - vec_inc_len (scm->socket_rx_buffer, n); + current_rx_index += n; } + vec_set_len (scm->socket_rx_buffer, current_rx_index); #if CLIB_DEBUG > 1 if (n > 0) @@ -116,25 +124,25 @@ vl_socket_client_read_internal (socket_client_main_t * scm, int wait) data_len = ntohl (mbp->data_len); current_rx_index = vec_len (scm->socket_rx_buffer); vec_validate (scm->socket_rx_buffer, current_rx_index + data_len); - vec_set_len (scm->socket_rx_buffer, current_rx_index); mbp = (msgbuf_t *) (scm->socket_rx_buffer); msg_size = data_len + sizeof (*mbp); - while (vec_len (scm->socket_rx_buffer) < msg_size) + while (current_rx_index < msg_size) { - n = read (scm->socket_fd, - scm->socket_rx_buffer + vec_len (scm->socket_rx_buffer), - msg_size - vec_len (scm->socket_rx_buffer)); + n = read (scm->socket_fd, scm->socket_rx_buffer + current_rx_index, + msg_size - current_rx_index); if (n < 0) { if (errno == EAGAIN) continue; clib_unix_warning ("socket_read"); + vec_set_len (scm->socket_rx_buffer, current_rx_index); return -1; } - vec_inc_len (scm->socket_rx_buffer, n); + current_rx_index += n; } + vec_set_len (scm->socket_rx_buffer, current_rx_index); if (vec_len (scm->socket_rx_buffer) >= data_len + sizeof (*mbp)) { @@ -179,11 +187,11 @@ static int vl_socket_client_write_internal (socket_client_main_t * scm) { int n; - + int len = vec_len (scm->socket_tx_buffer); msgbuf_t msgbuf = { .q = 0, .gc_mark_timestamp = 0, - .data_len = htonl (scm->socket_tx_nbytes), + .data_len = htonl (len), }; n = write (scm->socket_fd, &msgbuf, sizeof (msgbuf)); @@ -193,8 +201,11 @@ vl_socket_client_write_internal (socket_client_main_t * scm) return -1; } - n = write (scm->socket_fd, scm->socket_tx_buffer, scm->socket_tx_nbytes); - if (n < scm->socket_tx_nbytes) + n = write (scm->socket_fd, scm->socket_tx_buffer, len); + + vec_set_len (scm->socket_tx_buffer, 0); + + if (n < len) { clib_unix_warning ("socket write (msg)"); return -1; @@ -224,7 +235,7 @@ vl_socket_client_write2 (socket_client_main_t * scm) void * vl_socket_client_msg_alloc2 (socket_client_main_t * scm, int nbytes) { - scm->socket_tx_nbytes = nbytes; + vec_set_len (scm->socket_tx_buffer, nbytes); return ((void *) scm->socket_tx_buffer); } @@ -275,7 +286,11 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[], struct msghdr mh = { 0 }; struct iovec iov[1]; ssize_t size = 0; +#ifdef __linux__ struct ucred *cr = 0; +#elif __FreeBSD__ + struct cmsgcred *cr = 0; +#endif /* __linux__ */ struct cmsghdr *cmsg; pid_t pid __attribute__ ((unused)); uid_t uid __attribute__ ((unused)); @@ -315,6 +330,7 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[], { if (cmsg->cmsg_level == SOL_SOCKET) { +#ifdef __linux__ if (cmsg->cmsg_type == SCM_CREDENTIALS) { cr = (struct ucred *) CMSG_DATA (cmsg); @@ -322,6 +338,15 @@ vl_sock_api_recv_fd_msg_internal (socket_client_main_t * scm, int fds[], gid = cr->gid; pid = cr->pid; } +#elif __FreeBSD__ + if (cmsg->cmsg_type == SCM_CREDS) + { + cr = (struct cmsgcred *) CMSG_DATA (cmsg); + uid = cr->cmcred_uid; + gid = cr->cmcred_gid; + pid = cr->cmcred_pid; + } +#endif /* __linux__ */ else if (cmsg->cmsg_type == SCM_RIGHTS) { clib_memcpy_fast (fds, CMSG_DATA (cmsg), sizeof (int) * n_fds); @@ -427,21 +452,23 @@ vl_api_sockclnt_create_reply_t_handler (vl_api_sockclnt_create_reply_t * mp) _(SOCKCLNT_CREATE_REPLY, sockclnt_create_reply) \ _(SOCK_INIT_SHM_REPLY, sock_init_shm_reply) \ -static void -noop_handler (void *notused) -{ -} - void vl_sock_client_install_message_handlers (void) { #define _(N, n) \ - vl_msg_api_set_handlers ( \ - VL_API_##N, #n, vl_api_##n##_t_handler, noop_handler, \ - vl_api_##n##_t_endian, vl_api_##n##_t_print, sizeof (vl_api_##n##_t), 0, \ - vl_api_##n##_t_print_json, vl_api_##n##_t_tojson, \ - vl_api_##n##_t_fromjson, vl_api_##n##_t_calc_size); + vl_msg_api_config (&(vl_msg_api_msg_config_t){ \ + .id = VL_API_##N, \ + .name = #n, \ + .handler = vl_api_##n##_t_handler, \ + .endian = vl_api_##n##_t_endian, \ + .format_fn = vl_api_##n##_t_format, \ + .size = sizeof (vl_api_##n##_t), \ + .traced = 0, \ + .tojson = vl_api_##n##_t_tojson, \ + .fromjson = vl_api_##n##_t_fromjson, \ + .calc_size = vl_api_##n##_t_calc_size, \ + }); foreach_sock_client_api_msg; #undef _ } |