Merge branch 'refs/heads/t/abtract_sockets'
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 8 Mar 2015 18:32:37 +0000 (19:32 +0100)
committerAndre Noll <maan@tuebingen.mpg.de>
Sun, 8 Mar 2015 18:43:44 +0000 (19:43 +0100)
Was cooking for almost one month and seems to work fine.

manual: Move /var/paraslash instructions to Troubleshooting.
Abstract sockets for server and audiod.
create_local_socket(): Avoid code duplication.
net.c: Combine remote_name() and __get_sock_name().
Remove socket address parameter of create_local_socket().

NEWS
afs.c
audiod.c
gui.c
interactive.c
server.c
signal.c
signal.h

diff --git a/NEWS b/NEWS
index cf301a2dde17284d19899c1f2670ebb73737bb90..b29d4b828ed1245b59795927667d3c6470d10332 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,14 @@
 NEWS
 ====
 
+-----------------------------------------
+current master branch "magnetic momentum"
+-----------------------------------------
+       - On Linux systems, local sockets are now created in the
+         abstract name space by default. This allows to get rid of
+         the socket specials in /var/paraslash.
+
+Download: ./releases/paraslash-git.tar.bz2 (tarball)
 ------------------------------------------
 0.5.4 (2015-01-23) "exponential alignment"
 ------------------------------------------
diff --git a/afs.c b/afs.c
index 65d6ed958d17d3238c5b55535bf661ec782d5c5f..c5e2c93ee51363a69f3178b77c4d79982b427f73 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -28,8 +28,8 @@
 #include "ipc.h"
 #include "list.h"
 #include "sched.h"
-#include "signal.h"
 #include "fd.h"
+#include "signal.h"
 #include "mood.h"
 #include "sideband.h"
 #include "command.h"
@@ -89,7 +89,7 @@ extern struct misc_meta_data *mmd;
 
 static int server_socket;
 static struct command_task command_task_struct;
-static struct signal_task signal_task_struct;
+static struct signal_task *signal_task;
 
 static enum play_mode current_play_mode;
 static char *current_mop; /* mode or playlist specifier. NULL means dummy mood */
@@ -713,12 +713,6 @@ static int open_afs_tables(void)
        return ret;
 }
 
-static void signal_pre_select(struct sched *s, void *context)
-{
-       struct signal_task *st = context;
-       para_fd_set(st->fd, &s->rfds, &s->max_fileno);
-}
-
 static int afs_signal_post_select(struct sched *s, __a_unused void *context)
 {
        int signum, ret;
@@ -747,20 +741,17 @@ shutdown:
 
 static void register_signal_task(struct sched *s)
 {
-       struct signal_task *st = &signal_task_struct;
-
        para_sigaction(SIGPIPE, SIG_IGN);
-       st->fd = para_signal_init();
-       PARA_INFO_LOG("signal pipe: fd %d\n", st->fd);
+       signal_task = signal_init_or_die();
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGHUP);
 
-       st->task = task_register(&(struct task_info) {
+       signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,
                .post_select = afs_signal_post_select,
-               .context = st,
+               .context = signal_task,
 
        }, s);
 }
index acf41376f50f196414d327bfb11f506c4fe8d7e2..8f246ba53a04bad687af14d428bec276c822f001 100644 (file)
--- a/audiod.c
+++ b/audiod.c
@@ -144,7 +144,7 @@ struct audiod_args_info conf;
 static char *socket_name;
 static struct audio_format_info afi[NUM_AUDIO_FORMATS];
 
-static struct signal_task signal_task_struct, *sig_task = &signal_task_struct;
+static struct signal_task *signal_task;
 
 static struct status_task status_task_struct;
 
@@ -355,8 +355,7 @@ err:
 
 static void setup_signal_handling(void)
 {
-       sig_task->fd = para_signal_init();
-       PARA_INFO_LOG("signal pipe: fd %d\n", sig_task->fd);
+       signal_task = signal_init_or_die();
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGHUP);
@@ -986,12 +985,6 @@ static void init_local_sockets(struct command_task *ct)
        exit(EXIT_FAILURE);
 }
 
