]> git.sur5r.net Git - bacula/bacula/blobdiff - bacula/src/lib/bsock.c
update version
[bacula/bacula] / bacula / src / lib / bsock.c
index 6447fcf5eb45cb593508defb92a2815559fa8181..cc3231b2c0ae02541c932ab1e0a5ab807b488984 100644 (file)
@@ -1,12 +1,12 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2007-2008 Free Software Foundation Europe e.V.
+   Copyright (C) 2007-2011 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    This program is Free Software; you can redistribute it and/or
-   modify it under the terms of version two of the GNU General Public
+   modify it under the terms of version three of the GNU Affero General Public
    License as published by the Free Software Foundation and included
    in the file LICENSE.
 
@@ -15,7 +15,7 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    General Public License for more details.
 
-   You should have received a copy of the GNU General Public License
+   You should have received a copy of the GNU Affero General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
  *
  *  by Kern Sibbald
  *
- *   Version $Id: $
  */
 
-
 #include "bacula.h"
 #include "jcr.h"
 #include <netdb.h>
@@ -67,7 +65,7 @@ void BSOCK::init()
 {
    memset(this, 0, sizeof(BSOCK));
    m_blocking = 1;
-   msg = get_pool_memory(PM_MESSAGE);
+   msg = get_pool_memory(PM_BSOCK);
    errmsg = get_pool_memory(PM_MESSAGE);
    /*
     * ****FIXME**** reduce this to a few hours once
@@ -145,12 +143,11 @@ bail_out:
    return ok;
 }
 
-
 /*       
  * Finish initialization of the pocket structure.
  */
 void BSOCK::fin_init(JCR * jcr, int sockfd, const char *who, const char *host, int port,
-            struct sockaddr *lclient_addr)
+                     struct sockaddr *lclient_addr)
 {
    Dmsg3(100, "who=%s host=%s port=%d\n", who, host, port);
    m_fd = sockfd;
@@ -180,15 +177,13 @@ void BSOCK::set_source_address(dlist *src_addr_list)
    }
 }
 
-
 /*
  * Open a TCP connection to the server
  * Returns NULL
  * Returns BSOCK * pointer on success
- *
  */
 bool BSOCK::open(JCR *jcr, const char *name, char *host, char *service,
-            int port, utime_t heart_beat, int *fatal)
+                 int port, utime_t heart_beat, int *fatal)
 {
    int sockfd = -1;
    dlist *addr_list;
@@ -348,7 +343,7 @@ bool BSOCK::send()
       }
       return false;
    }
