]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bnet.c
Restore win32 dir from Branch-5.2 and update it
[bacula/bacula] / bacula / src / lib / bnet.c
index 52c8e05e73c111519978c985a903ab49b0c7eb9e..584388d1656f71fdf0224ddb05764bbd81f020e8 100644 (file)
@@ -1,8 +1,7 @@
 /*
    Bacula(R) - The Network Backup Solution
 
-   Copyright (C) 2000-2015 Kern Sibbald
-   Copyright (C) 2000-2014 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2018 Kern Sibbald
 
    The original author of Bacula is Kern Sibbald, with contributions
    from many others, a complete list can be found in the file AUTHORS.
@@ -12,7 +11,7 @@
    Public License, v3.0 ("AGPLv3") and some additional permissions and
    terms pursuant to its AGPLv3 Section 7.
 
-   This notice must be preserved when any source code is 
+   This notice must be preserved when any source code is
    conveyed and/or propagated.
 
    Bacula(R) is a registered trademark of Kern Sibbald.
@@ -176,18 +175,11 @@ int32_t write_nbytes(BSOCK * bsock, char *ptr, int32_t nbytes)
       } while (nwritten == -1 && errno == EINTR);
       /*
        * If connection is non-blocking, we will get EAGAIN, so
-       * use select() to keep from consuming all the CPU
+       * use select()/poll to keep from consuming all the CPU
        * and try again.
        */
       if (nwritten == -1 && errno == EAGAIN) {
-         fd_set fdset;
-         struct timeval tv;
-
-         FD_ZERO(&fdset);
-         FD_SET((unsigned)bsock->m_fd, &fdset);
-         tv.tv_sec = 1;
-         tv.tv_usec = 0;
-         select(bsock->m_fd + 1, NULL, &fdset, NULL, &tv);
+         fd_wait_data(bsock->m_fd, WAIT_WRITE, 1, 0);
          continue;
       }
       if (nwritten <= 0) {
@@ -535,23 +527,64 @@ const char *bnet_sig_to_ascii(int32_t msglen)
    static char buf[30];
    switch (msglen) {
    case BNET_EOD:
-      return "BNET_EOD";           /* end of data stream */
+      return "BNET_EOD";        /* End of data stream, new data may follow */
    case BNET_EOD_POLL:
-      return "BNET_EOD_POLL";
+      return "BNET_EOD_POLL";   /* End of data and poll all in one */
    case BNET_STATUS:
-      return "BNET_STATUS";
+      return "BNET_STATUS";     /* Send full status */
    case BNET_TERMINATE:
-      return "BNET_TERMINATE";     /* terminate connection */
+      return "BNET_TERMINATE";  /* Conversation terminated, doing close() */
    case BNET_POLL:
-      return "BNET_POLL";
+      return "BNET_POLL";       /* Poll request, I'm hanging on a read */
    case BNET_HEARTBEAT:
-      return "BNET_HEARTBEAT";
+      return "BNET_HEARTBEAT";  /* Heartbeat Response requested */
    case BNET_HB_RESPONSE:
-      return "BNET_HB_RESPONSE";
+      return "BNET_HB_RESPONSE"; /* Only response permited to HB */
+   case BNET_BTIME:
+      return "BNET_BTIME";      /* Send UTC btime */
+   case BNET_BREAK:
+      return "BNET_BREAK";      /* Stop current command -- ctl-c */
+   case BNET_START_SELECT:
+      return "BNET_START_SELECT"; /* Start of a selection list */
+   case BNET_END_SELECT:
+      return "BNET_END_SELECT"; /* End of a select list */
+   case BNET_INVALID_CMD:
+      return "BNET_INVALID_CMD"; /* Invalid command sent */
+   case BNET_CMD_FAILED:
+      return "BNET_CMD_FAILED"; /* Command failed */
+   case BNET_CMD_OK:
+      return "BNET_CMD_OK";     /* Command succeeded */
+   case BNET_CMD_BEGIN:
+      return "BNET_CMD_BEGIN";  /* Start command execution */
+   case BNET_MSGS_PENDING:
+      return "BNET_MSGS_PENDING"; /* Messages pending */
+   case BNET_MAIN_PROMPT:
+      return "BNET_MAIN_PROMPT"; /* Server ready and waiting */
+   case BNET_SELECT_INPUT:
+      return "BNET_SELECT_INPUT"; /* Return selection input */
+   case BNET_WARNING_MSG:
+      return "BNET_WARNING_MSG"; /* Warning message */
+   case BNET_ERROR_MSG:
+      return "BNET_ERROR_MSG";  /* Error message -- command failed */
+   case BNET_INFO_MSG:
+      return "BNET_INFO_MSG";   /* Info message -- status line */
+   case BNET_RUN_CMD:
+      return "BNET_RUN_CMD";    /* Run command follows */
+   case BNET_YESNO:
+      return "BNET_YESNO";      /* Request yes no response */
+   case BNET_START_RTREE:
+      return "BNET_START_RTREE"; /* Start restore tree mode */
+   case BNET_END_RTREE:
+      return "BNET_END_RTREE";  /* End restore tree mode */
    case BNET_SUB_PROMPT:
-      return "BNET_SUB_PROMPT";
+      return "BNET_SUB_PROMPT"; /* Indicate we are at a subprompt */
    case BNET_TEXT_INPUT:
-      return "BNET_TEXT_INPUT";
+      return "BNET_TEXT_INPUT"; /* Get text input from user */
+   case BNET_EXT_TERMINATE:
+       return "BNET_EXT_TERMINATE"; /* A Terminate condition has been met and
+                               already reported somewhere else */
+   case BNET_FDCALLED      :
+      return "BNET_FDCALLED"; /* The FD should keep the connection for a new job */
    default:
       bsnprintf(buf, sizeof(buf), _("Unknown sig %d"), (int)msglen);
       return buf;
@@ -559,25 +592,28 @@ const char *bnet_sig_to_ascii(int32_t msglen)
 }
 
 /* Initialize internal socket structure.
- *  This probably should be done in net_open
+ *  This probably should be done in bsock.c
  */
-BSOCK *init_bsock(JCR * jcr, int sockfd, const char *who, const char *host, int port,
-                  struct sockaddr *client_addr)
+BSOCK *init_bsock(JCR *jcr, int sockfd, const char *who,
+                   const char *host, int port, struct sockaddr *client_addr)
 {
-   Dmsg3(100, "who=%s host=%s port=%d\n", who, host, port);
+   Dmsg4(100, "socket=%d who=%s host=%s port=%d\n", sockfd, who, host, port);
    BSOCK *bsock = (BSOCK *)malloc(sizeof(BSOCK));
-   memset(bsock, 0, sizeof(BSOCK));
+   bmemzero(bsock, sizeof(BSOCK));
+   bsock->m_master=bsock; /* don't use set_master() here */
    bsock->m_fd = sockfd;
    bsock->tls = NULL;
    bsock->errors = 0;
    bsock->m_blocking = 1;
    bsock->pout_msg_no = &bsock->out_msg_no;
+   bsock->uninstall_send_hook_cb();
    bsock->msg = get_pool_memory(PM_BSOCK);
+   bsock->cmsg = get_pool_memory(PM_BSOCK);
    bsock->errmsg = get_pool_memory(PM_MESSAGE);
    bsock->set_who(bstrdup(who));
    bsock->set_host(bstrdup(host));
    bsock->set_port(port);
-   memset(&bsock->peer_addr, 0, sizeof(bsock->peer_addr));
+   bmemzero(&bsock->peer_addr, sizeof(bsock->peer_addr));
    memcpy(&bsock->client_addr, client_addr, sizeof(bsock->client_addr));
    bsock->timeout = BSOCK_TIMEOUT;
    bsock->set_jcr(jcr);
@@ -590,6 +626,7 @@ BSOCK *dup_bsock(BSOCK *osock)
    osock->set_locking();
    memcpy(bsock, osock, sizeof(BSOCK));
    bsock->msg = get_pool_memory(PM_BSOCK);
+   bsock->cmsg = get_pool_memory(PM_BSOCK);
    bsock->errmsg = get_pool_memory(PM_MESSAGE);
    if (osock->who()) {
       bsock->set_who(bstrdup(osock->who()));
@@ -601,6 +638,7 @@ BSOCK *dup_bsock(BSOCK *osock)
       bsock->src_addr = New( IPADDR( *(osock->src_addr)) );
    }
    bsock->set_duped();
+   bsock->set_master(osock);
    return bsock;
 }