]> 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 c92bdc7ab42cdaa64092f665960a1d5e29385605..6c2c6a00d5e266e2815f0c7518ad1177bea083ac 100644 (file)
@@ -555,8 +555,8 @@ dlist *bnet_host2ipaddrs(const char *host, int family, const char **errstr)
  * Returns BSOCK * pointer on success
  *
  */
-static BSOCK *bnet_open(JCR * jcr, const char *name, char *host, char *service,
-                        int port, int *fatal)
+static BSOCK *bnet_open(JCR *jcr, const char *name, char *host, char *service,
+                        int port, utime_t heart_beat, int *fatal)
 {
    int sockfd = -1;
    dlist *addr_list;
@@ -604,6 +604,17 @@ static BSOCK *bnet_open(JCR * jcr, const char *name, char *host, char *service,
          Qmsg1(jcr, M_WARNING, 0, _("Cannot set SO_KEEPALIVE on socket: %s\n"),
                be.strerror());
       }
+#if defined(TCP_KEEPIDLE)
+      if (heart_beat) {
+         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_KEEPIDLE on socket: %s\n"),
+                  be.strerror());
+         }
+      }
+#endif
+
       /* connect to server */
       if (connect(sockfd, ipaddr->get_sockaddr(), ipaddr->get_sockaddr_len()) < 0) {
          save_errno = errno;
@@ -638,6 +649,7 @@ static BSOCK *bnet_open(JCR * jcr, const char *name, char *host, char *service,
  * Try to connect to host for max_retry_time at retry_time intervals.
  */
 BSOCK *bnet_connect(JCR * jcr, int retry_interval, utime_t max_retry_time,
+                    utime_t heart_beat,
                     const char *name, char *host, char *service, int port,
                     int verbose)
 {
@@ -646,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;
 
-   for (i = 0; (bsock = bnet_open(jcr, name, host, service, port, &fatal)) == 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());
@@ -667,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;
 }
 
@@ -717,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);
@@ -747,9 +770,8 @@ bool bnet_set_buffer_size(BSOCK * bs, uint32_t size, int rw)
    uint32_t dbuf_size, start_size;
 #if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)
    int opt;
-
    opt = IPTOS_THROUGHPUT;
-   setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t) & opt, sizeof(opt));
+   setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t)&opt, sizeof(opt));
 #endif
 
    if (size != 0) {