X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fstream.c;h=96d3b6fdab00a0b24a1419c4f502a6e1d21906aa;hb=d5853102f67d85d8e169f9dbe973ad573306c215;hp=789de4a4c16098b4127765160713eee5f4801422;hpb=94a044f90357edefa6f4ae9f0b1d5885b0e34aee;p=debian%2Famanda diff --git a/common-src/stream.c b/common-src/stream.c index 789de4a..96d3b6f 100644 --- a/common-src/stream.c +++ b/common-src/stream.c @@ -52,15 +52,15 @@ stream_server( int priv) { int server_socket, retries; - socklen_t len; + socklen_t_equiv len; #if defined(SO_KEEPALIVE) || defined(USE_REUSEADDR) const int on = 1; int r; #endif - struct sockaddr_storage server; + sockaddr_union server; int save_errno; int *portrange; - socklen_t socklen; + socklen_t_equiv socklen; int socket_family; *portp = USHRT_MAX; /* in case we error exit */ @@ -69,18 +69,20 @@ stream_server( } else { socket_family = family; } + g_debug("stream_server opening socket with family %d (requested family was %d)", socket_family, family); server_socket = socket(socket_family, SOCK_STREAM, 0); - + #ifdef WORKING_IPV6 /* if that address family actually isn't supported, just try AF_INET */ if (server_socket == -1 && errno == EAFNOSUPPORT) { + g_debug("stream_server retrying socket with AF_INET"); socket_family = AF_INET; server_socket = socket(AF_INET, SOCK_STREAM, 0); } #endif if (server_socket == -1) { save_errno = errno; - dbprintf(_("stream_server: socket() failed: %s\n"), + g_debug(_("stream_server: socket() failed: %s"), strerror(save_errno)); errno = save_errno; return -1; @@ -89,20 +91,20 @@ stream_server( aclose(server_socket); errno = EMFILE; /* out of range */ save_errno = errno; - dbprintf(_("stream_server: socket out of range: %d\n"), + g_debug(_("stream_server: socket out of range: %d"), server_socket); errno = save_errno; return -1; } - SS_INIT(&server, socket_family); - SS_SET_INADDR_ANY(&server); + SU_INIT(&server, socket_family); + SU_SET_INADDR_ANY(&server); #ifdef USE_REUSEADDR r = setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, - (void *)&on, (socklen_t)sizeof(on)); + (void *)&on, (socklen_t_equiv)sizeof(on)); if (r < 0) { - dbprintf(_("stream_server: setsockopt(SO_REUSEADDR) failed: %s\n"), + g_debug(_("stream_server: setsockopt(SO_REUSEADDR) failed: %s"), strerror(errno)); } #endif @@ -132,26 +134,26 @@ stream_server( if (bind_portrange(server_socket, &server, (in_port_t)portrange[0], (in_port_t)portrange[1], "tcp") == 0) goto out; - dbprintf(_("stream_server: Could not bind to port in range: %d - %d.\n"), + g_debug(_("stream_server: Could not bind to port in range: %d - %d."), portrange[0], portrange[1]); } else { socklen = SS_LEN(&server); if (bind(server_socket, (struct sockaddr *)&server, socklen) == 0) goto out; - dbprintf(_("stream_server: Could not bind to any port: %s\n"), + g_debug(_("stream_server: Could not bind to any port: %s"), strerror(errno)); } if (retries >= BIND_CYCLE_RETRIES) break; - dbprintf(_("stream_server: Retrying entire range after 10 second delay.\n")); + g_debug(_("stream_server: Retrying entire range after 10 second delay.")); sleep(15); } save_errno = errno; - dbprintf(_("stream_server: bind(in6addr_any) failed: %s\n"), + g_debug(_("stream_server: bind(in6addr_any) failed: %s"), strerror(save_errno)); aclose(server_socket); errno = save_errno; @@ -165,7 +167,7 @@ out: len = SIZEOF(server); if(getsockname(server_socket, (struct sockaddr *)&server, &len) == -1) { save_errno = errno; - dbprintf(_("stream_server: getsockname() failed: %s\n"), + g_debug(_("stream_server: getsockname() failed: %s"), strerror(save_errno)); aclose(server_socket); errno = save_errno; @@ -174,10 +176,10 @@ out: #ifdef SO_KEEPALIVE r = setsockopt(server_socket, SOL_SOCKET, SO_KEEPALIVE, - (void *)&on, (socklen_t)sizeof(on)); + (void *)&on, (socklen_t_equiv)sizeof(on)); if(r == -1) { save_errno = errno; - dbprintf(_("stream_server: setsockopt(SO_KEEPALIVE) failed: %s\n"), + g_debug(_("stream_server: setsockopt(SO_KEEPALIVE) failed: %s"), strerror(save_errno)); aclose(server_socket); errno = save_errno; @@ -185,8 +187,8 @@ out: } #endif - *portp = SS_GET_PORT(&server); - dbprintf(_("stream_server: waiting for connection: %s\n"), + *portp = SU_GET_PORT(&server); + g_debug(_("stream_server: waiting for connection: %s"), str_sockaddr(&server)); return server_socket; } @@ -201,11 +203,11 @@ stream_client_internal( int nonblock, int priv) { - struct sockaddr_storage svaddr, claddr; - int save_errno; + sockaddr_union svaddr, claddr; + int save_errno = 0; char *f; - int client_socket; - int *portrange; + int client_socket = 0; + int *portrange = NULL; int result; struct addrinfo *res, *res_addr; @@ -213,23 +215,23 @@ stream_client_internal( result = resolve_hostname(hostname, SOCK_STREAM, &res, NULL); if(result != 0) { - dbprintf(_("resolve_hostname(%s): %s\n"), hostname, gai_strerror(result)); + g_debug(_("resolve_hostname(%s): %s"), hostname, gai_strerror(result)); errno = EHOSTUNREACH; return -1; } if(!res) { - dbprintf(_("resolve_hostname(%s): no results\n"), hostname); + g_debug(_("resolve_hostname(%s): no results"), hostname); errno = EHOSTUNREACH; return -1; } for (res_addr = res; res_addr != NULL; res_addr = res_addr->ai_next) { /* copy the first (preferred) address we found */ - copy_sockaddr(&svaddr, res_addr->ai_addr); - SS_SET_PORT(&svaddr, port); + copy_sockaddr(&svaddr, (sockaddr_union *)res_addr->ai_addr); + SU_SET_PORT(&svaddr, port); - SS_INIT(&claddr, svaddr.ss_family); - SS_SET_INADDR_ANY(&claddr); + SU_INIT(&claddr, SU_GET_FAMILY(&svaddr)); + SU_SET_INADDR_ANY(&claddr); /* * If a privileged port range was requested, we try to get a port in @@ -259,7 +261,7 @@ stream_client_internal( if (client_socket > 0) goto out; - dbprintf(_("stream_client: Could not bind to port in range %d-%d.\n"), + g_debug(_("stream_client: Could not bind to port in range %d-%d."), portrange[0], portrange[1]); errno = save_errno; @@ -269,7 +271,7 @@ out: try_socksize(client_socket, SO_SNDBUF, sendsize); try_socksize(client_socket, SO_RCVBUF, recvsize); if (localport != NULL) - *localport = SS_GET_PORT(&claddr); + *localport = SU_GET_PORT(&claddr); return client_socket; } @@ -310,8 +312,8 @@ stream_client( } /* don't care about these values */ -static struct sockaddr_storage addr; -static socklen_t addrlen; +static sockaddr_union addr; +static socklen_t_equiv addrlen; int stream_accept( @@ -340,21 +342,21 @@ stream_accept( if(nfound <= 0 || !FD_ISSET(server_socket, &readset)) { save_errno = errno; if(nfound < 0) { - dbprintf(_("stream_accept: select() failed: %s\n"), + g_debug(_("stream_accept: select() failed: %s"), strerror(save_errno)); } else if(nfound == 0) { - dbprintf(plural(_("stream_accept: timeout after %d second\n"), - _("stream_accept: timeout after %d seconds\n"), + g_debug(plural(_("stream_accept: timeout after %d second"), + _("stream_accept: timeout after %d seconds"), timeout), timeout); - errno = ENOENT; /* ??? */ + errno = ETIMEDOUT; return -1; } else if (!FD_ISSET(server_socket, &readset)) { int i; for(i = 0; i < server_socket + 1; i++) { if(FD_ISSET(i, &readset)) { - dbprintf(_("stream_accept: got fd %d instead of %d\n"), + g_debug(_("stream_accept: got fd %d instead of %d"), i, server_socket); } @@ -369,43 +371,43 @@ stream_accept( } while (nfound <= 0); while(1) { - addrlen = (socklen_t)sizeof(struct sockaddr_storage); + addrlen = (socklen_t_equiv)sizeof(sockaddr_union); connected_socket = accept(server_socket, (struct sockaddr *)&addr, &addrlen); if(connected_socket < 0) { break; } - dbprintf(_("stream_accept: connection from %s\n"), + g_debug(_("stream_accept: connection from %s"), str_sockaddr(&addr)); /* * Make certain we got an inet connection and that it is not * from port 20 (a favorite unauthorized entry tool). */ - if (addr.ss_family == (sa_family_t)AF_INET + if (SU_GET_FAMILY(&addr) == AF_INET #ifdef WORKING_IPV6 - || addr.ss_family == (sa_family_t)AF_INET6 + || SU_GET_FAMILY(&addr) == AF_INET6 #endif ){ - port = SS_GET_PORT(&addr); + port = SU_GET_PORT(&addr); if (port != (in_port_t)20) { try_socksize(connected_socket, SO_SNDBUF, sendsize); try_socksize(connected_socket, SO_RCVBUF, recvsize); return connected_socket; } else { - dbprintf(_("remote port is %u: ignored\n"), + g_debug(_("remote port is %u: ignored"), (unsigned int)port); } } else { #ifdef WORKING_IPV6 - dbprintf(_("family is %d instead of %d(AF_INET)" - " or %d(AF_INET6): ignored\n"), - addr.ss_family, + g_debug(_("family is %d instead of %d(AF_INET)" + " or %d(AF_INET6): ignored"), + SU_GET_FAMILY(&addr), AF_INET, AF_INET6); #else - dbprintf(_("family is %d instead of %d(AF_INET)" - ": ignored\n"), - addr.ss_family, + g_debug(_("family is %d instead of %d(AF_INET)" + ": ignored"), + SU_GET_FAMILY(&addr), AF_INET); #endif } @@ -413,7 +415,7 @@ stream_accept( } save_errno = errno; - dbprintf(_("stream_accept: accept() failed: %s\n"), + g_debug(_("stream_accept: accept() failed: %s"), strerror(save_errno)); errno = save_errno; return -1; @@ -436,15 +438,15 @@ try_socksize( /* keep trying, get as big a buffer as possible */ while((isize > 1024) && (setsockopt(sock, SOL_SOCKET, - which, (void *) &isize, (socklen_t)sizeof(isize)) < 0)) { + which, (void *) &isize, (socklen_t_equiv)sizeof(isize)) < 0)) { isize -= 1024; } if(isize > 1024) { - dbprintf(_("try_socksize: %s buffer size is %d\n"), + g_debug(_("try_socksize: %s buffer size is %d"), (which == SO_SNDBUF) ? _("send") : _("receive"), isize); } else { - dbprintf(_("try_socksize: could not allocate %s buffer of %zu\n"), + g_debug(_("try_socksize: could not allocate %s buffer of %zu"), (which == SO_SNDBUF) ? _("send") : _("receive"), origsize); }