From b5eeaef1ce641b1c55bbda2f68de1b7196fa4cb2 Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Wed, 9 Sep 2009 00:07:18 +0000 Subject: [PATCH] --- Makefile | 5 +++- fd_udpsocket.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 fd_udpsocket.c diff --git a/Makefile b/Makefile index 44f991a..936781c 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CC=gcc CFLAGS=-g -O2 -all: dcookie fd_bmsocket fd_fusemount +all: dcookie fd_bmsocket fd_udpsocket fd_fusemount dcookie: dcookie.c gcc dcookie.c -o exec/dcookie @@ -12,6 +12,9 @@ fdpass.o: fdpass.c fd_bmsocket: fd_bmsocket.c fdpass.o gcc fd_bmsocket.c fdpass.o -o exec/fd_bmsocket +fd_udpsocket: fd_udpsocket.c fdpass.o + gcc fd_udpsocket.c fdpass.o -o exec/fd_udpsocket + fd_fusemount: fd_fusemount.c fdpass.o gcc fd_fusemount.c fdpass.o -o exec/fd_fusemount diff --git a/fd_udpsocket.c b/fd_udpsocket.c new file mode 100644 index 0000000..8fa6651 --- /dev/null +++ b/fd_udpsocket.c @@ -0,0 +1,75 @@ +/* Copy of fd_bmsocket.c that creates UDP sockets instead of TCP sockets. */ + +#include +#include +#include +#include +#include +#include "fdpass.h" + +#define MAX_BUFSIZE (32*1024*1024) + +/*------------------------------------------------------------------*/ +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); + } + + sscanf(argv[2],"%d", &control_channel_fd); + + /* 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_DGRAM, 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); +} -- 2.43.0