X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=adu.c;h=7d8c9abd0191b6d4c84036bcc70e7e91d2cf03f3;hp=b227589dbbb8e5f467421178c1d78ae052e1efb0;hb=1136bdfc82272850474eacba37cf87d01f6a1b7f;hpb=f9338eb031ef2bd9ec9d18d80140e7b539e47db0 diff --git a/adu.c b/adu.c index b227589..7d8c9ab 100644 --- a/adu.c +++ b/adu.c @@ -46,6 +46,8 @@ struct gengetopt_args_info conf; /** Options passed to --select-options. */ struct select_args_info select_conf; +/** Computed database dir */ +char *database_dir; /** * The table containing the directory names and statistics. @@ -183,21 +185,27 @@ static int init_signals(void) */ int open_dir_table(int create) { + int ret; if (dir_table) return 1; - dir_table_desc.dir = adu_strdup(conf.database_dir_arg); + dir_table_desc.dir = adu_strdup(database_dir); if (create) { + INFO_LOG("creating database directory structure\n"); + ret = mkpath(dir_table_desc.dir, 0777); + if (ret < 0) + goto out; NOTICE_LOG("creating dir table\n"); - int ret = osl(osl_create_table(&dir_table_desc)); - if (ret < 0) { - free((char *)dir_table_desc.dir); - return ret; - } + ret = osl(osl_create_table(&dir_table_desc)); + if (ret < 0) + goto out; } INFO_LOG("opening dir table\n"); return osl(osl_open_table(&dir_table_desc, &dir_table)); +out: + free((char *)dir_table_desc.dir); + return ret; } static int check_args(void) @@ -251,6 +259,27 @@ static void print_complete_help_and_die(void) exit(EXIT_FAILURE); } +static void get_database_dir_or_die(void) +{ + char *tmp; + + if (conf.database_dir_given) + tmp = adu_strdup(conf.database_dir_arg); + else + tmp = make_message("%s%s", + conf.database_root_arg, conf.base_dir_arg); + /* + * As we change the cwd during database creation, database_dir + * must be an absolute path. + */ + database_dir = absolute_path(tmp); + free(tmp); + if (database_dir) + return; + EMERG_LOG("failed to get absolute path of database dir\n"); + exit(EXIT_FAILURE); +} + /** * The main function of adu. * @@ -292,7 +321,7 @@ int main(int argc, char **argv) ret = init_signals(); if (ret < 0) goto out; - ret = -E_SYNTAX; + get_database_dir_or_die(); if (conf.select_given) ret = com_select(); else if (conf.create_given) @@ -307,6 +336,7 @@ out: ERROR_LOG("%s\n", adu_strerror(-ret)); return -EXIT_FAILURE; } + free(database_dir); cmdline_parser_free(&conf); select_cmdline_parser_free(&select_conf); return EXIT_SUCCESS;