]> git.sur5r.net Git - bacula/bacula/commitdiff
Add bsock timers to authentication
authorKern Sibbald <kern@sibbald.com>
Mon, 26 Jan 2004 15:33:10 +0000 (15:33 +0000)
committerKern Sibbald <kern@sibbald.com>
Mon, 26 Jan 2004 15:33:10 +0000 (15:33 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1019 91ce42f0-d328-0410-95d8-f526ca767f89

18 files changed:
bacula/src/console/authenticate.c
bacula/src/dird/authenticate.c
bacula/src/dird/job.c
bacula/src/dird/ua_server.c
bacula/src/filed/authenticate.c
bacula/src/filed/backup.c
bacula/src/findlib/create_file.c
bacula/src/gnome2-console/authenticate.c
bacula/src/lib/bnet_server.c
bacula/src/lib/bpipe.h
bacula/src/lib/jcr.c
bacula/src/lib/protos.h
bacula/src/lib/watchdog.c
bacula/src/lib/watchdog.h
bacula/src/stored/authenticate.c
bacula/src/stored/dev.c
bacula/src/stored/dev.h
bacula/src/version.h

index ab503db8f231a5d22d57414fbbb2d7cad3ced7ac..5f5be7bfca5bdc704081e23a64132afb8176be5d 100644 (file)
@@ -65,10 +65,13 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons)
       bstrncpy(bashed_name, "*UserAgent*", sizeof(bashed_name));
       password = director->password;
    }
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(dir, 60 * 5);
    bnet_fsend(dir, hello, bashed_name);
 
    if (!cram_md5_get_auth(dir, password, ssl_need) || 
        !cram_md5_auth(dir, password, ssl_need)) {
+      stop_bsock_timer(tid);
       sendit( _("Director authorization problem.\n"
             "Most likely the passwords do not agree.\n"));  
       return 0;
@@ -76,11 +79,13 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons)
 
    Dmsg1(6, ">dird: %s", dir->msg);
    if (bnet_recv(dir) <= 0) {
+      stop_bsock_timer(tid);
       senditf(_("Bad response to Hello command: ERR=%s\n"),
         bnet_strerror(dir));
       return 0;
    }
    Dmsg1(10, "<dird: %s", dir->msg);
