]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - server.c
task_register() conversion: client exec task
[paraslash.git] / server.c
index 342946abe0a3107ae40b2e17c973f0977b9b584d..1d67b8b8f503bcaad721371b01c3ef07c6dd7e81 100644 (file)
--- a/server.c
+++ b/server.c
  *     - Doubly linked lists: \ref list.h.
  */
 
+#include <netinet/in.h>
+#include <sys/socket.h>
 #include <signal.h>
 #include <regex.h>
 #include <osl.h>
+#include <sys/types.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+#include <netdb.h>
 
 #include "para.h"
 #include "error.h"
@@ -104,7 +110,7 @@ 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)
@@ -231,7 +237,7 @@ out:
 
 static void signal_pre_select(struct sched *s, struct task *t)
 {
-       struct signal_task *st = container_of(t, struct signal_task, task);
+       struct signal_task *st = task_context(t);
        para_fd_set(st->fd, &s->rfds, &s->max_fileno);
 }
 
@@ -306,10 +312,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 +320,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)
 {
-       struct server_command_task *sct = container_of(t, struct server_command_task, task);
+       struct server_command_task *sct = task_context(t);
        para_fd_set(sct->listen_fd, &s->rfds, &s->max_fileno);
 }
 
 static int command_post_select(struct sched *s, struct task *t)
 {
-       struct server_command_task *sct = container_of(t, struct server_command_task, task);
+       struct server_command_task *sct = task_context(t);
 
        int new_fd, ret, i;
        char *peer_name;
@@ -393,8 +401,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 +411,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));
@@ -567,6 +577,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);