]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bnet.c
const char * additions
[bacula/bacula] / bacula / src / lib / bnet.c
index be35ef7d5df0bb66d4b89ffe4f021ae140c778da..f936cc4dc5555ec1447e32bf5bd19e14c2978330 100644 (file)
@@ -42,7 +42,13 @@ extern time_t watchdog_time;
 #define ENODATA EPIPE
 #endif
 
-
+#ifdef HAVE_WIN32
+#define socketRead(fd, buf, len) recv(fd, buf, len, 0)
+#define socketWrite(fd, buf, len) send(fd, buf, len, 0)
+#else
+#define socketRead(fd, buf, len) read(fd, buf, len)
+#define socketWrite(fd, buf, len) write(fd, buf, len)
+#endif
 
 
 /*
@@ -59,7 +65,7 @@ static int32_t read_nbytes(BSOCK *bsock, char *ptr, int32_t nbytes)
    while (nleft > 0) {
       do {
         errno = 0;
-        nread = read(bsock->fd, ptr, nleft);    
+        nread = socketRead(bsock->fd, ptr, nleft);      
         if (bsock->timed_out || bsock->terminated) {
            return nread;
         }
@@ -95,7 +101,7 @@ static int32_t write_nbytes(BSOCK *bsock, char *ptr, int32_t nbytes)
    while (nleft > 0) {
       do {
         errno = 0;
-        nwritten = write(bsock->fd, ptr, nleft);
+        nwritten = socketWrite(bsock->fd, ptr, nleft);
         if (bsock->timed_out || bsock->terminated) {
            return nwritten;
         }
@@ -272,9 +278,9 @@ bnet_suppress_error_messages(BSOCK *bsock, int flag)
 
 
 /*
- * Transmit spooled data now
+ * Transmit spooled data now to a BSOCK
  */
-int bnet_despool(BSOCK *bsock)
+int bnet_despool_to_bsock(BSOCK *bsock)
 {
    int32_t pktsiz;
    size_t nbytes;
@@ -284,7 +290,7 @@ int bnet_despool(BSOCK *bsock)
       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);
+           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) {
@@ -318,11 +324,10 @@ bnet_send(BSOCK *bsock)
    int32_t pktsiz;
    int32_t msglen;
 
-   if (bsock->errors || bsock->terminated) {
+   if (bsock->errors || bsock->terminated || bsock->msglen > 1000000) {
       return 0;
    }
    msglen = bsock->msglen;
-   ASSERT(bsock->msglen < 1000000);
    pktsiz = htonl((int32_t)bsock->msglen);
    /* send int32_t containing size of data packet */
    bsock->timer_start = watchdog_time; /* start timer */
@@ -354,7 +359,6 @@ bnet_send(BSOCK *bsock)
 
    bsock->out_msg_no++;              /* increment message number */
    if (bsock->msglen <= 0) {         /* length only? */
-      ASSERT(msglen == bsock->msglen);
       return 1;                      /* yes, no data */
    }
 
@@ -381,7 +385,6 @@ bnet_send(BSOCK *bsock)
       }
       return 0;
    }
-   ASSERT(msglen == bsock->msglen);
    return 1;
 }
 
@@ -493,8 +496,9 @@ bnet_wait_data_intr(BSOCK *bsock, int sec)
 #define NO_DATA        4       /* Valid name, no data record of requested type. */
 #endif
 
+#ifndef HAVE_WIN32
 extern int h_errno;            /* On error has one of the above */
-
+#endif
 /*
  * Get human readable error for gethostbyname()
  */
