lintian doesn't like orphan packages with uploaders...
[debian/amanda] / common-src / stream.c
index 96d3b6fdab00a0b24a1419c4f502a6e1d21906aa..e45d27d7358a510fe9e22a60f85073933ccb1882 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Amanda, The Advanced Maryland Automatic Network Disk Archiver
  * Copyright (c) 1991-1998 University of Maryland at College Park
+ * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
  * All Rights Reserved.
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
@@ -205,14 +206,11 @@ stream_client_internal(
 {
     sockaddr_union svaddr, claddr;
     int save_errno = 0;
-    char *f;
     int client_socket = 0;
     int *portrange = NULL;
     int result;
     struct addrinfo *res, *res_addr;
 
-    f = priv ? "stream_client_privileged" : "stream_client";
-
     result = resolve_hostname(hostname, SOCK_STREAM, &res, NULL);
     if(result != 0) {
        g_debug(_("resolve_hostname(%s): %s"), hostname, gai_strerror(result));
@@ -315,6 +313,14 @@ stream_client(
 static sockaddr_union addr;
 static socklen_t_equiv addrlen;
 
+static gboolean
+stream_accept_prolong(
+    gpointer data)
+{
+    time_t *tp = data;
+    return time(NULL) <= *tp;
+}
+
 int
 stream_accept(
     int server_socket,
@@ -322,60 +328,31 @@ stream_accept(
     size_t sendsize,
     size_t recvsize)
 {
-    SELECT_ARG_TYPE readset;
-    struct timeval tv;
-    int nfound, connected_socket;
+    time_t timeout_time;
+    int connected_socket;
     int save_errno;
-    int ntries = 0;
     in_port_t port;
 
     assert(server_socket >= 0);
 
-    do {
-       ntries++;
-       memset(&tv, 0, SIZEOF(tv));
-       tv.tv_sec = timeout;
-       memset(&readset, 0, SIZEOF(readset));
-       FD_ZERO(&readset);
-       FD_SET(server_socket, &readset);
-       nfound = select(server_socket+1, &readset, NULL, NULL, &tv);
-       if(nfound <= 0 || !FD_ISSET(server_socket, &readset)) {
-           save_errno = errno;
-           if(nfound < 0) {
-               g_debug(_("stream_accept: select() failed: %s"),
-                     strerror(save_errno));
-           } else if(nfound == 0) {
-               g_debug(plural(_("stream_accept: timeout after %d second"),
-                               _("stream_accept: timeout after %d seconds"),
-                              timeout),
-                        timeout);
-               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)) {
-                       g_debug(_("stream_accept: got fd %d instead of %d"),
-                             i,
-                             server_socket);
-                   }
-               }
-               save_errno = EBADF;
-           }
-           if (ntries > 5) {
-               errno = save_errno;
-               return -1;
-           }
-        }
-    } while (nfound <= 0);
+    /* set the time we want to stop accepting */
+    timeout_time = time(NULL) + timeout;
 
     while(1) {
        addrlen = (socklen_t_equiv)sizeof(sockaddr_union);
-       connected_socket = accept(server_socket,
+       connected_socket = interruptible_accept(server_socket,
                                  (struct sockaddr *)&addr,
-                                 &addrlen);
+                                 &addrlen, stream_accept_prolong,
+                                 &timeout_time);
        if(connected_socket < 0) {
+           if (errno == 0) {
+               g_debug(plural(_("stream_accept: timeout after %d second"),
+                              _("stream_accept: timeout after %d seconds"),
+                             timeout),
+                       timeout);
+               errno = ETIMEDOUT;
+               return -1;
+           }
            break;
        }
        g_debug(_("stream_accept: connection from %s"),