X-Git-Url: http://www.privoxy.org/gitweb/?p=privoxy.git;a=blobdiff_plain;f=jbsockets.c;h=f3f5750e0b5498137216c653d70910c25fd6b2b5;hp=1fe56e1ebaec39d292136cba032e3cac2460a4da;hb=36bed44da8971c4b75627ec86cc41163bfde81ae;hpb=c047f21f14e305dacb22135b2add11b4eca78957 diff --git a/jbsockets.c b/jbsockets.c index 1fe56e1e..f3f5750e 100644 --- a/jbsockets.c +++ b/jbsockets.c @@ -8,7 +8,7 @@ * on many platforms. * * Copyright : Written by and Copyright (C) 2001-2017 the - * Privoxy team. http://www.privoxy.org/ + * Privoxy team. https://www.privoxy.org/ * * Based on the Internet Junkbuster originally written * by and Copyright (C) 1997 Anonymous Coders and @@ -56,9 +56,7 @@ #else -#ifndef __OS2__ #include -#endif #include #include #include @@ -67,20 +65,11 @@ #ifndef __BEOS__ #include -#ifndef __OS2__ #include -#endif #else #include #endif -#if defined(__EMX__) || defined (__OS2__) -#include /* OS/2/EMX needs a little help with select */ -#ifdef __OS2__ -#include -#endif -#endif - #endif #ifdef HAVE_POLL @@ -213,12 +202,12 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client fd_set wfds; struct timeval timeout; #endif -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) int flags; #endif int connect_failed; /* - * XXX: Initializeing it here is only necessary + * XXX: Initializing it here is only necessary * because not all situations are properly * covered yet. */ @@ -254,10 +243,10 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client { log_error(LOG_LEVEL_INFO, "Can not resolve %s: %s", host, gai_strerror(retval)); - /* XXX: Should find a better way to propagate this error. */ - errno = EINVAL; csp->error_message = strdup(gai_strerror(retval)); csp->http->host_ip_addr_str = strdup("unknown"); + /* XXX: Should find a better way to propagate this error. */ + errno = EINVAL; return(JB_INVALID_SOCKET); } @@ -271,11 +260,7 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client if (block_acl(dst, csp)) { -#ifdef __OS2__ - socket_error = errno = SOCEPERM; -#else socket_error = errno = EPERM; -#endif continue; } #endif /* def FEATURE_ACL */ @@ -320,26 +305,22 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client set_no_delay_flag(fd); -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) { flags |= O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) */ connect_failed = 0; while (connect(fd, rp->ai_addr, rp->ai_addrlen) == JB_INVALID_SOCKET) { -#ifdef __OS2__ - errno = sock_errno(); -#endif /* __OS2__ */ - #ifdef _WIN32 if (errno == WSAEINPROGRESS) #else /* ifndef _WIN32 */ if (errno == EINPROGRESS) -#endif /* ndef _WIN32 || __OS2__ */ +#endif /* ndef _WIN32 */ { break; } @@ -357,13 +338,13 @@ static jb_socket rfc2553_connect_to(const char *host, int portnum, struct client continue; } -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) if (flags != -1) { flags &= ~O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) */ #ifdef HAVE_POLL poll_fd[0].fd = fd; @@ -464,7 +445,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli fd_set wfds; struct timeval tv[1]; #endif -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) int flags; #endif @@ -489,11 +470,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli if (block_acl(dst, csp)) { -#ifdef __OS2__ - errno = SOCEPERM; -#else errno = EPERM; -#endif return(JB_INVALID_SOCKET); } #endif /* def FEATURE_ACL */ @@ -540,7 +517,7 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli set_no_delay_flag(fd); -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) if ((flags = fcntl(fd, F_GETFL, 0)) != -1) { flags |= O_NDELAY; @@ -549,39 +526,33 @@ static jb_socket no_rfc2553_connect_to(const char *host, int portnum, struct cli mark_socket_for_close_on_execute(fd); #endif } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) */ while (connect(fd, (struct sockaddr *) & inaddr, sizeof inaddr) == JB_INVALID_SOCKET) { #ifdef _WIN32 if (errno == WSAEINPROGRESS) -#elif __OS2__ - if (sock_errno() == EINPROGRESS) #else /* ifndef _WIN32 */ if (errno == EINPROGRESS) -#endif /* ndef _WIN32 || __OS2__ */ +#endif /* ndef _WIN32 */ { break; } -#ifdef __OS2__ - if (sock_errno() != EINTR) -#else if (errno != EINTR) -#endif /* __OS2__ */ { close_socket(fd); return(JB_INVALID_SOCKET); } } -#if !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) +#if !defined(_WIN32) && !defined(__BEOS__) if (flags != -1) { flags &= ~O_NDELAY; fcntl(fd, F_SETFL, flags); } -#endif /* !defined(_WIN32) && !defined(__BEOS__) && !defined(__OS2__) */ +#endif /* !defined(_WIN32) && !defined(__BEOS__) */ #ifdef HAVE_POLL poll_fd[0].fd = fd; @@ -645,30 +616,63 @@ int write_socket(jb_socket fd, const char *buf, size_t len) return (send(fd, buf, (int)len, 0) != (int)len); #elif defined(__BEOS__) return (send(fd, buf, len, 0) != len); -#elif defined(__OS2__) - /* - * Break the data up into SOCKET_SEND_MAX chunks for sending... - * OS/2 seemed to complain when the chunks were too large. - */ -#define SOCKET_SEND_MAX 65000 +#else + return (write(fd, buf, len) != len); +#endif + +} + + +/********************************************************************* + * + * Function : write_socket_delayed + * + * Description : Write the contents of buf (for n bytes) to + * socket fd, optionally delaying the operation. + * + * Parameters : + * 1 : fd = File descriptor (aka. handle) of socket to write to. + * 2 : buf = Pointer to data to be written. + * 3 : len = Length of data to be written to the socket "fd". + * 4 : delay = Delay in milliseconds. + * + * Returns : 0 on success (entire buffer sent). + * nonzero on error. + * + *********************************************************************/ +int write_socket_delayed(jb_socket fd, const char *buf, size_t len, unsigned int delay) +{ + size_t i = 0; + + if (delay == 0) + { + return write_socket(fd, buf, len); + } + + while (i < len) { - int send_len, send_rc = 0, i = 0; - while ((i < len) && (send_rc != -1)) + size_t write_length; + enum {MAX_WRITE_LENGTH = 10}; + + if ((i + MAX_WRITE_LENGTH) > len) { - if ((i + SOCKET_SEND_MAX) > len) - send_len = len - i; - else - send_len = SOCKET_SEND_MAX; - send_rc = send(fd,(char*)buf + i, send_len, 0); - if (send_rc == -1) - return 1; - i = i + send_len; + write_length = len - i; } - return 0; + else + { + write_length = MAX_WRITE_LENGTH; + } + + privoxy_millisleep(delay); + + if (write_socket(fd, buf + i, write_length) != 0) + { + return 1; + } + i += write_length; } -#else - return (write(fd, buf, len) != len); -#endif + + return 0; } @@ -709,7 +713,7 @@ int read_socket(jb_socket fd, char *buf, int len) #if defined(_WIN32) ret = recv(fd, buf, len, 0); -#elif defined(__BEOS__) || defined(__OS2__) +#elif defined(__BEOS__) ret = recv(fd, buf, (size_t)len, 0); #else ret = (int)read(fd, buf, (size_t)len); @@ -756,12 +760,7 @@ int data_is_available(jb_socket fd, int seconds_to_wait) memset(&timeout, 0, sizeof(timeout)); timeout.tv_sec = seconds_to_wait; -#ifdef __OS2__ - /* Copy and pasted from jcc.c ... */ - memset(&rfds, 0, sizeof(fd_set)); -#else FD_ZERO(&rfds); -#endif FD_SET(fd, &rfds); n = select(fd+1, &rfds, NULL, NULL, &timeout); @@ -790,8 +789,6 @@ void close_socket(jb_socket fd) { #if defined(_WIN32) || defined(__BEOS__) closesocket(fd); -#elif defined(__OS2__) - soclose(fd); #else close(fd); #endif @@ -1014,6 +1011,10 @@ int bind_port(const char *hostnam, int portnum, int backlog, jb_socket *pfd) setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); #endif /* ndef _WIN32 */ +#ifdef IP_FREEBIND + setsockopt(fd, IPPROTO_IP, IP_FREEBIND, (char *)&one, sizeof(one)); +#endif + #ifdef HAVE_RFC2553 if (bind(fd, rp->ai_addr, rp->ai_addrlen) < 0) #else @@ -1112,7 +1113,7 @@ void get_host_information(jb_socket afd, char **ip_address, char **port, struct sockaddr_in server; struct hostent *host = NULL; #endif /* HAVE_RFC2553 */ -#if defined(_WIN32) || defined(__OS2__) +#if defined(_WIN32) /* according to accept_connection() this fixes a warning. */ int s_length, s_length_provided; #else @@ -1264,8 +1265,8 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) struct sockaddr_in client; #endif jb_socket afd; -#if defined(_WIN32) || defined(__OS2__) - /* Wierdness - fix a warning. */ +#if defined(_WIN32) + /* Weirdness - fix a warning. */ int c_length; #else socklen_t c_length; @@ -1439,7 +1440,7 @@ int accept_connection(struct client_state * csp, jb_socket fds[]) { log_error(LOG_LEVEL_ERROR, "Server name (%s) and port number (%d) ASCII decimal representation" - "don't fit into %d bytes", + "don't fit into %lu bytes", host_addr, csp->config->hport[i], listen_addr_size); return 0; }