X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=9cc075f60195a889c68909705e1166c226eb2bb1;hp=a1381e738a40cf644abeb16cf8356e7c578839a6;hb=74c88020bd325865fe26ed25ea8ad0ace0924136;hpb=1745a87654ce08b57c46ce0870d8571eacbe27c9 diff --git a/afs.c b/afs.c index a1381e73..9cc075f6 100644 --- a/afs.c +++ b/afs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2012 Andre Noll + * Copyright (C) 2007-2013 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -87,7 +87,7 @@ static struct command_task command_task_struct; static struct signal_task signal_task_struct; static enum play_mode current_play_mode; -static char *current_mop; /* mode or playlist specifier. NULL means dummy mooe */ +static char *current_mop; /* mode or playlist specifier. NULL means dummy mood */ /** * A random number used to "authenticate" the connection. @@ -113,7 +113,7 @@ extern uint32_t afs_socket_cookie; * area is written to the command socket. * * The afs process accepts connections on the command socket and reads the - * shared memory id, attaches the corresponing area, calls the given handler to + * shared memory id, attaches the corresponding area, calls the given handler to * perform the desired action and to optionally compute a result. * * The result and a \p callback_result structure is then written to another @@ -133,7 +133,7 @@ struct callback_query { /** * Structure embedded in the result of a callback. * - * If the callback produced a result, an instance of that structure is embeeded + * If the callback produced a result, an instance of that structure is embedded * into the shared memory area holding the result, mainly to let the command * handler know the size of the result. * @@ -604,6 +604,7 @@ int afs_cb_result_handler(struct osl_object *result, uint8_t band, { struct command_context *cc = private; + assert(cc); if (!result->size) return 1; if (cc->use_sideband) @@ -722,9 +723,9 @@ static void signal_pre_select(struct sched *s, struct task *t) para_fd_set(st->fd, &s->rfds, &s->max_fileno); } -static void afs_signal_post_select(struct sched *s, struct task *t) +static int afs_signal_post_select(struct sched *s, __a_unused struct task *t) { - int signum; + int signum, ret; if (getppid() == 1) { PARA_EMERG_LOG("para_server died\n"); @@ -732,20 +733,20 @@ static void afs_signal_post_select(struct sched *s, struct task *t) } signum = para_next_signal(&s->rfds); if (signum == 0) - return; + return 0; if (signum == SIGHUP) { close_afs_tables(); parse_config_or_die(1); - t->error = open_afs_tables(); - if (t->error < 0) - return; + ret = open_afs_tables(); + if (ret < 0) + return ret; init_admissible_files(current_mop); - return; + return 0; } PARA_EMERG_LOG("terminating on signal %d\n", signum); shutdown: - sched_shutdown(s); - t->error = -E_AFS_SIGNAL; + task_notify_all(s, E_AFS_SIGNAL); + return -E_AFS_SIGNAL; } static void register_signal_task(struct sched *s) @@ -760,7 +761,7 @@ static void register_signal_task(struct sched *s) para_install_sighandler(SIGHUP); st->task.pre_select = signal_pre_select; - st->task.post_select = afs_signal_post_select; + st->task.new_post_select = afs_signal_post_select; sprintf(st->task.status, "signal task"); register_task(s, &st->task); } @@ -914,18 +915,21 @@ err: /** Shutdown connection if query has not arrived until this many seconds. */ #define AFS_CLIENT_TIMEOUT 3 -static void command_post_select(struct sched *s, struct task *t) +static int command_post_select(struct sched *s, struct task *t) { struct command_task *ct = container_of(t, struct command_task, task); struct sockaddr_un unix_addr; struct afs_client *client, *tmp; int fd, ret; + ret = task_get_notification(t); + if (ret < 0) + return ret; ret = execute_server_command(&s->rfds); if (ret < 0) { PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - sched_shutdown(s); - return; + task_notify_all(s, -ret); + return ret; } /* Check the list of connected clients. */ list_for_each_entry_safe(client, tmp, &afs_client_list, node) { @@ -946,17 +950,18 @@ static void command_post_select(struct sched *s, struct task *t) if (ret < 0) PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); if (ret <= 0) - return; + return 0; ret = mark_fd_nonblocking(fd); if (ret < 0) { PARA_NOTICE_LOG("%s\n", para_strerror(-ret)); close(fd); - return; + return 0; } client = para_malloc(sizeof(*client)); client->fd = fd; client->connect_time = *now; para_list_add(&client->node, &afs_client_list); + return 0; } static void register_command_task(uint32_t cookie, struct sched *s) @@ -966,7 +971,7 @@ static void register_command_task(uint32_t cookie, struct sched *s) ct->cookie = cookie; ct->task.pre_select = command_pre_select; - ct->task.post_select = command_post_select; + ct->task.new_post_select = command_post_select; sprintf(ct->task.status, "afs command task"); register_task(s, &ct->task); } @@ -1063,7 +1068,7 @@ int com_init(struct command_context *cc) } ret = send_callback_request(create_tables_callback, &query, afs_cb_result_handler, cc); - if (ret < 0) + if (ret < 0 && !cc->use_sideband) /* ignore return value */ sc_send_va_buffer(&cc->scc, "%s\n", para_strerror(-ret)); return ret;