X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.c;h=6c2cbb8758bc5f98e12ca69198ebfb069c595e77;hp=342946abe0a3107ae40b2e17c973f0977b9b584d;hb=173f53675e7763e0426c063eb5a90606786d25f4;hpb=418050d3422358c01ea4a87a3a58d6e53fb69436 diff --git a/server.c b/server.c index 342946ab..6c2cbb87 100644 --- a/server.c +++ b/server.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1997-2014 Andre Noll + * Copyright (C) 1997 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -34,9 +34,15 @@ * - Doubly linked lists: \ref list.h. */ +#include +#include #include #include #include +#include +#include +#include +#include #include "para.h" #include "error.h" @@ -104,30 +110,20 @@ struct server_command_task { /** Argument vector passed to para_server's main function. */ char **argv; /** The command task structure for scheduling. */ - struct task task; + struct task *task; }; -static int want_colors(void) -{ - if (conf.color_arg == color_arg_no) - return 0; - if (conf.color_arg == color_arg_yes) - return 1; - if (conf.logfile_given) - return 0; - return isatty(STDERR_FILENO); -} - -static void init_colors_or_die(void) +/** + * Return the list of tasks for the server process. + * + * This is called from \a com_tasks(). The helper is necessary since command + * handlers can not access the scheduler structure directly. + * + * \return A dynamically allocated string that must be freed by the caller. + */ +char *server_get_tasks(void) { - int i; - - if (!want_colors()) - return; - daemon_set_flag(DF_COLOR_LOG); - daemon_set_default_log_colors(); - for (i = 0; i < conf.log_color_given; i++) - daemon_set_log_color_or_die(conf.log_color_arg[i]); + return get_task_list(&sched); } /* @@ -212,7 +208,9 @@ void parse_config_or_die(int override) daemon_set_logfile(conf.logfile_arg); daemon_open_log_or_die(); } - init_colors_or_die(); + + daemon_init_colors_or_die(conf.color_arg, color_arg_auto, color_arg_no, + conf.logfile_given, conf.log_color_arg, conf.log_color_given); daemon_set_flag(DF_LOG_PID); daemon_set_flag(DF_LOG_LL); daemon_set_flag(DF_LOG_TIME); @@ -229,9 +227,9 @@ out: exit(EXIT_FAILURE); } -static void signal_pre_select(struct sched *s, struct task *t) +static void signal_pre_select(struct sched *s, void *context) { - struct signal_task *st = container_of(t, struct signal_task, task); + struct signal_task *st = context; para_fd_set(st->fd, &s->rfds, &s->max_fileno); } @@ -247,7 +245,7 @@ static void handle_sighup(void) kill(mmd->afs_pid, SIGHUP); } -static int signal_post_select(struct sched *s, __a_unused struct task *t) +static int signal_post_select(struct sched *s, __a_unused void *context) { int signum = para_next_signal(&s->rfds); @@ -306,10 +304,6 @@ static void init_signal_task(void) static struct signal_task signal_task_struct, *st = &signal_task_struct; - st->task.pre_select = signal_pre_select; - st->task.post_select = signal_post_select; - sprintf(st->task.status, "signal task"); - PARA_NOTICE_LOG("setting up signal handling\n"); st->fd = para_signal_init(); /* always successful */ para_install_sighandler(SIGINT); @@ -318,18 +312,24 @@ static void init_signal_task(void) para_install_sighandler(SIGCHLD); para_sigaction(SIGPIPE, SIG_IGN); add_close_on_fork_list(st->fd); - register_task(&sched, &st->task); + st->task = task_register(&(struct task_info) { + .name = "signal", + .pre_select = signal_pre_select, + .post_select = signal_post_select, + .context = st, + + }, &sched); } -static void command_pre_select(struct sched *s, struct task *t) +static void command_pre_select(struct sched *s, void *context) { - struct server_command_task *sct = container_of(t, struct server_command_task, task); + struct server_command_task *sct = context; para_fd_set(sct->listen_fd, &s->rfds, &s->max_fileno); } -static int command_post_select(struct sched *s, struct task *t) +static int command_post_select(struct sched *s, void *context) { - struct server_command_task *sct = container_of(t, struct server_command_task, task); + struct server_command_task *sct = context; int new_fd, ret, i; char *peer_name; @@ -393,8 +393,6 @@ static void init_server_command_task(int argc, char **argv) *sct = &server_command_task_struct; PARA_NOTICE_LOG("initializing tcp command socket\n"); - sct->task.pre_select = command_pre_select; - sct->task.post_select = command_post_select; sct->argc = argc; sct->argv = argv; ret = para_listen_simple(IPPROTO_TCP, conf.port_arg); @@ -405,8 +403,12 @@ static void init_server_command_task(int argc, char **argv) if (ret < 0) goto err; add_close_on_fork_list(sct->listen_fd); /* child doesn't need the listener */ - sprintf(sct->task.status, "server command task"); - register_task(&sched, &sct->task); + sct->task = task_register(&(struct task_info) { + .name = "server command", + .pre_select = command_pre_select, + .post_select = command_post_select, + .context = sct, + }, &sched); return; err: PARA_EMERG_LOG("%s\n", para_strerror(-ret)); @@ -473,14 +475,12 @@ static void server_init(int argc, char **argv) version_handle_flag("server", conf.version_given); if (conf.help_given || conf.detailed_help_given) print_help_and_die(); - drop_privileges_or_die(conf.user_arg, conf.group_arg); + daemon_drop_privileges_or_die(conf.user_arg, conf.group_arg); /* parse config file, open log and set defaults */ parse_config_or_die(0); - log_welcome("para_server"); + daemon_log_welcome("para_server"); init_ipc_or_die(); /* init mmd struct and mmd->lock */ - /* make sure, the global now pointer is uptodate */ - clock_get_realtime(now); - set_server_start_time(now); + daemon_set_start_time(); init_user_list(user_list_file); /* become daemon */ if (conf.daemon_given) @@ -518,7 +518,7 @@ static void server_init(int argc, char **argv) static void status_refresh(void) { static int prev_uptime = -1, prev_events = -1; - int uptime = get_server_uptime(now); + int uptime = daemon_get_uptime(now); if (prev_events != mmd->events) goto out; @@ -567,6 +567,7 @@ int main(int argc, char *argv[]) server_init(argc, argv); mutex_lock(mmd_mutex); ret = schedule(&sched); + sched_shutdown(&sched); if (ret < 0) { PARA_EMERG_LOG("%s\n", para_strerror(-ret)); exit(EXIT_FAILURE);