+   stop_bsock_timer(tid);
    if (strncmp(dir->msg, OKhello, sizeof(OKhello)-1) != 0) {
       sendit(_("Director rejected Hello command\n"));
       return 0;
index a4ed421cd074cbe2f920b8d6bcb81d110f55ad97..ad14435abf5a5371198c5e11c6c01ae7a12d7c31 100644 (file)
@@ -63,22 +63,28 @@ int authenticate_storage_daemon(JCR *jcr)
     */
    bstrncpy(dirname, director->hdr.name, sizeof(dirname));
    bash_spaces(dirname);
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(sd, 60 * 5);
    if (!bnet_fsend(sd, hello, dirname)) {
+      stop_bsock_timer(tid);
       Jmsg(jcr, M_FATAL, 0, _("Error sending Hello to Storage daemon. ERR=%s\n"), bnet_strerror(sd));
       return 0;
    }
    if (!cram_md5_get_auth(sd, jcr->store->password, ssl_need) || 
        !cram_md5_auth(sd, jcr->store->password, ssl_need)) {
+      stop_bsock_timer(tid);
       Jmsg0(jcr, M_FATAL, 0, _("Director and Storage daemon passwords or names not the same.\n"));
       return 0;
    }
    Dmsg1(116, ">stored: %s", sd->msg);
    if (bnet_recv(sd) <= 0) {
+      stop_bsock_timer(tid);
       Jmsg1(jcr, M_FATAL, 0, _("bdird<stored: bad response to Hello command: ERR=%s\n"),
         bnet_strerror(sd));
       return 0;
    }
    Dmsg1(110, "<stored: %s", sd->msg);
+   stop_bsock_timer(tid);
    if (strncmp(sd->msg, OKhello, sizeof(OKhello)) != 0) {
       Jmsg0(jcr, M_FATAL, 0, _("Storage daemon rejected Hello command\n"));
       return 0;
@@ -100,22 +106,28 @@ int authenticate_file_daemon(JCR *jcr)
     */
    bstrncpy(dirname, director->hdr.name, sizeof(dirname));
    bash_spaces(dirname);
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(fd, 60 * 5);
    if (!bnet_fsend(fd, hello, dirname)) {
+      stop_bsock_timer(tid);
       Jmsg(jcr, M_FATAL, 0, _("Error sending Hello to File daemon. ERR=%s\n"), bnet_strerror(fd));
       return 0;
    }
    if (!cram_md5_get_auth(fd, jcr->client->password, ssl_need) || 
        !cram_md5_auth(fd, jcr->client->password, ssl_need)) {
+      stop_bsock_timer(tid);
       Jmsg(jcr, M_FATAL, 0, _("Director and File daemon passwords or names not the same.\n"));
       return 0;
    }
    Dmsg1(116, ">filed: %s", fd->msg);
    if (bnet_recv(fd) <= 0) {
+      stop_bsock_timer(tid);
       Jmsg(jcr, M_FATAL, 0, _("Bad response from File daemon to Hello command: ERR=%s\n"),
         bnet_strerror(fd));
       return 0;
    }
    Dmsg1(110, "<stored: %s", fd->msg);
+   stop_bsock_timer(tid);
    if (strncmp(fd->msg, FDOKhello, sizeof(FDOKhello)) != 0) {
       Jmsg(jcr, M_FATAL, 0, _("File daemon rejected Hello command\n"));
       return 0;
@@ -134,15 +146,15 @@ int authenticate_user_agent(UAContext *uac)
    BSOCK *ua = uac->UA_sock;
 
    if (ua->msglen < 16 || ua->msglen >= MAX_NAME_LENGTH + 15) {
-      Emsg2(M_ERROR, 0, _("UA Hello from %s is invalid. Len=%d\n"), ua->who, 
-           ua->msglen);
+      Emsg4(M_ERROR, 0, _("UA Hello from %s:%s:%d is invalid. Len=%d\n"), ua->who,
+           ua->host, ua->port, ua->msglen);
       return 0;
    }
 
    if (sscanf(ua->msg, "Hello %127s calling\n", name) != 1) {
       ua->msg[100] = 0;              /* terminate string */
-      Emsg2(M_ERROR, 0, _("UA Hello from %s is invalid. Got: %s\n"), ua->who,
-           ua->msg);
+      Emsg4(M_ERROR, 0, _("UA Hello from %s:%s:%d is invalid. Got: %s\n"), ua->who,
+           ua->host, ua->port, ua->msg);
       return 0;
    }
 // Dmsg2(000, "Console=%s addr=%s\n", name, inet_ntoa(ua->client_addr.sin_addr));
@@ -165,8 +177,8 @@ int authenticate_user_agent(UAContext *uac)
    }
    if (!ok) {
       bnet_fsend(ua, "%s", _(Dir_sorry));
-      Emsg2(M_ERROR, 0, _("Unable to authenticate User Agent \"%s\" at %s.\n"),
-           name, ua->who);
+      Emsg4(M_ERROR, 0, _("Unable to authenticate console \"%s\" at %s:%s:%d.\n"),
+           name, ua->who, ua->host, ua->port);
       sleep(5);
       return 0;
    }
index 73eff3e13a7fd8a01ce9abe1ad36d1f211349cd1..2518daf0a37fee34b82a61504dead14ee265fccb 100644 (file)
@@ -59,7 +59,7 @@ void init_job_server(int max_workers)
    if ((stat = jobq_init(&job_queue, max_workers, job_thread)) != 0) {
       Emsg1(M_ABORT, 0, _("Could not init job queue: ERR=%s\n"), strerror(stat));
    }
-   if ((wd = watchdog_new()) == NULL) {
+   if ((wd = new_watchdog()) == NULL) {
       Emsg0(M_ABORT, 0, _("Could not init job monitor watchdogs\n"));
    }
    wd->callback = job_monitor_watchdog;
index eecf65619efcc3b418c826ed26f1a302db11b9ba..f89db83b815fe8ab187fb5dc1905ccdab4de098d 100644 (file)
@@ -86,8 +86,8 @@ static void *connect_thread(void *arg)
 
    pthread_detach(pthread_self());
 
-   /*  ****FIXME**** put # 5 on config parameter */
-   bnet_thread_server(UA->addr, UA->port, 5, &ua_workq, handle_UA_client_request);
+   /*  ****FIXME**** put # 10 on config parameter */
+   bnet_thread_server(UA->addr, UA->port, 10, &ua_workq, handle_UA_client_request);
    return NULL;
 }
 
index f3d8e9f4348ff92a602a344f34f53434fc63c21f..e01870b121a0a3d793b49bbfc69c32d2c21181d4 100644 (file)
@@ -74,12 +74,14 @@ static int authenticate(int rcode, BSOCK *bs)
       free_pool_memory(dirname);
       return 0;
    }
+   btimer_t *tid = start_bsock_timer(bs, 60 * 5);
    if (!cram_md5_auth(bs, director->password, ssl_need) ||
        !cram_md5_get_auth(bs, director->password, ssl_need)) {
       Emsg1(M_FATAL, 0, _("Incorrect password given by Director at %s.\n"),
            bs->who);
       director = NULL;
    }
+   stop_bsock_timer(tid);
    free_pool_memory(dirname);
    return (director != NULL);
 }
@@ -115,8 +117,10 @@ int authenticate_storagedaemon(JCR *jcr)
    int stat;
    int ssl_need = BNET_SSL_NONE;
 
