X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=d98009d0097f25540174e1a79f194dada46093e4;hp=2018b8eece1988206e2992f560b65fa73059ff5e;hb=d4603bf234d23adb56b208efb90ce66772c4ef5b;hpb=767a4a54c967bc4b80bd14d02e89fe91acd848dd diff --git a/server.c b/server.c index 2018b8ee..d98009d0 100644 --- a/server.c +++ b/server.c @@ -41,10 +41,12 @@ #include "server.lsg.h" #include "para.h" #include "error.h" +#include "lsu.h" #include "crypt.h" #include "afh.h" #include "string.h" #include "afs.h" +#include "net.h" #include "server.h" #include "list.h" #include "send.h" @@ -52,7 +54,6 @@ #include "vss.h" #include "config.h" #include "close_on_fork.h" -#include "net.h" #include "daemon.h" #include "ipc.h" #include "fd.h" @@ -86,7 +87,15 @@ struct lls_parse_result *server_lpr = NULL; /* Command line options (no config file options). Used in handle_sighup(). */ static struct lls_parse_result *cmdline_lpr; -/** A random value used in child context for authentication. */ +/** + * A random number used to "authenticate" the afs connection. + * + * para_server picks this number by random before it forks the afs process. The + * command handlers know this number as well and write it to the afs socket, + * together with the id of the shared memory area which contains the payload of + * the afs command. A local process has to know this number to abuse the afs + * service provided by the local socket. + */ uint32_t afs_socket_cookie; /** The mutex protecting the shared memory area containing the mmd struct. */ @@ -169,57 +178,20 @@ err_out: void parse_config_or_die(bool reload) { int ret; - char *cf = NULL, *errctx = NULL, *user_list_file = NULL; - void *map; - size_t sz; - int cf_argc; - char **cf_argv; - struct lls_parse_result *cf_lpr, *merged_lpr; - char *home = para_homedir(); - - daemon_close_log(); - if (OPT_GIVEN(CONFIG_FILE)) - cf = para_strdup(OPT_STRING_VAL(CONFIG_FILE)); - else - cf = make_message("%s/.paraslash/server.conf", home); - if (!mmd || getpid() != afs_pid) { - if (OPT_GIVEN(USER_LIST)) - user_list_file = para_strdup(OPT_STRING_VAL(USER_LIST)); - else - user_list_file = make_message("%s/.paraslash/server.users", home); - } - free(home); - ret = mmap_full_file(cf, O_RDONLY, &map, &sz, NULL); - if (ret < 0) { - if (ret != -E_EMPTY && ret != -ERRNO_TO_PARA_ERROR(ENOENT)) - goto free_cf; - if (ret == -ERRNO_TO_PARA_ERROR(ENOENT) && OPT_GIVEN(CONFIG_FILE)) - goto free_cf; - server_lpr = cmdline_lpr; - goto success; - } - ret = lls(lls_convert_config(map, sz, NULL, &cf_argv, &errctx)); - para_munmap(map, sz); - if (ret < 0) - goto free_cf; - cf_argc = ret; - ret = lls(lls_parse(cf_argc, cf_argv, CMD_PTR, &cf_lpr, &errctx)); - lls_free_argv(cf_argv); - if (ret < 0) - goto free_cf; - if (reload) /* config file overrides command line */ - ret = lls(lls_merge(cf_lpr, cmdline_lpr, CMD_PTR, &merged_lpr, - &errctx)); - else /* command line options override config file options */ - ret = lls(lls_merge(cmdline_lpr, cf_lpr, CMD_PTR, &merged_lpr, - &errctx)); - lls_free_parse_result(cf_lpr, CMD_PTR); - if (ret < 0) - goto free_cf; + unsigned flags = MCF_DONT_FREE; + if (server_lpr != cmdline_lpr) lls_free_parse_result(server_lpr, CMD_PTR); - server_lpr = merged_lpr; -success: + server_lpr = cmdline_lpr; + if (reload) + flags |= MCF_OVERRIDE; + ret = lsu_merge_config_file_options(OPT_STRING_VAL(CONFIG_FILE), + "server.conf", &server_lpr, CMD_PTR, server_suite, flags); + if (ret < 0) { + PARA_EMERG_LOG("failed to parse config file: %s\n", + para_strerror(-ret)); + exit(EXIT_FAILURE); + } daemon_set_loglevel(ENUM_STRING_VAL(LOGLEVEL)); if (OPT_GIVEN(LOGFILE)) { daemon_set_logfile(OPT_STRING_VAL(LOGFILE)); @@ -238,19 +210,19 @@ success: if (OPT_GIVEN(LOG_TIMING)) daemon_set_flag(DF_LOG_TIMING); daemon_set_priority(OPT_UINT32_VAL(PRIORITY)); - if (user_list_file) + if (!reload || getpid() != afs_pid) { + char *user_list_file; + if (OPT_GIVEN(USER_LIST)) + user_list_file = para_strdup(OPT_STRING_VAL(USER_LIST)); + else { + char *home = para_homedir(); + user_list_file = make_message("%s/.paraslash/server.users", home); + free(home); + } init_user_list(user_list_file); - ret = 1; -free_cf: - free(cf); - free(user_list_file); - if (ret < 0) { - if (errctx) - PARA_ERROR_LOG("%s\n", errctx); - free(errctx); - PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - exit(EXIT_FAILURE); + free(user_list_file); } + return; } /* @@ -454,7 +426,7 @@ static int init_afs(int argc, char **argv) i = argc - lls_num_inputs(cmdline_lpr) - 1; sprintf(argv[i], "para_server (afs)"); close(afs_server_socket[0]); - afs_init(afs_socket_cookie, afs_server_socket[1]); + afs_init(afs_server_socket[1]); } close(afs_server_socket[1]); if (read(afs_server_socket[0], &c, 1) <= 0) {