aboutsummaryrefslogtreecommitdiff
path: root/appl/ftp/common/sockbuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'appl/ftp/common/sockbuf.c')
-rw-r--r--appl/ftp/common/sockbuf.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/appl/ftp/common/sockbuf.c b/appl/ftp/common/sockbuf.c
index bb9068afc0b7..bb2a5fd7905c 100644
--- a/appl/ftp/common/sockbuf.c
+++ b/appl/ftp/common/sockbuf.c
@@ -1,23 +1,23 @@
/*
- * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
+ * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
* (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved.
- *
+ *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
- *
+ *
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
- *
+ *
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- *
+ *
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
- *
+ *
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@@ -39,16 +39,30 @@
#include <sys/socket.h>
#endif
-RCSID("$Id: sockbuf.c 7463 1999-12-02 16:58:55Z joda $");
+RCSID("$Id$");
void
set_buffer_size(int fd, int read)
{
#if defined(SO_RCVBUF) && defined(SO_SNDBUF) && defined(HAVE_SETSOCKOPT)
- size_t size = 4194304;
- while(size >= 131072 &&
- setsockopt(fd, SOL_SOCKET, read ? SO_RCVBUF : SO_SNDBUF,
- (void *)&size, sizeof(size)) < 0)
+ int size = 4194304;
+ int optname = read ? SO_RCVBUF : SO_SNDBUF;
+
+#ifdef HAVE_GETSOCKOPT
+ int curr=0;
+ socklen_t optlen;
+
+ optlen = sizeof(curr);
+ if(getsockopt(fd, SOL_SOCKET, optname, (void *)&curr, &optlen) == 0) {
+ if(curr >= size) {
+ /* Already large enough */
+ return;
+ }
+ }
+#endif /* HAVE_GETSOCKOPT */
+
+ while(size >= 131072 &&
+ setsockopt(fd, SOL_SOCKET, optname, (void *)&size, sizeof(size)) < 0)
size /= 2;
#endif
}