+   btimer_t *tid = start_bsock_timer(sd, 60 * 5);
    stat = cram_md5_get_auth(sd, jcr->sd_auth_key, ssl_need) &&
          cram_md5_auth(sd, jcr->sd_auth_key, ssl_need);
+   stop_bsock_timer(tid);
    memset(jcr->sd_auth_key, 0, strlen(jcr->sd_auth_key));
    if (!stat) {
       Jmsg(jcr, M_FATAL, 0, _("Authorization key rejected by Storage daemon.\n"));
index eb9302156d44db25a96cd12fc3a4e55d926c8726..e53d8bfbd654abb275af5cb2d67fec41ac646327 100644 (file)
@@ -215,7 +215,7 @@ static int save_file(FF_PKT *ff_pkt, void *vjcr)
         ff_pkt->statp.st_size > 0) || 
         ff_pkt->type == FT_RAW || ff_pkt->type == FT_FIFO ||
         (!is_portable_backup(&ff_pkt->bfd) && ff_pkt->type == FT_DIR)) {
-      btimer_id tid;   
+      btimer_t *tid;   
       if (ff_pkt->type == FT_FIFO) {
         tid = start_thread_timer(pthread_self(), 60);
       } else {
index edc38ccf1a8b019d33667184014638fcf967e7fd..3bf61b4535476c8cd68a49e2569ab962b217de9e 100644 (file)
@@ -199,7 +199,7 @@ int create_file(JCR *jcr, ATTR *attr, BFILE *bfd, int replace)
            }
         }       
         if (attr->type == FT_RAW || attr->type == FT_FIFO) {
-           btimer_id tid;
+           btimer_t *tid;
             Dmsg1(200, "FT_RAW|FT_FIFO %s\n", attr->ofname);
            mode =  O_WRONLY | O_BINARY;
            /* Timeout open() in 60 seconds */
index aa0e440b5cb42ff0b429adc1070432889dc1ca71..f1c6febd746da12f039b0d88a06550ec45a854b4 100644 (file)
@@ -63,10 +63,13 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons)
       bstrncpy(bashed_name, "*UserAgent*", sizeof(bashed_name));
       password = director->password;
    }
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(dir, 60 * 5);
    bnet_fsend(dir, hello, bashed_name);
 
    if (!cram_md5_get_auth(dir, password, ssl_need) || 
        !cram_md5_auth(dir, password, ssl_need)) {
+      stop_bsock_timer(tid);
       printf(_("%s: Director authorization problem.\n"), my_name);
       set_text(_("Director authorization problem.\n"), -1);
       return 0;
@@ -74,6 +77,7 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons)
 
    Dmsg1(6, ">dird: %s", dir->msg);
    if (bnet_recv(dir) <= 0) {
+      stop_bsock_timer(tid);
       set_textf(_("Bad response to Hello command: ERR=%s\n"),
         bnet_strerror(dir));
       printf(_("%s: Bad response to Hello command: ERR=%s\n"),
@@ -81,6 +85,7 @@ int authenticate_director(JCR *jcr, DIRRES *director, CONRES *cons)
       set_text(_("The Director is probably not running.\n"), -1);
       return 0;
    }
+  stop_bsock_timer(tid);
    Dmsg1(10, "<dird: %s", dir->msg);
    if (strncmp(dir->msg, OKhello, sizeof(OKhello)-1) != 0) {
       set_text(_("Director rejected Hello command\n"), -1);
index 82b72b3a92ab26af0049566a7803c1d6fa5ca35b..c4b2a76ddf9ec485d767a3f7e66bcdb05e66c0c3 100644 (file)
@@ -57,7 +57,6 @@ bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_w
    struct sockaddr_in serv_addr;      /* our address */
    struct in_addr bind_ip;           /* address to bind to */
    int tlog;
-   fd_set ready, sockset;
    int turnon = 1;
    char *caller;
 #ifdef HAVE_LIBWRAP
@@ -115,37 +114,39 @@ bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_w
    }
    listen(sockfd, 5);                /* tell system we are ready */
 
-   FD_ZERO(&sockset);
-   FD_SET(sockfd, &sockset);
-
    /* Start work queue thread */
    if ((stat = workq_init(client_wq, max_clients, handle_client_request)) != 0) {
       Emsg1(M_ABORT, 0, _("Could not init client queue: ERR=%s\n"), strerror(stat));
    }
 
+   /* 
+    * Wait for a connection from the client process.
+    */
    for (;;) {
-      /* 
-       * Wait for a connection from a client process.
-       */
-      ready = sockset;
-      do {
-        errno = 0;
-        stat = select(sockfd+1, &ready, NULL, NULL, NULL);       
-      } while(stat == -1 && (errno == EINTR || errno == EAGAIN));
-      if (stat < 0) {
+      fd_set sockset;
+      FD_ZERO(&sockset);
+      FD_SET(sockfd, &sockset);
+      errno = 0;
+      if ((stat = select(sockfd+1, &sockset, NULL, NULL, NULL)) < 0) {
+        if (errno == EINTR) {
+           continue;
+        }
+        /* Error, get out */
         close(sockfd);
          Emsg1(M_FATAL, 0, _("Error in select: %s\n"), strerror(errno));
         break;
       }
+
+      /* Got a connection, now accept it. */
       do {
         clilen = sizeof(cli_addr);
-        errno = 0;
         newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
-      } while (newsockfd < 0 && (errno == EINTR || errno == EAGAIN));
+      } while (newsockfd < 0 && errno == EINTR);
       if (newsockfd < 0) {
         continue;
       }
 
+
 #ifdef HAVE_LIBWRAP
       P(mutex);                      /* hosts_access is not thread safe */
       request_init(&request, RQ_DAEMON, my_name, RQ_FILE, newsockfd, 0);
@@ -186,6 +187,11 @@ bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_w
       }
       V(mutex);
    }
