From: Kern Sibbald Date: Mon, 26 Jan 2004 15:33:10 +0000 (+0000) Subject: Add bsock timers to authentication X-Git-Tag: Release-1.34.0~154 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=900f92991db89c97160e5bc6d812249a45b3290d;p=bacula%2Fbacula Add bsock timers to authentication git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@1019 91ce42f0-d328-0410-95d8-f526ca767f89 --- diff --git a/bacula/src/console/authenticate.c b/bacula/src/console/authenticate.c index ab503db8f2..5f5be7bfca 100644 --- a/bacula/src/console/authenticate.c +++ b/bacula/src/console/authenticate.c @@ -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, "msg); + stop_bsock_timer(tid); if (strncmp(dir->msg, OKhello, sizeof(OKhello)-1) != 0) { sendit(_("Director rejected Hello command\n")); return 0; diff --git a/bacula/src/dird/authenticate.c b/bacula/src/dird/authenticate.c index a4ed421cd0..ad14435abf 100644 --- a/bacula/src/dird/authenticate.c +++ b/bacula/src/dird/authenticate.c @@ -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, _("bdirdmsg); + 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, "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; } diff --git a/bacula/src/dird/job.c b/bacula/src/dird/job.c index 73eff3e13a..2518daf0a3 100644 --- a/bacula/src/dird/job.c +++ b/bacula/src/dird/job.c @@ -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; diff --git a/bacula/src/dird/ua_server.c b/bacula/src/dird/ua_server.c index eecf65619e..f89db83b81 100644 --- a/bacula/src/dird/ua_server.c +++ b/bacula/src/dird/ua_server.c @@ -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; } diff --git a/bacula/src/filed/authenticate.c b/bacula/src/filed/authenticate.c index f3d8e9f434..e01870b121 100644 --- a/bacula/src/filed/authenticate.c +++ b/bacula/src/filed/authenticate.c @@ -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")); diff --git a/bacula/src/filed/backup.c b/bacula/src/filed/backup.c index eb9302156d..e53d8bfbd6 100644 --- a/bacula/src/filed/backup.c +++ b/bacula/src/filed/backup.c @@ -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 { diff --git a/bacula/src/findlib/create_file.c b/bacula/src/findlib/create_file.c index edc38ccf1a..3bf61b4535 100644 --- a/bacula/src/findlib/create_file.c +++ b/bacula/src/findlib/create_file.c @@ -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 */ diff --git a/bacula/src/gnome2-console/authenticate.c b/bacula/src/gnome2-console/authenticate.c index aa0e440b5c..f1c6febd74 100644 --- a/bacula/src/gnome2-console/authenticate.c +++ b/bacula/src/gnome2-console/authenticate.c @@ -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, "msg); if (strncmp(dir->msg, OKhello, sizeof(OKhello)-1) != 0) { set_text(_("Director rejected Hello command\n"), -1); diff --git a/bacula/src/lib/bnet_server.c b/bacula/src/lib/bnet_server.c index 82b72b3a92..c4b2a76ddf 100644 --- a/bacula/src/lib/bnet_server.c +++ b/bacula/src/lib/bnet_server.c @@ -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; } diff --git a/bacula/src/lib/bpipe.h b/bacula/src/lib/bpipe.h index d41365f923..3372792717 100644 --- a/bacula/src/lib/bpipe.h +++ b/bacula/src/lib/bpipe.h @@ -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; diff --git a/bacula/src/lib/jcr.c b/bacula/src/lib/jcr.c index f303f0d4fe..27b94c8736 100755 --- a/bacula/src/lib/jcr.c +++ b/bacula/src/lib/jcr.c @@ -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 diff --git a/bacula/src/lib/protos.h b/bacula/src/lib/protos.h index 6dce67f578..9146bf4831 100644 --- a/bacula/src/lib/protos.h +++ b/bacula/src/lib/protos.h @@ -26,98 +26,98 @@ 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); diff --git a/bacula/src/lib/watchdog.c b/bacula/src/lib/watchdog.c index 3b2e752bbe..ff0c865883 100755 --- a/bacula/src/lib/watchdog.c +++ b/bacula/src/lib/watchdog.c @@ -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) { diff --git a/bacula/src/lib/watchdog.h b/bacula/src/lib/watchdog.h index c7ac6889e1..8d51d2455c 100644 --- a/bacula/src/lib/watchdog.h +++ b/bacula/src/lib/watchdog.h @@ -24,8 +24,11 @@ */ -#define TYPE_CHILD 1 -#define TYPE_PTHREAD 2 +enum { + TYPE_CHILD = 1, + TYPE_PTHREAD, + TYPE_BSOCK, +}; #define TIMEOUT_SIGNAL SIGUSR2 diff --git a/bacula/src/stored/authenticate.c b/bacula/src/stored/authenticate.c index 5b0ce30e9e..4bc6a1cae9 100644 --- a/bacula/src/stored/authenticate.c +++ b/bacula/src/stored/authenticate.c @@ -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); diff --git a/bacula/src/stored/dev.c b/bacula/src/stored/dev.c index 57a612dab3..1664f9ca20 100644 --- a/bacula/src/stored/dev.c +++ b/bacula/src/stored/dev.c @@ -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) { diff --git a/bacula/src/stored/dev.h b/bacula/src/stored/dev.h index b41fa72c28..69ad8e9482 100644 --- a/bacula/src/stored/dev.h +++ b/bacula/src/stored/dev.h @@ -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 */ diff --git a/bacula/src/version.h b/bacula/src/version.h index 1718eaff35..bca627466b 100644 --- a/bacula/src/version.h +++ b/bacula/src/version.h @@ -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