X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fstored.c;h=39eef886292955bbb239eb9d1cda80eec5e699ea;hb=9cdeafde391bd0c57693398f3b9eac9404892f1b;hp=b91718ed486885119280e360242e83625754ac9d;hpb=fe1f0d16f93ae192623e9c5027d81d1f8aa51cd8;p=bacula%2Fbacula diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index b91718ed48..39eef88629 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -33,6 +33,7 @@ /* Forward referenced functions */ void terminate_stored(int sig); static int check_resources(); +static void cleanup_old_files(); extern "C" void *device_initialization(void *arg); @@ -62,7 +63,7 @@ static void usage() { fprintf(stderr, _( "Copyright (C) 2000-2005 Kern Sibbald.\n" -"\nVersion: " VERSION " (" BDATE ")\n\n" +"\nVersion: %s (%s)\n\n" "Usage: stored [options] [-c config_file] [config_file]\n" " -c use as configuration file\n" " -dnn set debug level to nn\n" @@ -74,7 +75,7 @@ static void usage() " -u userid to \n" " -v verbose user messages\n" " -? print this message.\n" -"\n")); +"\n"), VERSION, BDATE); exit(1); } @@ -92,19 +93,22 @@ int main (int argc, char *argv[]) char *uid = NULL; char *gid = NULL; + setlocale(LC_ALL, ""); + bindtextdomain("bacula", LOCALEDIR); + textdomain("bacula"); + init_stack_dump(); my_name_is(argc, argv, "bacula-sd"); - textdomain("bacula"); init_msg(NULL, NULL); daemon_start_time = time(NULL); /* Sanity checks */ if (TAPE_BSIZE % B_DEV_BSIZE != 0 || TAPE_BSIZE / B_DEV_BSIZE == 0) { - Emsg2(M_ABORT, 0, "Tape block size (%d) not multiple of system size (%d)\n", + Emsg2(M_ABORT, 0, _("Tape block size (%d) not multiple of system size (%d)\n"), TAPE_BSIZE, B_DEV_BSIZE); } if (TAPE_BSIZE != (1 << (ffs(TAPE_BSIZE)-1))) { - Emsg1(M_ABORT, 0, "Tape block size (%d) is not a power of 2\n", TAPE_BSIZE); + Emsg1(M_ABORT, 0, _("Tape block size (%d) is not a power of 2\n"), TAPE_BSIZE); } while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) { @@ -181,8 +185,8 @@ int main (int argc, char *argv[]) parse_config(configfile); - if (init_tls() != 0) { - Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("TLS library initialization failed.\n")); + if (init_crypto() != 0) { + Jmsg((JCR *)NULL, M_ERROR_TERM, 0, _("Cryptography library initialization failed.\n")); } if (!check_resources()) { @@ -205,6 +209,9 @@ int main (int argc, char *argv[]) drop(uid, gid); + cleanup_old_files(); + + /* Ensure that Volume Session Time and Id are both * set and are both non-zero. */ @@ -251,7 +258,6 @@ uint32_t newVolSessionId() static int check_resources() { bool OK = true; - AUTOCHANGER *changer; me = (STORES *)GetNextRes(R_STORAGE, NULL); @@ -390,48 +396,8 @@ static int check_resources() } } - /* Ensure that the media_type for each device is the same */ - foreach_res(changer, R_AUTOCHANGER) { - DEVRES *device; - char *media_type = NULL; - foreach_alist(device, changer->device) { - /* - * If the device does not have a changer name or changer command - * defined, used the one from the Autochanger resource - */ - if (!device->changer_name && changer->changer_name) { - device->changer_name = bstrdup(changer->changer_name); - } - if (!device->changer_command && changer->changer_command) { - device->changer_command = bstrdup(changer->changer_command); - } - if (!device->changer_name) { - Jmsg(NULL, M_ERROR, 0, - _("No Changer Name given for device %s. Cannot continue.\n"), - device->hdr.name); - OK = false; - } - if (!device->changer_command) { - Jmsg(NULL, M_ERROR, 0, - _("No Changer Command given for device %s. Cannot continue.\n"), - device->hdr.name); - OK = false; - } + OK = init_autochangers(); - if (media_type == NULL) { - media_type = device->media_type; /* get Media Type of first device */ - continue; - } - /* Ensure that other devices Media Types are the same */ - if (strcmp(media_type, device->media_type) != 0) { - Jmsg(NULL, M_ERROR, 0, - _("Media Type not the same for all devices in changer %s. Cannot continue.\n"), - changer->hdr.name); - OK = false; - continue; - } - } - } if (OK) { close_msg(NULL); /* close temp message handler */ @@ -442,6 +408,22 @@ static int check_resources() return OK; } +static void cleanup_old_files() +{ + POOLMEM *cleanup = get_pool_memory(PM_MESSAGE); + int len = strlen(me->working_directory); + pm_strcpy(cleanup, "/bin/rm -f "); + pm_strcat(cleanup, me->working_directory); + if (len > 0 && me->working_directory[len-1] != '/') { + pm_strcat(cleanup, "/"); + } + pm_strcat(cleanup, my_name); + pm_strcat(cleanup, "*.spool"); + run_program(cleanup, 0, NULL); + free_pool_memory(cleanup); +} + + /* * Here we attempt to init and open each device. This is done * once at startup in a separate thread. @@ -474,16 +456,19 @@ void *device_initialization(void *arg) continue; } - dcr = new_dcr(jcr, dev); + jcr->dcr = dcr = new_dcr(jcr, dev); + if (dev->is_autochanger()) { + /* If autochanger set slot in dev sturcture */ + get_autochanger_loaded_slot(dcr); + } if (device->cap_bits & CAP_ALWAYSOPEN) { Dmsg1(20, "calling first_open_device %s\n", dev->print_name()); if (!first_open_device(dcr)) { Jmsg1(NULL, M_ERROR, 0, _("Could not open device %s\n"), dev->print_name()); Dmsg1(20, "Could not open device %s\n", dev->print_name()); - term_dev(dev); - device->dev = NULL; free_dcr(dcr); + jcr->dcr = NULL; continue; } } @@ -498,6 +483,7 @@ void *device_initialization(void *arg) } } free_dcr(dcr); + jcr->dcr = NULL; } free_jcr(jcr); init_done = true; @@ -542,6 +528,10 @@ void terminate_stored(int sig) pthread_cond_broadcast(&jcr->dcr->dev->wait_next_vol); pthread_cond_broadcast(&wait_device_release); } + if (jcr->read_dcr && jcr->read_dcr->dev && jcr->read_dcr->dev->dev_blocked) { + pthread_cond_broadcast(&jcr->read_dcr->dev->wait_next_vol); + pthread_cond_broadcast(&wait_device_release); + } bmicrosleep(0, 50000); } free_jcr(jcr); @@ -575,7 +565,7 @@ void terminate_stored(int sig) } term_msg(); stop_watchdog(); - cleanup_tls(); + cleanup_crypto(); free_volume_list(); close_memory_pool();