]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bnet.c
Working directory pane in restore. Will get this into the stack next.
[bacula/bacula] / bacula / src / lib / bnet.c
index bdf380bdc566849a1bc60e8250094424a434d9b4..6c2c6a00d5e266e2815f0c7518ad1177bea083ac 100644 (file)
@@ -609,7 +609,7 @@ static BSOCK *bnet_open(JCR *jcr, const char *name, char *host, char *service,
          int opt = heart_beat
          if (setsockopt(sockfd, IPPROTO_IP, TCP_KEEPIDLE, (sockopt_val_t)&opt, sizeof(opt)) < 0) {
             berrno be;
-            Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPALIVE on socket: %s\n"),
+            Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPIDLE on socket: %s\n"),
                   be.strerror());
          }
       }
@@ -658,12 +658,17 @@ BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time,
    int fatal = 0;
    time_t begin_time = time(NULL);
    time_t now;
+   btimer_t *tid = NULL;
 
+   /* Try to trap out of OS call when time expires */
+   tid = start_thread_timer(pthread_self(), (uint32_t)max_retry_time);
+   
    for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, heart_beat, &fatal)) == NULL;
         i -= retry_interval) {
       berrno be;
       if (fatal || (jcr && job_canceled(jcr))) {
-         return NULL;
+         bsock = NULL;
+         goto bail_out;
       }
       Dmsg4(100, "Unable to connect to %s on %s:%d. ERR=%s\n",
             name, host, port, be.strerror());
@@ -679,9 +684,15 @@ BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time,
       if (begin_time + max_retry_time <= now) {
          Qmsg4(jcr, M_FATAL, 0, _("Unable to connect to %s on %s:%d. ERR=%s\n"),
                name, host, port, be.strerror());
-         return NULL;
+         bsock = NULL;
+         goto bail_out;
       }
    }
+
+bail_out:
+   if (tid) {
+      stop_thread_timer(tid);
+   }
    return bsock;
 }
 
@@ -729,10 +740,10 @@ bool bnet_fsend(BSOCK * bs, const char *fmt, ...)
       bs->msg = realloc_pool_memory(bs->msg, maxlen + maxlen / 2);
    }
    return bs->send();
-// return bnet_send(bs);
 }
 
-int bnet_get_peer(BSOCK *bs, char *buf, socklen_t buflen) {
+int bnet_get_peer(BSOCK *bs, char *buf, socklen_t buflen) 
+{
 #if !defined(HAVE_WIN32)
     if (bs->peer_addr.sin_family == 0) {
         socklen_t salen = sizeof(bs->peer_addr);