X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=e73c668fb6d93b3a200eb841e4d4c34ce4b48e59;hp=dd0d1bcd14c3cc7ba75c6b67f38d6cc3ec107fe6;hb=eeeab4239843e716b3fd4dd259985a4cd4c487a5;hpb=abfb661f35e99e99c09a94d84839356d905af080 diff --git a/afs.c b/afs.c index dd0d1bcd..e73c668f 100644 --- a/afs.c +++ b/afs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2014 Andre Noll + * Copyright (C) 2007 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -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 */ @@ -195,7 +195,7 @@ static int dispatch_result(int result_shmid, callback_result_handler *handler, * copied. It then notifies the afs process that the callback function \a f * should be executed by sending the shared memory identifier (shmid) to the * socket. - + * * If the callback produces a result, it sends any number of shared memory * identifiers back via the socket. For each such identifier received, \a * result_handler is called. The contents of the sma identified by the received @@ -236,8 +236,8 @@ int send_callback_request(callback_function *f, struct osl_object *query, if (ret < 0) goto out; - *(uint32_t *) buf = afs_socket_cookie; - *(int *) (buf + sizeof(afs_socket_cookie)) = query_shmid; + *(uint32_t *)buf = afs_socket_cookie; + *(int *)(buf + sizeof(afs_socket_cookie)) = query_shmid; ret = connect_local_socket(conf.afs_socket_arg); if (ret < 0) @@ -292,10 +292,10 @@ out: * \param result_handler See \ref send_callback_request. * \param private_result_data See \ref send_callback_request. * - * Some commands have a couple of options that are parsed in child context for - * syntactic correctness and are stored in a special options structure for that - * command. This function allows to pass such a structure together with a list - * of further arguments (often a list of audio files) to the parent process. + * Some command handlers pass command-specific options to a callback, together + * with a list of further arguments (often a list of audio files). This + * function allows to pass an arbitrary structure (given as an osl object) and + * a usual argument vector to the specified callback. * * \return The return value of the underlying call to \ref * send_callback_request(). @@ -607,8 +607,9 @@ static void com_select_callback(int fd, const struct osl_object *query) activate_mood_or_playlist(NULL, &num_admissible); } } else - ret2 = para_printf(&pb, "activated %s (%d admissible files)\n", current_mop? - current_mop : "dummy mood", num_admissible); + ret2 = para_printf(&pb, "activated %s (%d admissible files)\n", + current_mop? current_mop : "dummy mood", + num_admissible); out: if (ret2 >= 0 && pb.offset) pass_buffer_as_shm(fd, SBD_OUTPUT, pb.buf, pb.offset); @@ -637,25 +638,19 @@ static int setup_command_socket_or_die(void) { int ret, socket_fd; char *socket_name = conf.afs_socket_arg; - struct sockaddr_un unix_addr; unlink(socket_name); - ret = create_local_socket(socket_name, &unix_addr, - S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH); + ret = create_local_socket(socket_name, 0); if (ret < 0) { - PARA_EMERG_LOG("%s: %s\n", para_strerror(-ret), socket_name); - exit(EXIT_FAILURE); + ret = create_local_socket(socket_name, + S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IWOTH); + if (ret < 0) { + PARA_EMERG_LOG("%s: %s\n", para_strerror(-ret), + socket_name); + exit(EXIT_FAILURE); + } } socket_fd = ret; - if (listen(socket_fd , 5) < 0) { - PARA_EMERG_LOG("can not listen on socket\n"); - exit(EXIT_FAILURE); - } - ret = mark_fd_nonblocking(socket_fd); - if (ret < 0) { - close(socket_fd); - return ret; - } PARA_INFO_LOG("listening on socket %s (fd %d)\n", socket_name, socket_fd); return socket_fd; @@ -719,12 +714,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; @@ -753,27 +742,24 @@ 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); } static struct list_head afs_client_list; -/** Describes on connected afs client. */ +/** Describes one connected afs client. */ struct afs_client { /** Position in the afs client list. */ struct list_head node;