X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fstored%2Fstored.c;h=957738336fb02483cd4b80d8cb9a2031098582fb;hb=b9265a6898ae36e450755721acfbf4a52342bc2f;hp=3559143b8867f5a1a0e1d49118e9cdfc9fc28cd4;hpb=bda5e7d8fe715e9446caab10f04166d2a699231f;p=bacula%2Fbacula diff --git a/bacula/src/stored/stored.c b/bacula/src/stored/stored.c index 3559143b88..957738336f 100644 --- a/bacula/src/stored/stored.c +++ b/bacula/src/stored/stored.c @@ -38,7 +38,8 @@ /* Forward referenced functions */ void terminate_stored(int sig); static void check_config(); -static void *device_allocation(void *arg); + +extern "C" void *device_allocation(void *arg); #define CONFIG_FILE "bacula-sd.conf" /* Default config file */ @@ -46,7 +47,8 @@ static void *device_allocation(void *arg); /* Global variables exported */ char OK_msg[] = "3000 OK\n"; char TERM_msg[] = "3999 Terminate\n"; -STORES *me; /* our Global resource */ +STORES *me = NULL; /* our Global resource */ +bool forge_on = false; /* proceed inspite of I/O errors */ static uint32_t VolSessionId = 0; uint32_t VolSessionTime; @@ -57,18 +59,20 @@ static int foreground = 0; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static workq_t dird_workq; /* queue for processing connections */ + static void usage() { fprintf(stderr, _( "\nVersion: " VERSION " (" BDATE ")\n\n" -"Usage: stored [-s -f ] [-c config_file] [-d debug_level] [config_file]\n" +"Usage: stored [options] [-c config_file] [config_file]\n" " -c use as configuration file\n" " -dnn set debug level to nn\n" " -f run in foreground (for debugging)\n" -" -g groupid\n" +" -g set groupid to group\n" +" -p proceed despite I/O errors\n" " -s no signals (for debugging)\n" " -t test - read config and exit\n" -" -u userid\n" +" -u userid to \n" " -v verbose user messages\n" " -? print this message.\n" "\n")); @@ -91,7 +95,7 @@ int main (int argc, char *argv[]) init_stack_dump(); my_name_is(argc, argv, "bacula-sd"); - textdomain("bacula-sd"); + textdomain("bacula"); init_msg(NULL, NULL); daemon_start_time = time(NULL); @@ -104,7 +108,7 @@ int main (int argc, char *argv[]) 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:stu:v?")) != -1) { + while ((ch = getopt(argc, argv, "c:d:fg:pstu:v?")) != -1) { switch (ch) { case 'c': /* configuration file */ if (configfile != NULL) { @@ -128,6 +132,10 @@ int main (int argc, char *argv[]) gid = optarg; break; + case 'p': /* proceed in spite of I/O errors */ + forge_on = true; + break; + case 's': /* no signals */ no_signals = TRUE; break; @@ -186,6 +194,7 @@ int main (int argc, char *argv[]) } create_pid_file(me->pid_directory, "bacula-sd", me->SDport); + read_state_file(me->working_directory, "bacula-sd", me->SDport); drop(uid, gid); @@ -219,7 +228,7 @@ int main (int argc, char *argv[]) /* Single server used for Director and File daemon */ bnet_thread_server(me->SDaddr, me->SDport, me->max_concurrent_jobs * 2 + 1, - &dird_workq, connection_request); + &dird_workq, handle_connection_request); exit(1); /* to keep compiler quiet */ } @@ -287,15 +296,15 @@ static void check_config() * We are started as a separate thread. The * resources are alread locked. */ -static void *device_allocation(void *arg) +extern "C" +void *device_allocation(void *arg) { - int i; DEVRES *device; LockRes(); pthread_detach(pthread_self()); - for (device=NULL,i=0; (device=(DEVRES *)GetNextRes(R_DEVICE, (RES *)device)); i++) { + foreach_res(device, R_DEVICE) { Dmsg1(90, "calling init_dev %s\n", device->device_name); device->dev = init_dev(NULL, device); Dmsg1(10, "SD init done %s\n", device->device_name); @@ -303,6 +312,7 @@ static void *device_allocation(void *arg) Emsg1(M_ERROR, 0, _("Could not initialize %s\n"), device->device_name); continue; } + if (device->cap_bits & CAP_ALWAYSOPEN) { Dmsg1(20, "calling first_open_device %s\n", device->device_name); if (!first_open_device(device->dev)) { @@ -311,11 +321,18 @@ static void *device_allocation(void *arg) } if (device->cap_bits & CAP_AUTOMOUNT && device->dev && device->dev->state & ST_OPENED) { - DEV_BLOCK *block; JCR *jcr; - block = new_block(device->dev); + DCR *dcr; jcr = new_jcr(sizeof(JCR), stored_free_jcr); - switch (read_dev_volume_label(jcr, device->dev, block)) { + jcr->JobType = JT_SYSTEM; + /* Initialize FD start condition variable */ + int errstat = pthread_cond_init(&jcr->job_start_wait, NULL); + if (errstat != 0) { + Jmsg1(jcr, M_ABORT, 0, _("Unable to init job cond variable: ERR=%s\n"), strerror(errstat)); + } + jcr->device = device; + dcr = new_dcr(jcr, device->dev); + switch (read_dev_volume_label(dcr, dcr->block)) { case VOL_OK: break; default: @@ -323,7 +340,6 @@ static void *device_allocation(void *arg) break; } free_jcr(jcr); - free_block(block); } } UnlockRes(); @@ -351,7 +367,7 @@ void terminate_stored(int sig) * volume status. */ lock_jcr_chain(); - for (jcr=NULL; (jcr=get_next_jcr(jcr)); ) { + foreach_jcr(jcr) { BSOCK *fd; free_locked_jcr(jcr); if (jcr->JobId == 0) { @@ -373,12 +389,13 @@ void terminate_stored(int sig) bmicrosleep(0, 500000); /* give them 1/2 sec to clean up */ } + write_state_file(me->working_directory, "bacula-sd", me->SDport); delete_pid_file(me->pid_directory, "bacula-sd", me->SDport); Dmsg1(200, "In terminate_stored() sig=%d\n", sig); LockRes(); - for (device=NULL; (device=(DEVRES *)GetNextRes(R_DEVICE, (RES *)device)); ) { + foreach_res(device, R_DEVICE) { if (device->dev) { term_dev(device->dev); } @@ -396,6 +413,6 @@ void terminate_stored(int sig) stop_watchdog(); close_memory_pool(); - sm_dump(False); /* dump orphaned buffers */ - exit(1); + sm_dump(false); /* dump orphaned buffers */ + exit(sig); }