-static void signal_pre_select(struct sched *s, void *context)
-{
-       struct signal_task *st = context;
-       para_fd_set(st->fd, &s->rfds, &s->max_fileno);
-}
-
 static int signal_post_select(struct sched *s, void *context)
 {
        struct signal_task *st = context;
@@ -1418,11 +1411,11 @@ int main(int argc, char *argv[])
        if (conf.daemon_given)
                daemonize(false /* parent exits immediately */);
 
-       sig_task->task = task_register(&(struct task_info) {
+       signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,
                .post_select = signal_post_select,
-               .context = sig_task,
+               .context = signal_task,
        }, &sched);
 
        sched.default_timeout.tv_sec = 2;
@@ -1430,6 +1423,7 @@ int main(int argc, char *argv[])
        ret = schedule(&sched);
        audiod_cleanup();
        sched_shutdown(&sched);
+       signal_shutdown(signal_task);
 
        if (ret < 0)
                PARA_EMERG_LOG("%s\n", para_strerror(-ret));
diff --git a/gui.c b/gui.c
index 5d1a1b62596e6fa545579e760dedbac81f6be59a..c82cd8c32300b27d2bd6c5a8d15bff60e52fb372 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1132,12 +1132,6 @@ static int input_post_select(__a_unused struct sched *s, __a_unused void *contex
        return 0;
 }
 
-static void signal_pre_select(struct sched *s, void *context)
-{
-       struct signal_task *st = context;
-       para_fd_set(st->fd, &s->rfds, &s->max_fileno);
-}
-
 static void print_scroll_msg(void)
 {
        unsigned lines_total, filled = ringbuffer_filled(bot_win_rb);
@@ -1412,7 +1406,7 @@ static int setup_tasks_and_schedule(void)
        struct exec_task exec_task = {.task = NULL};
        struct status_task status_task = {.fd = -1};
        struct input_task input_task = {.task = NULL};
-       struct signal_task signal_task = {.task = NULL};
+       struct signal_task *signal_task;
        struct sched sched = {
                .default_timeout = {
                        .tv_sec = conf.timeout_arg  / 1000,
@@ -1441,19 +1435,20 @@ static int setup_tasks_and_schedule(void)
                .context = &input_task,
        }, &sched);
 
-       signal_task.fd = para_signal_init();
+       signal_task = signal_init_or_die();
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGUSR1);
-       signal_task.task = task_register(&(struct task_info) {
+       signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,
                .post_select = signal_post_select,
-               .context = &signal_task,
+               .context = signal_task,
        }, &sched);
        ret = schedule(&sched);
        sched_shutdown(&sched);
+       signal_shutdown(signal_task);
        return ret;
 }
 
index e4bd6ba20338cfc951613c4e4dca12160f4da068..484f9550cae9a8e03e2cd76843bd03d7d25fb825 100644 (file)
@@ -6,14 +6,14 @@
 
 /** \file interactive.c Readline abstraction for interactive sessions. */
 
+#include "para.h"
+
 #include <regex.h>
-#include <curses.h>
 #include <readline/readline.h>
 #include <readline/history.h>
 #include <sys/ioctl.h>
 #include <signal.h>
 
-#include "para.h"
 #include "fd.h"
 #include "buffer_tree.h"
 #include "list.h"
index 6c2cbb8758bc5f98e12ca69198ebfb069c595e77..68434e94e56820c81bb14de76b6759bc645cce29 100644 (file)
--- a/server.c
+++ b/server.c
@@ -100,6 +100,7 @@ int mmd_mutex;
 static char *user_list_file = NULL;
 
 static struct sched sched;
+static struct signal_task *signal_task;
 
 /** The task responsible for server command handling. */
 struct server_command_task {
@@ -227,12 +228,6 @@ out:
        exit(EXIT_FAILURE);
 }
 
-static void signal_pre_select(struct sched *s, void *context)
-{
-       struct signal_task *st = context;
-       para_fd_set(st->fd, &s->rfds, &s->max_fileno);
-}
-
 /*
  * called when server gets SIGHUP or when client invokes hup command.
  */
