- 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);