-   if (msglen > 1000000) {
+   if (msglen > 4000000) {
       if (!m_suppress_error_msgs) {
          Qmsg4(m_jcr, M_ERROR, 0,
             _("Socket has insane msglen=%d on call to %s:%s:%d\n"),
@@ -555,14 +550,17 @@ int32_t BSOCK::recv()
     * buffer is at least one byte longer than the message length.
     */
    msg[nbytes] = 0; /* terminate in case it is a string */
-   sm_check(__FILE__, __LINE__, false);
+   /*
+    * The following uses *lots* of resources so turn it on only for 
+    * serious debugging.
+    */
+   Dsm_check(300);
 
 get_out:
    if (m_use_locking) V(m_mutex);
    return nbytes;                  /* return actual length of message */
 }
 
-
 /*
  * Send a signal
  */
@@ -669,6 +667,7 @@ int BSOCK::get_peer(char *buf, socklen_t buflen)
 bool BSOCK::set_buffer_size(uint32_t size, int rw)
 {
    uint32_t dbuf_size, start_size;
+
 #if defined(IP_TOS) && defined(IPTOS_THROUGHPUT)
    int opt;
    opt = IPTOS_THROUGHPUT;
@@ -685,6 +684,17 @@ bool BSOCK::set_buffer_size(uint32_t size, int rw)
       Qmsg0(get_jcr(), M_FATAL, 0, _("Could not malloc BSOCK data buffer\n"));
       return false;
    }
+
+   /*
+    * If user has not set the size, use the OS default -- i.e. do not
+    *   try to set it.  This allows sys admins to set the size they
+    *   want in the OS, and Bacula will comply. See bug #1493
+    */
+   if (size == 0) {
+      msglen = dbuf_size;
+      return true;
+   }
+
    if (rw & BNET_SETBUF_READ) {
       while ((dbuf_size > TAPE_BSIZE) && (setsockopt(m_fd, SOL_SOCKET,
               SO_RCVBUF, (sockopt_val_t) & dbuf_size, sizeof(dbuf_size)) < 0)) {
@@ -957,7 +967,7 @@ static char OKhello[]   = "1000 OK:";
  * Authenticate Director
  */
 bool BSOCK::authenticate_director(const char *name, const char *password,
-               TLS_CONTEXT *tls_ctx, char *msg, int msglen)
+                                  TLS_CONTEXT *tls_ctx, char *response, int response_len)
 {
    int tls_local_need = BNET_TLS_NONE;
    int tls_remote_need = BNET_TLS_NONE;
@@ -965,7 +975,7 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
    char bashed_name[MAX_NAME_LENGTH];
    BSOCK *dir = this;        /* for readability */
 
-   msg[0] = 0;
+   response[0] = 0;
    /*
     * Send my name to the Director then do authentication
     */
@@ -982,14 +992,14 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
    if (!cram_md5_respond(dir, password, &tls_remote_need, &compatible) ||
        /* Now challenge dir */
        !cram_md5_challenge(dir, password, tls_local_need, compatible)) {
-      bsnprintf(msg, msglen, _("Director authorization problem at \"%s:%d\"\n"),
+      bsnprintf(response, response_len, _("Director authorization problem at \"%s:%d\"\n"),
          dir->host(), dir->port());
       goto bail_out;
    }
 
    /* Verify that the remote host is willing to meet our TLS requirements */
    if (tls_remote_need < tls_local_need && tls_local_need != BNET_TLS_OK && tls_remote_need != BNET_TLS_OK) {
-      bsnprintf(msg, msglen, _("Authorization problem:"
+      bsnprintf(response, response_len, _("Authorization problem:"
              " Remote server at \"%s:%d\" did not advertise required TLS support.\n"),
              dir->host(), dir->port());
       goto bail_out;
@@ -997,7 +1007,7 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
 
    /* Verify that we are willing to meet the remote host's requirements */
    if (tls_remote_need > tls_local_need && tls_local_need != BNET_TLS_OK && tls_remote_need != BNET_TLS_OK) {
-      bsnprintf(msg, msglen, _("Authorization problem with Director at \"%s:%d\":"
+      bsnprintf(response, response_len, _("Authorization problem with Director at \"%s:%d\":"
                      " Remote server requires TLS.\n"),
                      dir->host(), dir->port());
 
@@ -1009,7 +1019,7 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
       if (tls_local_need >= BNET_TLS_OK && tls_remote_need >= BNET_TLS_OK) {
          /* Engage TLS! Full Speed Ahead! */
          if (!bnet_tls_client(tls_ctx, dir, NULL)) {
-            bsnprintf(msg, msglen, _("TLS negotiation failed with Director at \"%s:%d\"\n"),
+            bsnprintf(response, response_len, _("TLS negotiation failed with Director at \"%s:%d\"\n"),
                dir->host(), dir->port());
             goto bail_out;
          }
@@ -1019,7 +1029,7 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
    Dmsg1(6, ">dird: %s", dir->msg);
    if (dir->recv() <= 0) {
       dir->stop_timer();
-      bsnprintf(msg, msglen, _("Bad response to Hello command: ERR=%s\n"
+      bsnprintf(response, response_len, _("Bad response to Hello command: ERR=%s\n"
                       "The Director at \"%s:%d\" is probably not running.\n"),
                     dir->bstrerror(), dir->host(), dir->port());
       return false;
@@ -1028,20 +1038,20 @@ bool BSOCK::authenticate_director(const char *name, const char *password,
   dir->stop_timer();
    Dmsg1(10, "<dird: %s", dir->msg);
    if (strncmp(dir->msg, OKhello, sizeof(OKhello)-1) != 0) {
-      bsnprintf(msg, msglen, _("Director at \"%s:%d\" rejected Hello command\n"),
+      bsnprintf(response, response_len, _("Director at \"%s:%d\" rejected Hello command\n"),
          dir->host(), dir->port());
       return false;
    } else {
-      bsnprintf(msg, msglen, "%s", dir->msg);
+      bsnprintf(response, response_len, "%s", dir->msg);
    }
    return true;
 
 bail_out:
    dir->stop_timer();
-   bsnprintf(msg, msglen, _("Authorization problem with Director at \"%s:%d\"\n"
+   bsnprintf(response, response_len, _("Authorization problem with Director at \"%s:%d\"\n"
              "Most likely the passwords do not agree.\n"
              "If you are using TLS, there may have been a certificate validation error during the TLS handshake.\n"
-             "Please see http://www.bacula.org/en/rel-manual/Bacula_Freque_Asked_Questi.html#SECTION003760000000000000000 for help.\n"), 
+             "Please see " MANUAL_AUTH_URL " for help.\n"),
              dir->host(), dir->port());
    return false;
 }