X-Git-Url: http://git.onelab.eu/?p=vsys-scripts.git;a=blobdiff_plain;f=fd_bmsocket.c;h=6a830ed58bba528e926fa8faa4795b4a8cdf1908;hp=c3fae7534beae68f76d3fb1ae61ddf1e2099ba47;hb=0d2dadd8ffce4fb1f1de7270766b65d748a04b30;hpb=89d5adef0a737afc86722bf7a87883b3ced536fe diff --git a/fd_bmsocket.c b/fd_bmsocket.c index c3fae75..6a830ed 100644 --- a/fd_bmsocket.c +++ b/fd_bmsocket.c @@ -1,12 +1,32 @@ #include #include +#include #include +#include #include "fdpass.h" -#define RCVBUF 16*1024*1024 +#define MAX_BUFSIZE (32*1024*1024) -int main(int argc, char *argv[]) { +/*------------------------------------------------------------------*/ +void +receive_argument(int control_fd, int *rcvbuf, int *sndbuf) +{ + if (recv(control_fd, rcvbuf, sizeof(int), 0) != sizeof(int)) { + fprintf(stderr, "receiving the first argument failed\n"); + exit(-1); + } + if (recv(control_fd, sndbuf, sizeof(int), 0) != sizeof(int)) { + fprintf(stderr, "receiving the first argument failed\n"); + exit(-1); + } +} +/*------------------------------------------------------------------*/ +int +main(int argc, char *argv[]) +{ int control_channel_fd, magic_socket; + int rcvbufsize = 0, sndbufsize = 0; + if (argc < 3) { printf("This script is called by vsys.\n"); exit(1); @@ -14,7 +34,40 @@ int main(int argc, char *argv[]) { sscanf(argv[2],"%d", &control_channel_fd); - magic_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - setsockopt(magic_socket, SOL_SOCKET, SO_RCVBUF, RCVBUF, sizeof(unsigned int)); - send_fd(control_channel, magic_socket); + /* receive paramaters: rcvbufsize and sndbufsize */ + receive_argument(control_channel_fd, &rcvbufsize, &sndbufsize); + if (rcvbufsize > MAX_BUFSIZE) + rcvbufsize = MAX_BUFSIZE; + if (sndbufsize > MAX_BUFSIZE) + sndbufsize = MAX_BUFSIZE; + + magic_socket = socket(AF_INET, SOCK_STREAM, 0); + if (magic_socket == -1) { + fprintf(stderr, "Error creating socket: %d\n", errno); + exit(1); + } + + /* buffer size <= 0 means we should ignore the parameter */ + if (rcvbufsize > 0) { + if (setsockopt(magic_socket, + SOL_SOCKET, + SO_RCVBUFFORCE, + &rcvbufsize, sizeof(unsigned int))) { + fprintf(stderr, "Error calling setsockopt for RCVBUFFORCE: %d\n", + errno); + exit(1); + } + } + if (sndbufsize > 0) { + if (setsockopt(magic_socket, + SOL_SOCKET, + SO_SNDBUFFORCE, + &sndbufsize, sizeof(unsigned int))) { + fprintf(stderr, "Error calling setsockopt for SNDBUFFORCE: %d\n", + errno); + exit(1); + } + } + + send_fd(control_channel_fd, magic_socket); }