]> 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 a4d5c44f56ee17ff1d96760ef66f5622fb33bbbb..6c2c6a00d5e266e2815f0c7518ad1177bea083ac 100644 (file)
@@ -215,55 +215,6 @@ void bnet_suppress_error_messages(BSOCK * bsock, bool flag)
    bsock->suppress_error_msgs = flag;
 }
 
-
-/*
- * Transmit spooled data now to a BSOCK
- */
-int bnet_despool_to_bsock(BSOCK * bsock, void update_attr_spool_size(ssize_t size),
-                          ssize_t tsize)
-{
-   int32_t pktsiz;
-   size_t nbytes;
-   ssize_t last = 0, size = 0;
-   int count = 0;
-
-   rewind(bsock->spool_fd);
-   while (fread((char *)&pktsiz, 1, sizeof(int32_t), bsock->spool_fd) ==
-          sizeof(int32_t)) {
-      size += sizeof(int32_t);
-      bsock->msglen = ntohl(pktsiz);
-      if (bsock->msglen > 0) {
-         if (bsock->msglen > (int32_t) sizeof_pool_memory(bsock->msg)) {
-            bsock->msg = realloc_pool_memory(bsock->msg, bsock->msglen + 1);
-         }
-         nbytes = fread(bsock->msg, 1, bsock->msglen, bsock->spool_fd);
-         if (nbytes != (size_t) bsock->msglen) {
-            berrno be;
-            Dmsg2(400, "nbytes=%d msglen=%d\n", nbytes, bsock->msglen);
-            Qmsg1(bsock->jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
-                  be.strerror());
-            update_attr_spool_size(tsize - last);
-            return 0;
-         }
-         size += nbytes;
-         if ((++count & 0x3F) == 0) {
-            update_attr_spool_size(size - last);
-            last = size;
-         }
-      }
-      bnet_send(bsock);
-   }
-   update_attr_spool_size(tsize - last);
-   if (ferror(bsock->spool_fd)) {
-      berrno be;
-      Qmsg1(bsock->jcr(), M_FATAL, 0, _("fread attr spool error. ERR=%s\n"),
-            be.strerror());
-      return 0;
-   }
-   return 1;
-}
-
-
 /*
  * Send a message over the network. The send consists of
  * two network packets. The first is sends a 32 bit integer containing
@@ -277,82 +228,6 @@ bool bnet_send(BSOCK *bsock)
    return bsock->send();
 }
 
-#ifdef xxx
-bool bnet_send(BSOCK * bsock)
-{
-   int32_t rc;
-   int32_t pktsiz;
-
-   if (bsock->errors || bsock->terminated || bsock->msglen > 1000000) {
-      return false;
-   }
-   pktsiz = htonl((int32_t)bsock->msglen);
-   /* send int32_t containing size of data packet */
-   bsock->timer_start = watchdog_time;  /* start timer */
-   bsock->timed_out = 0;
-   rc = write_nbytes(bsock, (char *)&pktsiz, sizeof(int32_t));
-   bsock->timer_start = 0;         /* clear timer */
-   if (rc != sizeof(int32_t)) {
-      if (bsock->msglen == BNET_TERMINATE) {    /* if we were terminating */
-         bsock->terminated = 1;
-         return false;             /* ignore any errors */
-      }
-      bsock->errors++;
-      if (errno == 0) {
-         bsock->b_errno = EIO;
-      } else {
-         bsock->b_errno = errno;
-      }
-      if (rc < 0) {
-         if (!bsock->suppress_error_msgs && !bsock->timed_out) {
-            Qmsg4(bsock->jcr(), M_ERROR, 0,
-                  _("Write error sending len to %s:%s:%d: ERR=%s\n"), bsock->who,
-                  bsock->host(), bsock->port(), bnet_strerror(bsock));
-         }
-      } else {
-         Qmsg5(bsock->jcr(), M_ERROR, 0,
-               _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"),
-               sizeof(int32_t), bsock->who(),
-               bsock->host(), bsock->port(), rc);
-      }
-      return false;
-   }
-
-   bsock->out_msg_no++;            /* increment message number */
-   if (bsock->msglen <= 0) {       /* length only? */
-      return true;                 /* yes, no data */
-   }
-
-   /* send data packet */
-   bsock->timer_start = watchdog_time;  /* start timer */
-   bsock->timed_out = 0;
-   rc = write_nbytes(bsock, bsock->msg, bsock->msglen);
-   bsock->timer_start = 0;         /* clear timer */
-   if (rc != bsock->msglen) {
-      bsock->errors++;
-      if (errno == 0) {
-         bsock->b_errno = EIO;
-      } else {
-         bsock->b_errno = errno;
-      }
-      if (rc < 0) {
-         if (!bsock->suppress_error_msgs) {
-            Qmsg5(bsock->jcr(), M_ERROR, 0,
-                  _("Write error sending %d bytes to %s:%s:%d: ERR=%s\n"), 
-                  bsock->msglen, bsock->who(),
-                  bsock->host(), bsock->port(), bnet_strerror(bsock));
-         }
-      } else {
-         Qmsg5(bsock->jcr(), M_ERROR, 0,
-               _("Wrote %d bytes to %s:%s:%d, but only %d accepted.\n"),
-               bsock->msglen, bsock->who(), bsock->host(), 
-               bsock->port(), rc);
-      }
-      return false;
-   }
-   return true;
-}
-#endif
 
 /*
  * Establish a TLS connection -- server side
@@ -441,16 +316,19 @@ err:
    return false;
 }
 #else
+
 bool bnet_tls_server(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list)
 {
    Jmsg(bsock->jcr(), M_ABORT, 0, _("TLS enabled but not configured.\n"));
    return false;
 }
-bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list, int verify_hostname)
+
+bool bnet_tls_client(TLS_CONTEXT *ctx, BSOCK * bsock, alist *verify_list)
 {
    Jmsg(bsock->jcr(), M_ABORT, 0, _("TLS enable but not configured.\n"));
    return false;
 }
+
 #endif /* HAVE_TLS */
 
 /*
@@ -677,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;
@@ -726,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;
@@ -760,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)
 {
@@ -768,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());
@@ -789,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;
 }
 
@@ -839,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);
@@ -869,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) {