X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Ffiled%2Ffiled.c;h=37a1d3547cecf098e8de2b5de7e829efffca6aba;hb=1107141f6e05c9473ace82dfc397cba6b9506dee;hp=851e3b2b191ed97cd7de2d4cd75cc9d3497ad23f;hpb=6addd2c0541a270fc5ea2fa1b7c9900aea4cde8a;p=bacula%2Fbacula diff --git a/bacula/src/filed/filed.c b/bacula/src/filed/filed.c index 851e3b2b19..37a1d3547c 100644 --- a/bacula/src/filed/filed.c +++ b/bacula/src/filed/filed.c @@ -7,7 +7,7 @@ * */ /* - Copyright (C) 2000, 2001, 2002 Kern Sibbald and John Walker + Copyright (C) 2000-2005 Kern Sibbald This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -30,100 +30,128 @@ #include "filed.h" /* Imported Functions */ -extern void handle_client_request(void *dir_sock); +extern void *handle_client_request(void *dir_sock); + +/* Imported Variables */ +extern time_t watchdog_sleep_time; /* Forward referenced functions */ void terminate_filed(int sig); /* Exported variables */ +CLIENT *me; /* my resource */ +char OK_msg[] = "2000 OK\n"; +char TERM_msg[] = "2999 Terminate\n"; +bool no_signals = false; - -#ifdef HAVE_CYGWIN -int win32_client = 1; +#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) +const int win32_client = 1; #else -int win32_client = 0; +const int win32_client = 0; #endif #define CONFIG_FILE "./bacula-fd.conf" /* default config file */ static char *configfile = NULL; -static int foreground = 0; +static bool foreground = false; +static bool inetd_request = false; static workq_t dir_workq; /* queue of work from Director */ +static pthread_t server_tid; -CLIENT *me; /* my resource */ static void usage() { - fprintf(stderr, _( -"\nVersion: " VERSION " (" DATE ")\n\n" -"Usage: filed [-f -s] [-c config_file] [-d debug_level] [config_file]\n" + Pmsg0(-1, _( +"Copyright (C) 2000-2005 Kern Sibbald\n" +"\nVersion: " VERSION " (" BDATE ")\n\n" +"Usage: bacula-fd [-f -s] [-c config_file] [-d debug_level]\n" " -c use as configuration file\n" " -dnn set debug level to nn\n" " -f run in foreground (for debugging)\n" +" -g groupid\n" +" -i inetd request\n" " -s no signals (for debugging)\n" " -t test configuration file and exit\n" +" -u userid\n" +" -v verbose user messages\n" " -? print this message.\n" -"\n")); +"\n")); exit(1); } -/********************************************************************* +/********************************************************************* * - * Main Bacula Unix Client Program + * Main Bacula Unix Client Program * */ -#ifdef HAVE_CYGWIN +#if defined(HAVE_CYGWIN) || defined(HAVE_WIN32) #define main BaculaMain #endif + int main (int argc, char *argv[]) { int ch; - int no_signals = FALSE; - int test_config = FALSE; + bool test_config = false; DIRRES *director; + char *uid = NULL; + char *gid = NULL; init_stack_dump(); - my_name_is(argc, argv, "filed"); + my_name_is(argc, argv, "bacula-fd"); + textdomain("bacula"); init_msg(NULL, NULL); daemon_start_time = time(NULL); - memset(&last_job, 0, sizeof(last_job)); - - while ((ch = getopt(argc, argv, "c:d:fst?")) != -1) { + while ((ch = getopt(argc, argv, "c:d:fg:istu:v?")) != -1) { switch (ch) { - case 'c': /* configuration file */ - if (configfile != NULL) { - free(configfile); - } - configfile = bstrdup(optarg); - break; - - case 'd': /* debug level */ - debug_level = atoi(optarg); - if (debug_level <= 0) { - debug_level = 1; - } - break; - - case 'f': /* run in foreground */ - foreground = TRUE; - break; - - case 's': - no_signals = TRUE; - break; - - case 't': - test_config = TRUE; - break; - - case '?': - default: - usage(); - - } + case 'c': /* configuration file */ + if (configfile != NULL) { + free(configfile); + } + configfile = bstrdup(optarg); + break; + + case 'd': /* debug level */ + debug_level = atoi(optarg); + if (debug_level <= 0) { + debug_level = 1; + } + break; + + case 'f': /* run in foreground */ + foreground = true; + break; + + case 'g': /* set group */ + gid = optarg; + break; + + case 'i': + inetd_request = true; + break; + case 's': + no_signals = true; + break; + + case 't': + test_config = true; + break; + + case 'u': /* set userid */ + uid = optarg; + break; + + case 'v': /* verbose */ + verbose++; + break; + + case '?': + default: + usage(); + + } } argc -= optind; argv += optind; @@ -132,15 +160,19 @@ int main (int argc, char *argv[]) if (configfile != NULL) free(configfile); configfile = bstrdup(*argv); - argc--; + argc--; argv++; } if (argc) { usage(); } + server_tid = pthread_self(); if (!no_signals) { init_signals(terminate_filed); + } else { + /* This reduces the number of signals facilitating debugging */ + watchdog_sleep_time = 120; /* long timeout for debugging */ } if (configfile == NULL) { @@ -161,8 +193,8 @@ int main (int argc, char *argv[]) me = (CLIENT *)GetNextRes(R_CLIENT, NULL); UnlockRes(); if (!me) { - Emsg1(M_ABORT, 0, _("No File daemon resource defined in %s\n\ -Without that I don't know who I am :-(\n"), configfile); + Emsg1(M_ABORT, 0, _("No File daemon resource defined in %s\n" +"Without that I don't know who I am :-(\n"), configfile); } else { my_name_is(0, NULL, me->hdr.name); if (!me->messages) { @@ -176,18 +208,23 @@ Without that I don't know who I am :-(\n"), configfile); close_msg(NULL); /* close temp message handler */ init_msg(NULL, me->messages); /* open user specified message handler */ } - working_directory = me->working_directory; + + set_working_directory(me->working_directory); if (test_config) { terminate_filed(0); } - if (!foreground) { + if (!foreground &&!inetd_request) { daemon_start(); init_stack_dump(); /* set new pid */ } - create_pid_file(me->pid_directory, "bacula-fd", me->FDport); + /* Maximum 1 daemon at a time */ + create_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); + read_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); + + drop(uid, gid); #ifdef BOMB me += 1000000; @@ -195,30 +232,51 @@ Without that I don't know who I am :-(\n"), configfile); set_thread_concurrency(10); - start_watchdog(); /* start watchdog thread */ - - /* Become server, and handle requests */ - Dmsg1(10, "filed: listening on port %d\n", me->FDport); - bnet_thread_server(me->FDaddr, me->FDport, me->MaxConcurrentJobs, - &dir_workq, handle_client_request); + if (!no_signals) { + start_watchdog(); /* start watchdog thread */ + init_jcr_subsystem(); /* start JCR watchdogs etc. */ + } + server_tid = pthread_self(); + + if (inetd_request) { + /* Socket is on fd 0 */ + struct sockaddr client_addr; + int port = -1; + socklen_t client_addr_len = sizeof(client_addr); + if (getsockname(0, &client_addr, &client_addr_len) == 0) { + /* MA BUG 6 remove ifdefs */ + port = sockaddr_get_port_net_order(&client_addr); + } + BSOCK *bs = init_bsock(NULL, 0, "client", "unknown client", port, &client_addr); + handle_client_request((void *)bs); + } else { + /* Become server, and handle requests */ + IPADDR *p; + foreach_dlist(p, me->FDaddrs) { + Dmsg1(10, "filed: listening on port %d\n", p->get_port_host_order()); + } + bnet_thread_server(me->FDaddrs, me->MaxConcurrentJobs, &dir_workq, handle_client_request); + } + terminate_filed(0); exit(0); /* should never get here */ } void terminate_filed(int sig) { - stop_watchdog(); - + bnet_stop_thread_server(server_tid); + write_state_file(me->working_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); + delete_pid_file(me->pid_directory, "bacula-fd", get_first_port_host_order(me->FDaddrs)); if (configfile != NULL) { free(configfile); } if (debug_level > 5) { - print_memory_pool_stats(); + print_memory_pool_stats(); } - delete_pid_file(me->pid_directory, "bacula-fd", me->FDport); free_config_resources(); term_msg(); + stop_watchdog(); close_memory_pool(); /* release free memory in pool */ - sm_dump(False); /* dump orphaned buffers */ - exit(1); + sm_dump(false); /* dump orphaned buffers */ + exit(sig); }