/*
- * Copyright (C) 1997-2014 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1997-2014 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** Argument vector passed to para_server's main function. */
char **argv;
/** The command task structure for scheduling. */
- struct task task;
+ struct task *task;
};
+/**
+ * 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)
+{
+ return get_task_list(&sched);
+}
+
static int want_colors(void)
{
if (conf.color_arg == color_arg_no)
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);
}
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);
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);
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;
*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);
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));
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)
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;
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);