@@ -540,7 +544,7 @@ static uint32_t *bget_host_ip(JCR *jcr, char *host)
    } else {
       P(ip_mutex);
       if ((hp = gethostbyname(host)) == NULL) {
-         Jmsg2(jcr, M_ERROR, 0, "gethostbyname() for %s failed: ERR=%s\n", 
+         Jmsg2(jcr, M_ERROR, 0, "gethostbyname() for host \"%s\" failed: ERR=%s\n", 
               host, gethost_strerror());
         V(ip_mutex);
         return NULL;
@@ -625,7 +629,7 @@ bnet_open(JCR *jcr, char *name, char *host, char *service, int port, int *fatal)
       close(sockfd);
       return NULL;
    }
-   return init_bsock(jcr, sockfd, name, host, port);
+   return init_bsock(jcr, sockfd, name, host, port, &tcp_serv_addr);
 }
 
 /*
@@ -678,7 +682,7 @@ char *bnet_strerror(BSOCK *bsock)
  *          1 on success
  */
 int
-bnet_fsend(BSOCK *bs, char *fmt, ...)
+bnet_fsend(BSOCK *bs, const char *fmt, ...)
 {
    va_list arg_ptr;
    int maxlen;
@@ -697,7 +701,7 @@ again:
    bs->msglen = bvsnprintf(mp_chr(bs->msg), maxlen, fmt, arg_ptr);
    va_end(arg_ptr);
    if (bs->msglen < 0 || bs->msglen >= maxlen) {
-      bs->msg = realloc_pool_memory(bs->msg, maxlen + 200);
+      bs->msg = realloc_pool_memory(bs->msg, maxlen + maxlen / 2);
       goto again;
    }
    return bnet_send(bs);
@@ -712,7 +716,7 @@ again:
  */
 int bnet_set_buffer_size(BSOCK *bs, uint32_t size, int rw)
 {
-   uint32_t dbuf_size;
+   uint32_t dbuf_size, start_size;
 #if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)
    int opt;
 
@@ -720,7 +724,12 @@ int bnet_set_buffer_size(BSOCK *bs, uint32_t size, int rw)
     setsockopt(bs->fd, IPPROTO_IP, IP_TOS, (sockopt_val_t)&opt, sizeof(opt));
 #endif
 
-   dbuf_size = size;
+   if (size != 0) {
+      dbuf_size = size;
+   } else {
+      dbuf_size = DEFAULT_NETWORK_BUFFER_SIZE;
+   }
+   start_size = dbuf_size;
    if ((bs->msg = realloc_pool_memory(bs->msg, dbuf_size+100)) == NULL) {
       Jmsg0(bs->jcr, M_FATAL, 0, _("Could not malloc BSOCK data buffer\n"));
       return 0;
@@ -732,14 +741,20 @@ int bnet_set_buffer_size(BSOCK *bs, uint32_t size, int rw)
         dbuf_size -= TAPE_BSIZE;
       }
       Dmsg1(200, "set network buffer size=%d\n", dbuf_size);
-      if (dbuf_size != MAX_NETWORK_BUFFER_SIZE)
+      if (dbuf_size != start_size) {
          Jmsg1(bs->jcr, M_WARNING, 0, _("Warning network buffer = %d bytes not max size.\n"), dbuf_size);
+      }
       if (dbuf_size % TAPE_BSIZE != 0) {
          Jmsg1(bs->jcr, M_ABORT, 0, _("Network buffer size %d not multiple of tape block size.\n"),
              dbuf_size);
       }
    }
-   dbuf_size = size;
+   if (size != 0) {
+      dbuf_size = size;
+   } else {
+      dbuf_size = DEFAULT_NETWORK_BUFFER_SIZE;
+   }
+   start_size = dbuf_size;
    if (rw & BNET_SETBUF_WRITE) {
       while ((dbuf_size > TAPE_BSIZE) &&
         (setsockopt(bs->fd, SOL_SOCKET, SO_SNDBUF, (sockopt_val_t)&dbuf_size, sizeof(dbuf_size)) < 0)) {
@@ -747,8 +762,9 @@ int bnet_set_buffer_size(BSOCK *bs, uint32_t size, int rw)
         dbuf_size -= TAPE_BSIZE;
       }
       Dmsg1(200, "set network buffer size=%d\n", dbuf_size);
-      if (dbuf_size != MAX_NETWORK_BUFFER_SIZE)
+      if (dbuf_size != start_size) {
          Jmsg1(bs->jcr, M_WARNING, 0, _("Warning network buffer = %d bytes not max size.\n"), dbuf_size);
+      }
       if (dbuf_size % TAPE_BSIZE != 0) {
          Jmsg1(bs->jcr, M_ABORT, 0, _("Network buffer size %d not multiple of tape block size.\n"),
              dbuf_size);
@@ -807,7 +823,8 @@ char *bnet_sig_to_ascii(BSOCK *bs)
  *  This probably should be done in net_open
  */
 BSOCK *
-init_bsock(JCR *jcr, int sockfd, char *who, char *host, int port) 
+init_bsock(JCR *jcr, int sockfd, char *who, char *host, int port, 
+          struct sockaddr_in *client_addr) 
 {
    BSOCK *bsock = (BSOCK *)malloc(sizeof(BSOCK));
    memset(bsock, 0, sizeof(BSOCK));
@@ -818,6 +835,7 @@ init_bsock(JCR *jcr, int sockfd, char *who, char *host, int port)
    bsock->who = bstrdup(who);
    bsock->host = bstrdup(host);
    bsock->port = port;
+   memcpy(&bsock->client_addr, client_addr, sizeof(bsock->client_addr));
    /*
     * ****FIXME**** reduce this to a few hours once   
     *  heartbeats are implemented