+
+   /* Stop work queue thread */
+   if ((stat = workq_destroy(client_wq)) != 0) {
+      Emsg1(M_FATAL, 0, _("Could not destroy client queue: ERR=%s\n"), strerror(stat));
+   }
 }   
 
 
@@ -274,7 +280,7 @@ bnet_accept(BSOCK *bsock, char *who)
        */
       ready = sockset;
       if ((stat = select(bsock->fd+1, &ready, NULL, NULL, NULL)) < 0) {
-        if (errno == EINTR || errno == EAGAIN) {
+        if (errno == EINTR) {
            errno = 0;
            continue;
         }
index d41365f9238f81b01e48254b1ec971b1d29db4ad..337279271785d2b00e1be4f6274394c70fd19d67 100644 (file)
@@ -28,7 +28,7 @@ typedef struct s_bpipe {
    pid_t worker_pid;
    time_t worker_stime;
    int wait;
-   btimer_id timer_id;
+   btimer_t *timer_id;
    FILE *rfd;
    FILE *wfd;
 } BPIPE;
index f303f0d4febd343e29f6b8aae23eb26663135a5d..27b94c87368f13dced6519d9f4c49f01d6113db6 100755 (executable)
@@ -448,7 +448,7 @@ JCR *get_next_jcr(JCR *jcr)
 
 bool init_jcr_subsystem(void)
 {
-   watchdog_t *wd = watchdog_new();
+   watchdog_t *wd = new_watchdog();
 
    wd->one_shot = false;
    wd->interval = 30;  /* FIXME: should be configurable somewhere, even
index 6dce67f578e3b8b85604e72f77a2b524f84ff23a..9146bf483154b96951d7efbe7fd8ad0089ae8577 100644 (file)
 struct JCR;
 
 /* attr.c */
-ATTR     *new_attr();
-void      free_attr(ATTR *attr);
-int       unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr);
-void      build_attr_output_fnames(JCR *jcr, ATTR *attr);
-void      print_ls_output(JCR *jcr, ATTR *attr);
+ATTR    *new_attr();
+void     free_attr(ATTR *attr);
+int      unpack_attributes_record(JCR *jcr, int32_t stream, char *rec, ATTR *attr);
+void     build_attr_output_fnames(JCR *jcr, ATTR *attr);
+void     print_ls_output(JCR *jcr, ATTR *attr);
 
 /* base64.c */
-void      base64_init            (void);
-int       to_base64              (intmax_t value, char *where);
-int       from_base64            (intmax_t *value, char *where);
-int       bin_to_base64          (char *buf, char *bin, int len);
+void     base64_init            (void);
+int      to_base64              (intmax_t value, char *where);
+int      from_base64            (intmax_t *value, char *where);
+int      bin_to_base64          (char *buf, char *bin, int len);
 
 /* bsys.c */
-char     *bstrncpy               (char *dest, const char *src, int maxlen);
-char     *bstrncat               (char *dest, const char *src, int maxlen);
-void     *b_malloc               (char *file, int line, size_t size);
+char    *bstrncpy               (char *dest, const char *src, int maxlen);
+char    *bstrncat               (char *dest, const char *src, int maxlen);
+void    *b_malloc               (char *file, int line, size_t size);
 #ifndef DEBUG
-void     *bmalloc                (size_t size);
+void    *bmalloc                (size_t size);
 #endif
-void     *brealloc               (void *buf, size_t size);
-void     *bcalloc                (size_t size1, size_t size2);
-int       bsnprintf              (char *str, int32_t size, const  char  *format, ...);
-int       bvsnprintf             (char *str, int32_t size, const char  *format, va_list ap);
-int       pool_sprintf           (char *pool_buf, char *fmt, ...);
-void      create_pid_file        (char *dir, char *progname, int port);
-int       delete_pid_file        (char *dir, char *progname, int port);
-void      drop                   (char *uid, char *gid);
-int       bmicrosleep            (time_t sec, long usec);
-char     *bfgets                 (char *s, int size, FILE *fd);
-void      make_unique_filename   (POOLMEM **name, int Id, char *what);
+void    *brealloc               (void *buf, size_t size);
+void    *bcalloc                (size_t size1, size_t size2);
+int      bsnprintf              (char *str, int32_t size, const  char  *format, ...);
+int      bvsnprintf             (char *str, int32_t size, const char  *format, va_list ap);
+int      pool_sprintf           (char *pool_buf, char *fmt, ...);
+void     create_pid_file        (char *dir, char *progname, int port);
+int      delete_pid_file        (char *dir, char *progname, int port);
+void     drop                   (char *uid, char *gid);
+int      bmicrosleep            (time_t sec, long usec);
+char    *bfgets                 (char *s, int size, FILE *fd);
+void     make_unique_filename   (POOLMEM **name, int Id, char *what);
 #ifndef HAVE_STRTOLL
-long long int strtoll            (const char *ptr, char **endptr, int base);
+long long int strtoll           (const char *ptr, char **endptr, int base);
 #endif
 
 /* bnet.c */
-int32_t    bnet_recv             (BSOCK *bsock);
-int        bnet_send             (BSOCK *bsock);
-int        bnet_fsend            (BSOCK *bs, char *fmt, ...);
-int        bnet_set_buffer_size  (BSOCK *bs, uint32_t size, int rw);
-int        bnet_sig              (BSOCK *bs, int sig);
-int        bnet_ssl_server       (BSOCK *bsock, char *password, int ssl_need, int ssl_has);
-int        bnet_ssl_client       (BSOCK *bsock, char *password, int ssl_need);
-BSOCK *    bnet_connect            (JCR *jcr, int retry_interval,
-               int max_retry_time, char *name, char *host, char *service, 
-               int port, int verbose);
-void       bnet_close            (BSOCK *bsock);
-BSOCK *    init_bsock            (JCR *jcr, int sockfd, char *who, char *ip, 
-                                  int port, struct sockaddr_in *client_addr);
-BSOCK *    dup_bsock             (BSOCK *bsock);
-void       term_bsock            (BSOCK *bsock);
-char *     bnet_strerror         (BSOCK *bsock);
-char *     bnet_sig_to_ascii     (BSOCK *bsock);
-int        bnet_wait_data        (BSOCK *bsock, int sec);
-int        bnet_wait_data_intr   (BSOCK *bsock, int sec);
-int        bnet_despool_to_bsock (BSOCK *bsock);
-int        is_bnet_stop          (BSOCK *bsock);
-int        is_bnet_error         (BSOCK *bsock);
-void       bnet_suppress_error_messages(BSOCK *bsock, int flag);
+int32_t    bnet_recv            (BSOCK *bsock);
+int       bnet_send             (BSOCK *bsock);
+int       bnet_fsend            (BSOCK *bs, char *fmt, ...);
+int       bnet_set_buffer_size  (BSOCK *bs, uint32_t size, int rw);
+int       bnet_sig              (BSOCK *bs, int sig);
+int       bnet_ssl_server       (BSOCK *bsock, char *password, int ssl_need, int ssl_has);
+int       bnet_ssl_client       (BSOCK *bsock, char *password, int ssl_need);
+BSOCK *    bnet_connect           (JCR *jcr, int retry_interval,
+              int max_retry_time, char *name, char *host, char *service, 
+              int port, int verbose);
+void      bnet_close            (BSOCK *bsock);
+BSOCK *    init_bsock           (JCR *jcr, int sockfd, char *who, char *ip, 
+                                 int port, struct sockaddr_in *client_addr);
+BSOCK *    dup_bsock            (BSOCK *bsock);
+void      term_bsock            (BSOCK *bsock);
+char *    bnet_strerror         (BSOCK *bsock);
+char *    bnet_sig_to_ascii     (BSOCK *bsock);
+int       bnet_wait_data        (BSOCK *bsock, int sec);
+int       bnet_wait_data_intr   (BSOCK *bsock, int sec);
+int       bnet_despool_to_bsock (BSOCK *bsock);
+int       is_bnet_stop          (BSOCK *bsock);
+int       is_bnet_error         (BSOCK *bsock);
+void      bnet_suppress_error_messages(BSOCK *bsock, int flag);
 
 /* bget_msg.c */
-int      bget_msg(BSOCK *sock);
+int     bget_msg(BSOCK *sock);
 
 /* bpipe.c */
-BPIPE *          open_bpipe(char *prog, int wait, char *mode);
-int              close_wpipe(BPIPE *bpipe);
-int              close_bpipe(BPIPE *bpipe);
+BPIPE *         open_bpipe(char *prog, int wait, char *mode);
+int             close_wpipe(BPIPE *bpipe);
+int             close_bpipe(BPIPE *bpipe);
 
 /* cram-md5.c */
 int cram_md5_get_auth(BSOCK *bs, char *password, int ssl_need);
 int cram_md5_auth(BSOCK *bs, char *password, int ssl_need);
 void hmac_md5(uint8_t* text, int text_len, uint8_t*  key,
-              int key_len, uint8_t *hmac);
+             int key_len, uint8_t *hmac);
 
 /* crc32.c */
 
 uint32_t bcrc32(uint8_t *buf, int len);
 
 /* daemon.c */
-void     daemon_start            ();
+void    daemon_start            ();
 
 /* edit.c */
-uint64_t         str_to_uint64(char *str);
-int64_t          str_to_int64(char *str);
-char *           edit_uint64_with_commas   (uint64_t val, char *buf);
-char *           add_commas              (char *val, char *buf);
-char *           edit_uint64             (uint64_t val, char *buf);
-int              duration_to_utime       (char *str, utime_t *value);
-int              size_to_uint64(char *str, int str_len, uint64_t *rtn_value);
-char             *edit_utime             (utime_t val, char *buf);
-int              is_a_number             (const char *num);
-int              is_an_integer           (const char *n);
-bool             is_name_valid           (char *name, POOLMEM **msg);
+uint64_t        str_to_uint64(char *str);
+int64_t         str_to_int64(char *str);
+char *          edit_uint64_with_commas   (uint64_t val, char *buf);
+char *          add_commas              (char *val, char *buf);
+char *          edit_uint64             (uint64_t val, char *buf);
+int             duration_to_utime       (char *str, utime_t *value);
+int             size_to_uint64(char *str, int str_len, uint64_t *rtn_value);
+char            *edit_utime             (utime_t val, char *buf);
+int             is_a_number             (const char *num);
+int             is_an_integer           (const char *n);
+bool            is_name_valid           (char *name, POOLMEM **msg);
 
 /* jcr.c (most definitions are in src/jcr.h) */
 void init_last_jobs_list();
@@ -127,35 +127,35 @@ void unlock_last_jobs_list();
 
 
 /* lex.c */
-LEX *     lex_close_file         (LEX *lf);
-LEX *     lex_open_file          (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error);
-int       lex_get_char           (LEX *lf);
-void      lex_unget_char         (LEX *lf);
-char *    lex_tok_to_str         (int token);
-int       lex_get_token          (LEX *lf, int expect);
+LEX *    lex_close_file         (LEX *lf);
+LEX *    lex_open_file          (LEX *lf, char *fname, LEX_ERROR_HANDLER *scan_error);
+int      lex_get_char           (LEX *lf);
+void     lex_unget_char         (LEX *lf);
+char *   lex_tok_to_str         (int token);
+int      lex_get_token          (LEX *lf, int expect);
 
 /* message.c */
-void       my_name_is            (int argc, char *argv[], char *name);
-void       init_msg              (JCR *jcr, MSGS *msg);
-void       term_msg              (void);
-void       close_msg             (JCR *jcr);
-void       add_msg_dest          (MSGS *msg, int dest, int type, char *where, char *dest_code);
-void       rem_msg_dest          (MSGS *msg, int dest, int type, char *where);
-void       Jmsg                  (JCR *jcr, int type, int level, char *fmt, ...);
-void       dispatch_message      (JCR *jcr, int type, int level, char *buf);
-void       init_console_msg      (char *wd);
-void       free_msgs_res         (MSGS *msgs);
-int        open_spool_file       (JCR *jcr, BSOCK *bs);
-int        close_spool_file      (JCR *jcr, BSOCK *bs);
+void      my_name_is            (int argc, char *argv[], char *name);
+void      init_msg              (JCR *jcr, MSGS *msg);
+void      term_msg              (void);
+void      close_msg             (JCR *jcr);
+void      add_msg_dest          (MSGS *msg, int dest, int type, char *where, char *dest_code);
+void      rem_msg_dest          (MSGS *msg, int dest, int type, char *where);
+void      Jmsg                  (JCR *jcr, int type, int level, char *fmt, ...);
+void      dispatch_message      (JCR *jcr, int type, int level, char *buf);
+void      init_console_msg      (char *wd);
+void      free_msgs_res         (MSGS *msgs);
+int       open_spool_file       (JCR *jcr, BSOCK *bs);
+int       close_spool_file      (JCR *jcr, BSOCK *bs);
 
 
 /* bnet_server.c */
-void       bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, 
-                   void *handle_client_request(void *bsock));
-void             bnet_server             (int port, void handle_client_request(BSOCK *bsock));
-int              net_connect             (int port);
-BSOCK *          bnet_bind               (int port);
-BSOCK *          bnet_accept             (BSOCK *bsock, char *who);
+void      bnet_thread_server(char *bind_addr, int port, int max_clients, workq_t *client_wq, 
+                  void *handle_client_request(void *bsock));
+void            bnet_server             (int port, void handle_client_request(BSOCK *bsock));
+int             net_connect             (int port);
+BSOCK *         bnet_bind               (int port);
+BSOCK *         bnet_accept             (BSOCK *bsock, char *who);
 
 /* idcache.c */
 char *getuser(uid_t uid);
