/* * Copyright (c) 1993 W. Richard Stevens. All rights reserved. * Permission to use or modify this software and its documentation only for * educational purposes and without fee is hereby granted, provided that * the above copyright notice appear in all copies. The author makes no * representations about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. */ #include "sock.h" void buffers(int sockfd) { int n; socklen_t optlen; /* Allocate the read and write buffers. */ if (rbuf == NULL) { if ( (rbuf = malloc(readlen)) == NULL) err_sys("malloc error for read buffer"); } if (wbuf == NULL) { if ( (wbuf = malloc(writelen)) == NULL) err_sys("malloc error for write buffer"); } /* Set the socket send and receive buffer sizes (if specified). The receive buffer size is tied to TCP's advertised window. */ if (rcvbuflen) { if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuflen, sizeof(rcvbuflen)) < 0) err_sys("SO_RCVBUF setsockopt error"); optlen = sizeof(n); if (getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, &optlen) < 0) err_sys("SO_RCVBUF getsockopt error"); if (n != rcvbuflen) err_quit("rcvbuflen = %d, SO_RCVBUF = %d", rcvbuflen, n); if (verbose) fprintf(stderr, "SO_RCVBUF = %d\n", n); } if (sndbuflen) { if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuflen, sizeof(sndbuflen)) < 0) err_sys("SO_SNDBUF setsockopt error"); optlen = sizeof(n); if (getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &n, &optlen) < 0) err_sys("SO_SNDBUF getsockopt error"); if (n != sndbuflen) err_quit("sndbuflen = %d, SO_SNDBUF = %d", sndbuflen, n); if (verbose) fprintf(stderr, "SO_SNDBUF = %d\n", n); } }