@@ -301,22 +296,18 @@ cleanup:
 
 static void init_signal_task(void)
 {
-       static struct signal_task signal_task_struct,
-               *st = &signal_task_struct;
-
-       PARA_NOTICE_LOG("setting up signal handling\n");
-       st->fd = para_signal_init(); /* always successful */
+       signal_task = signal_init_or_die();
        para_install_sighandler(SIGINT);
        para_install_sighandler(SIGTERM);
        para_install_sighandler(SIGHUP);
        para_install_sighandler(SIGCHLD);
        para_sigaction(SIGPIPE, SIG_IGN);
-       add_close_on_fork_list(st->fd);
-       st->task = task_register(&(struct task_info) {
+       add_close_on_fork_list(signal_task->fd);
+       signal_task->task = task_register(&(struct task_info) {
                .name = "signal",
                .pre_select = signal_pre_select,
                .post_select = signal_post_select,
-               .context = st,
+               .context = signal_task,
 
        }, &sched);
 }
@@ -370,7 +361,7 @@ static int command_post_select(struct sched *s, void *context)
        free(chunk_table);
        alarm(ALARM_TIMEOUT);
        close_listed_fds();
-       para_signal_shutdown();
+       signal_shutdown(signal_task);
        /*
         * put info on who we are serving into argv[0] to make
         * client ip visible in top/ps
index 780c8326de578e303c2d0028df8b6478f48027d0..5d6e6e45dcd8e728c1bfcc6e08899bf08d4fc512 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -7,11 +7,13 @@
 
 #include <signal.h>
 #include <sys/types.h>
+#include <regex.h>
 
 #include "para.h"
 #include "error.h"
 #include "fd.h"
 #include "list.h"
+#include "string.h"
 #include "sched.h"
 #include "signal.h"
 
@@ -32,12 +34,14 @@ static int signal_pipe[2];
  * ready for reading, see select(2).
  *
  * \return This function either succeeds or calls exit(2) to terminate the
- * current process. On success, the file descriptor of the read end of the
- * signal pipe is returned.
+ * current process. On success, a signal task structure is returned.
  */
-int para_signal_init(void)
+struct signal_task *signal_init_or_die(void)
 {
+       struct signal_task *st;
        int ret;
+
+       PARA_NOTICE_LOG("setting up signal handling\n");
        if (pipe(signal_pipe) < 0) {
                ret = -ERRNO_TO_PARA_ERROR(errno);
                goto err_out;
@@ -48,7 +52,9 @@ int para_signal_init(void)
        ret = mark_fd_nonblocking(signal_pipe[1]);
        if (ret < 0)
                goto err_out;
-       return signal_pipe[0];
+       st = para_calloc(sizeof(*st));
+       st->fd = signal_pipe[0];
+       return st;
 err_out:
        PARA_EMERG_LOG("%s\n", para_strerror(-ret));
        exit(EXIT_FAILURE);
@@ -223,9 +229,12 @@ int para_next_signal(fd_set *rfds)
 }
 
 /**
- * Close the write end of the signal pipe.
+ * Close the write end of the signal pipe, deallocate resources.
+ *
+ * \param st The pointer obtained earlier from signal_init_or_die().
  */
-void para_signal_shutdown(void)
+void signal_shutdown(struct signal_task *st)
 {
        close(signal_pipe[1]);
+       free(st);
 }
index 1e562af76ffb4487d206be001a909ca0a6a9311d..b5b06f356999062f3b9b233e8303eea33015804a 100644 (file)
--- a/signal.h
+++ b/signal.h
@@ -16,11 +16,17 @@ struct signal_task {
        struct task *task;
 };
 
-int para_signal_init(void);
+_static_inline_ void signal_pre_select(struct sched *s, void *context)
+{
+       struct signal_task *st = context;
+       para_fd_set(st->fd, &s->rfds, &s->max_fileno);
+}
+
+struct signal_task *signal_init_or_die(void);
 void para_sigaction(int sig, void (*handler)(int));
 void para_install_sighandler(int);
 int para_reap_child(pid_t *pid);
 int para_next_signal(fd_set *rfds);
-void para_signal_shutdown(void);
+void signal_shutdown(struct signal_task *st);
 void para_block_signal(int sig);
 void para_unblock_signal(int sig);