@@ -165,49 +165,51 @@ void free_getgroup_cache();
 
 
 /* signal.c */
-void             init_signals             (void terminate(int sig));
-void             init_stack_dump          (void);
+void            init_signals             (void terminate(int sig));
+void            init_stack_dump          (void);
 
 /* scan.c */
-void             strip_trailing_junk     (char *str);
-void             strip_trailing_slashes  (char *dir);
-bool             skip_spaces             (char **msg);
-bool             skip_nonspaces          (char **msg);
-int              fstrsch                 (char *a, char *b);
-int              parse_args(POOLMEM *cmd, POOLMEM **args, int *argc, 
-                        char **argk, char **argv, int max_args);
-char            *next_arg(char **s);
+void            strip_trailing_junk     (char *str);
+void            strip_trailing_slashes  (char *dir);
+bool            skip_spaces             (char **msg);
+bool            skip_nonspaces          (char **msg);
+int             fstrsch                 (char *a, char *b);
+int             parse_args(POOLMEM *cmd, POOLMEM **args, int *argc, 
+                       char **argk, char **argv, int max_args);
+char           *next_arg(char **s);
 
 /* util.c */
-int              is_buf_zero             (char *buf, int len);
-void             lcase                   (char *str);
-void             bash_spaces             (char *str);
-void             unbash_spaces           (char *str);
-char *           encode_time             (time_t time, char *buf);
-char *           encode_mode             (mode_t mode, char *buf);
-int              do_shell_expansion      (char *name, int name_len);
-void             jobstatus_to_ascii      (int JobStatus, char *msg, int maxlen);
-int              pm_strcat               (POOLMEM **pm, char *str);
-int              pm_strcpy               (POOLMEM **pm, char *str);
-int              run_program             (char *prog, int wait, POOLMEM *results);
-char *           job_type_to_str         (int type);
-char *           job_status_to_str       (int stat);
-char *           job_level_to_str        (int level);
-void             make_session_key        (char *key, char *seed, int mode);
-POOLMEM         *edit_job_codes(JCR *jcr, char *omsg, char *imsg, char *to);
-void             set_working_directory(char *wd);
+int             is_buf_zero             (char *buf, int len);
+void            lcase                   (char *str);
+void            bash_spaces             (char *str);
+void            unbash_spaces           (char *str);
+char *          encode_time             (time_t time, char *buf);
+char *          encode_mode             (mode_t mode, char *buf);
+int             do_shell_expansion      (char *name, int name_len);
+void            jobstatus_to_ascii      (int JobStatus, char *msg, int maxlen);
+int             pm_strcat               (POOLMEM **pm, char *str);
+int             pm_strcpy               (POOLMEM **pm, char *str);
+int             run_program             (char *prog, int wait, POOLMEM *results);
+char *          job_type_to_str         (int type);
+char *          job_status_to_str       (int stat);
+char *          job_level_to_str        (int level);
+void            make_session_key        (char *key, char *seed, int mode);
+POOLMEM        *edit_job_codes(JCR *jcr, char *omsg, char *imsg, char *to);
+void            set_working_directory(char *wd);
 
 
 /* watchdog.c */
 int start_watchdog(void);
 int stop_watchdog(void);
