X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=46ed6913626482c07eae50c99b943aaa39e275db;hp=955b8f207d5305418674f6a0f2e30f904d110517;hb=748d1368bc96dd7e1af879df1ea41b4d52842f7e;hpb=c5670af5c1f784fe6c3d46d0281f2ba7c47af75e diff --git a/afs.c b/afs.c index 955b8f20..46ed6913 100644 --- a/afs.c +++ b/afs.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2011 Andre Noll + * Copyright (C) 2007-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -192,7 +192,7 @@ static int dispatch_result(int result_shmid, callback_result_handler *handler, * shmid are passed to that function as an osl object. The private_result_data * pointer is passed as the second argument to \a result_handler. * - * \return Standard. + * \return Number of shared memory areas dispatched on success, negative on errors. * * \sa send_option_arg_callback_request(), send_standard_callback_request(). */ @@ -205,7 +205,7 @@ int send_callback_request(callback_function *f, struct osl_object *query, void *query_shm; char buf[sizeof(afs_socket_cookie) + sizeof(int)]; size_t query_shm_size = sizeof(*cq); - int dispatch_error = 0; + int dispatch_error = 0, num_dispatched = 0; if (query) query_shm_size += query->size; @@ -233,7 +233,7 @@ int send_callback_request(callback_function *f, struct osl_object *query, if (ret < 0) goto out; fd = ret; - ret = send_bin_buffer(fd, buf, sizeof(buf)); + ret = write_all(fd, buf, sizeof(buf)); if (ret < 0) goto out; /* @@ -261,6 +261,7 @@ int send_callback_request(callback_function *f, struct osl_object *query, if (ret < 0) PARA_CRIT_LOG("destroy result failed: %s\n", para_strerror(-ret)); + num_dispatched++; } out: if (shm_destroy(query_shmid) < 0) @@ -268,7 +269,7 @@ out: if (fd >= 0) close(fd); // PARA_DEBUG_LOG("callback_ret: %d\n", ret); - return ret; + return ret < 0? ret : num_dispatched; } /** @@ -286,6 +287,9 @@ out: * 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. * + * \return The return value of the underlying call to \ref + * send_callback_request(). + * * \sa send_standard_callback_request(), send_callback_request(). */ int send_option_arg_callback_request(struct osl_object *options, @@ -360,7 +364,10 @@ static int action_if_pattern_matches(struct osl_row *row, void *data) continue; if (ret) return -E_FNMATCH; - return pmd->action(pmd->table, row, name, pmd->data); + ret = pmd->action(pmd->table, row, name, pmd->data); + if (ret >= 0) + pmd->num_matches++; + return ret; } return 1; } @@ -488,7 +495,7 @@ destroy: no_admissible_files: *(uint32_t *)buf = NO_ADMISSIBLE_FILES; *(uint32_t *)(buf + 4) = (uint32_t)0; - return send_bin_buffer(server_socket, buf, 8); + return write_all(server_socket, buf, 8); } /* Never fails if arg == NULL */ @@ -724,11 +731,11 @@ static void afs_signal_post_select(struct sched *s, struct task *t) } PARA_EMERG_LOG("terminating on signal %d\n", signum); shutdown: - sched_shutdown(); + sched_shutdown(s); t->error = -E_AFS_SIGNAL; } -static void register_signal_task(void) +static void register_signal_task(struct sched *s) { struct signal_task *st = &signal_task_struct; @@ -742,7 +749,7 @@ static void register_signal_task(void) st->task.pre_select = signal_pre_select; st->task.post_select = afs_signal_post_select; sprintf(st->task.status, "signal task"); - register_task(&st->task); + register_task(s, &st->task); } static struct list_head afs_client_list; @@ -807,7 +814,7 @@ int pass_buffer_as_shm(char *buf, size_t size, void *fd_ptr) ret = shm_detach(shm); if (ret < 0) goto err; - ret = send_bin_buffer(fd, (char *)&shmid, sizeof(int)); + ret = write_all(fd, (char *)&shmid, sizeof(int)); if (ret >= 0) return ret; err: @@ -903,7 +910,7 @@ static void command_post_select(struct sched *s, struct task *t) ret = execute_server_command(&s->rfds); if (ret < 0) { PARA_EMERG_LOG("%s\n", para_strerror(-ret)); - sched_shutdown(); + sched_shutdown(s); return; } /* Check the list of connected clients. */ @@ -938,7 +945,7 @@ static void command_post_select(struct sched *s, struct task *t) para_list_add(&client->node, &afs_client_list); } -static void register_command_task(uint32_t cookie) +static void register_command_task(uint32_t cookie, struct sched *s) { struct command_task *ct = &command_task_struct; ct->fd = setup_command_socket_or_die(); @@ -947,7 +954,7 @@ static void register_command_task(uint32_t cookie) ct->task.pre_select = command_pre_select; ct->task.post_select = command_post_select; sprintf(ct->task.status, "afs command task"); - register_task(&ct->task); + register_task(s, &ct->task); } /** @@ -961,7 +968,7 @@ __noreturn void afs_init(uint32_t cookie, int socket_fd) static struct sched s; int i, ret; - register_signal_task(); + register_signal_task(&s); INIT_LIST_HEAD(&afs_client_list); for (i = 0; i < NUM_AFS_TABLES; i++) afs_tables[i].init(&afs_tables[i]); @@ -975,7 +982,7 @@ __noreturn void afs_init(uint32_t cookie, int socket_fd) PARA_INFO_LOG("server_socket: %d, afs_socket_cookie: %u\n", server_socket, (unsigned) cookie); init_admissible_files(conf.afs_initial_mode_arg); - register_command_task(cookie); + register_command_task(cookie, &s); s.default_timeout.tv_sec = 0; s.default_timeout.tv_usec = 999 * 1000; ret = schedule(&s); @@ -1043,7 +1050,8 @@ int com_init(struct stream_cipher_context *scc, int argc, char * const * const a ret = send_callback_request(create_tables_callback, &query, sc_send_result, scc); if (ret < 0) - return sc_send_va_buffer(scc, "%s\n", para_strerror(-ret)); + /* ignore return value */ + sc_send_va_buffer(scc, "%s\n", para_strerror(-ret)); return ret; } @@ -1146,7 +1154,8 @@ void afs_event(enum afs_events event, struct para_buffer *pb, * \param pb Unused. * \param data Unused. * - * This table does not honor events. + * \return The images table does not honor events, so this handler always + * returns success. */ __a_const int images_event_handler(__a_unused enum afs_events event, __a_unused struct para_buffer *pb, __a_unused void *data) @@ -1161,7 +1170,8 @@ __a_const int images_event_handler(__a_unused enum afs_events event, * \param pb Unused. * \param data Unused. * - * This table does not honor events. + * \return The lyrics table does not honor events, so this handler always + * returns success. */ __a_const int lyrics_event_handler(__a_unused enum afs_events event, __a_unused struct para_buffer *pb, __a_unused void *data)