X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=lib%2Fsocket.c;h=762dbfac2fc5d5ff092b5ade6a205d0900f6933e;hb=751770fd4310a43a8f488b719d8700730b18f557;hp=66e1021c5892d52bbd3933318eba32c8a4bc7fa4;hpb=622489d36e0a2d1b15f0ed9aa92a84fae1bc54fd;p=deb_libnfs.git diff --git a/lib/socket.c b/lib/socket.c index 66e1021..762dbfa 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -14,18 +14,6 @@ You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . */ -#ifdef WIN32 -#include "win32_compat.h" -#define ioctl ioctlsocket -#define close closesocket -#else -#include -#include -#include -#include -#include -#endif/*WIN32*/ - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -34,22 +22,48 @@ #include "aros_compat.h" #endif +#ifdef WIN32 +#include "win32_compat.h" +#endif + +#ifdef HAVE_ARPA_INET_H +#include +#endif + #ifdef HAVE_POLL_H #include #endif -#include -#include -#include -#include -#include -#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_IOCTL_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifdef HAVE_NETDB_H +#include +#endif + #ifdef HAVE_SYS_FILIO_H #include #endif + #ifdef HAVE_SYS_SOCKIO_H #include #endif + +#include +#include +#include +#include +#include +#include #include #include "libnfs-zdr.h" #include "libnfs.h" @@ -149,8 +163,6 @@ static int rpc_read_from_socket(struct rpc_context *rpc) assert(rpc->magic == RPC_CONTEXT_MAGIC); - assert(rpc->magic == RPC_CONTEXT_MAGIC); - if (ioctl(rpc->fd, FIONREAD, &available) != 0) { rpc_set_error(rpc, "Ioctl FIONREAD returned error : %d. Closing socket.", errno); return -1; @@ -244,14 +256,17 @@ static int rpc_read_from_socket(struct rpc_context *rpc) rpc->inpos += count; if (rpc->inpos == rpc->insize) { - if (rpc_process_pdu(rpc, rpc->inbuf, pdu_size) != 0) { - rpc_set_error(rpc, "Invalid/garbage pdu received from server. Closing socket"); - return -1; - } - free(rpc->inbuf); + char *buf = rpc->inbuf; + rpc->inbuf = NULL; rpc->insize = 0; rpc->inpos = 0; + + if (rpc_process_pdu(rpc, buf, pdu_size) != 0) { + rpc_set_error(rpc, "Invalid/garbage pdu received from server. Closing socket"); + return -1; + } + free(buf); } return 0; @@ -397,8 +412,12 @@ static int rpc_connect_sockaddr_async(struct rpc_context *rpc, struct sockaddr_s static int portOfs = 0; const int firstPort = 512; /* >= 512 according to Sun docs */ const int portCount = IPPORT_RESERVED - firstPort; - int startOfs = portOfs, port, rc; + int startOfs, port, rc; + if (portOfs == 0) { + portOfs = time(NULL) % 400; + } + startOfs = portOfs; do { rc = -1; port = htons(firstPort + portOfs);