-watchdog_t *watchdog_new(void);
+watchdog_t *new_watchdog(void);
 bool register_watchdog(watchdog_t *wd);
 bool unregister_watchdog(watchdog_t *wd);
 bool unregister_watchdog_unlocked(watchdog_t *wd);
 
 /* timers.c */
-btimer_id start_child_timer(pid_t pid, uint32_t wait);
-void stop_child_timer(btimer_id wid);
-btimer_id start_thread_timer(pthread_t tid, uint32_t wait);
-void stop_thread_timer(btimer_id wid);
+btimer_t *start_child_timer(pid_t pid, uint32_t wait);
+void stop_child_timer(btimer_t *wid);
+btimer_t *start_thread_timer(pthread_t tid, uint32_t wait);
+void stop_thread_timer(btimer_t *wid);
+btimer_t *start_bsock_timer(BSOCK *bs, uint32_t wait);
+void stop_bsock_timer(btimer_t *wid);
index 3b2e752bbe0c86063f42299e546b41bd2aa9c226..ff0c8658836ca0d021efe1186c62b845261934a5 100755 (executable)
@@ -125,12 +125,15 @@ int stop_watchdog(void)
    return stat;
 }
 
-watchdog_t *watchdog_new(void)
+watchdog_t *new_watchdog(void)
 {
-   watchdog_t *wd = (watchdog_t *) malloc(sizeof(watchdog_t));
+   watchdog_t *wd = (watchdog_t *)malloc(sizeof(watchdog_t));
 
    if (!wd_is_init) {
-      Emsg0(M_ABORT, 0, "BUG! watchdog_new called before start_watchdog\n");
+      start_watchdog();
+      if (!wd_is_init) {
+         Emsg0(M_ABORT, 0, "BUG! new_watchdog called before start_watchdog\n");
+      }
    }
 
    if (wd == NULL) {
index c7ac6889e17a33d26daa8c6879026fcdeef897dc..8d51d2455cfc7e516f2e97827fd5f17133ceb027 100644 (file)
 
  */
 
-#define TYPE_CHILD   1
-#define TYPE_PTHREAD 2
+enum {
+   TYPE_CHILD = 1,
+   TYPE_PTHREAD, 
+   TYPE_BSOCK,
+};
 
 #define TIMEOUT_SIGNAL SIGUSR2
 
index 5b0ce30e9eac0a0c098eedb1258c792b80a78c40..4bc6a1cae9399c2ea33d932bfabac34ece8acdc8 100644 (file)
@@ -72,19 +72,22 @@ static int authenticate(int rcode, BSOCK *bs)
    if (!director) {
       Emsg2(M_FATAL, 0, _("Connection from unknown Director %s at %s rejected.\n"), 
            dirname, bs->who);
-      goto bail_out;
+      free_pool_memory(dirname);
+      return 0;
    }
+
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(bs, 60 * 5);
    if (!cram_md5_auth(bs, director->password, ssl_need) ||
        !cram_md5_get_auth(bs, director->password, ssl_need)) {
+      stop_bsock_timer(tid);
       Emsg0(M_FATAL, 0, _("Incorrect password given by Director.\n"));
-      goto bail_out;
+      free_pool_memory(dirname);
+      return 0;
    }
+   stop_bsock_timer(tid);
    free_pool_memory(dirname);
    return 1;
-
-bail_out:
-   free_pool_memory(dirname);
-   return 0;
 }
 
 /*
@@ -117,10 +120,13 @@ int authenticate_filed(JCR *jcr)
    BSOCK *fd = jcr->file_bsock;
    int ssl_need = BNET_SSL_NONE;
 
+   /* Timeout Hello after 5 mins */
+   btimer_t *tid = start_bsock_timer(fd, 60 * 5);
    if (cram_md5_auth(fd, jcr->sd_auth_key, ssl_need) &&
        cram_md5_get_auth(fd, jcr->sd_auth_key, ssl_need)) {
       jcr->authenticated = TRUE;
    }
+   stop_bsock_timer(tid);
    if (!jcr->authenticated) {
       Jmsg(jcr, M_FATAL, 0, _("Incorrect authorization key from File daemon at %s rejected.\n"), 
           fd->who);
index 57a612dab32d6984c9f8094ea4619bcabc75d99d..1664f9ca20bfa412be01d89ff57e76ab324574a1 100644 (file)
@@ -253,7 +253,7 @@ open_dev(DEVICE *dev, char *VolName, int mode)
       }
       /* If busy retry each second for max_open_wait seconds */
       while ((dev->fd = open(dev->dev_name, dev->mode, MODE_RW)) < 0) {
-        if (errno == EAGAIN) {
+        if (errno == EINTR || errno == EAGAIN) {
            continue;
         }
         if (errno == EBUSY && timeout-- > 0) {
index b41fa72c2887970bbddaea5f0ddae7b5a70ae26b..69ad8e948273fc4090b928acfa039da93ca1fdd2 100644 (file)
@@ -185,7 +185,7 @@ public:
    uint32_t max_open_vols;            /* max simultaneous open volumes */
    utime_t  vol_poll_interval;        /* interval between polling Vol mount */
    DEVRES *device;                    /* pointer to Device Resource */
-   btimer_id tid;                     /* timer id */
+   btimer_t *tid;                     /* timer id */
 
    VOLUME_CAT_INFO VolCatInfo;        /* Volume Catalog Information */
    VOLUME_LABEL VolHdr;               /* Actual volume label */
index 1718eaff352008cbf88c94781585cee97549aff4..bca627466be3b653eab0279276e423abd4b2aa76 100644 (file)
@@ -2,8 +2,8 @@
 #undef  VERSION
 #define VERSION "1.33"
 #define VSTRING "1"
-#define BDATE   "22 Jan 2004"
-#define LSMDATE "22Jan04"
+#define BDATE   "26 Jan 2004"
+#define LSMDATE "26Jan04"
 
 /* Debug flags */
 #undef  DEBUG