X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=afs.c;h=013fdfe995bad6efd6b961ebf23c79f193044255;hp=10f9fa2155fdaee6e19873b814503f3b6169cf51;hb=e31d5dc4774caa3a90d8be566bfd94b9e5cf1482;hpb=fb87f827a783a42a9292cc434c61b0fc9e67af45 diff --git a/afs.c b/afs.c index 10f9fa21..013fdfe9 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. */ @@ -26,6 +26,7 @@ #include "signal.h" #include "fd.h" #include "mood.h" +#include "command.h" /** The osl tables used by afs. \sa blob.c. */ enum afs_table_num { @@ -192,7 +193,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 +206,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 +234,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 +262,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 +270,7 @@ out: if (fd >= 0) close(fd); // PARA_DEBUG_LOG("callback_ret: %d\n", ret); - return ret; + return ret < 0? ret : num_dispatched; } /** @@ -494,7 +496,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 */ @@ -544,8 +546,10 @@ static void com_select_callback(int fd, const struct osl_object *query) { struct para_buffer pb = { .max_size = shm_get_shmmax(), - .private_data = &fd, - .max_size_handler = pass_buffer_as_shm + .private_data = &(struct afs_max_size_handler_data) { + .fd = fd, + }, + .max_size_handler = afs_max_size_handler, }; char *arg = query->data; int num_admissible, ret, ret2; @@ -589,25 +593,29 @@ out: * * \sa \ref callback_result_handler, \ref sc_send_bin_buffer(). */ -int sc_send_result(struct osl_object *result, void *private) +int afs_cb_result_handler(struct osl_object *result, void *private) { - struct stream_cipher_context *scc = private; + struct command_context *cc = private; + int ret; if (!result->size) return 1; - return sc_send_bin_buffer(scc, result->data, result->size); + ret = sc_send_bin_buffer(&cc->scc, result->data, result->size); + if (ret < 0 || ret == result->size) + return ret; + return -E_SHORT_WRITE; } -int com_select(struct stream_cipher_context *scc, int argc, char * const * const argv) +int com_select(struct command_context *cc) { struct osl_object query; - if (argc != 2) + if (cc->argc != 2) return -E_AFS_SYNTAX; - query.data = argv[1]; - query.size = strlen(argv[1]) + 1; + query.data = cc->argv[1]; + query.size = strlen(cc->argv[1]) + 1; return send_callback_request(com_select_callback, &query, - &sc_send_result, scc); + &afs_cb_result_handler, cc); } static void init_admissible_files(char *arg) @@ -781,10 +789,6 @@ static void command_pre_select(struct sched *s, struct task *t) * \param size The size of \a buf. * \param fd_ptr A pointer to the file descriptor. * - * This function is used as the \a max_size handler in a \ref para_buffer - * structure. If used this way, it is called by \ref para_printf() whenever - * the buffer passed to para_printf() is about to exceed its maximal size. - * * This function creates a shared memory area large enough to hold * the content given by \a buf and \a size and sends the identifier * of this area to the file descriptor given by \a fd_ptr. @@ -813,7 +817,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: @@ -1021,7 +1025,7 @@ out: free(pb.buf); } -int com_init(struct stream_cipher_context *scc, int argc, char * const * const argv) +int com_init(struct command_context *cc) { int i, j, ret; uint32_t table_mask = (1 << (NUM_AFS_TABLES + 1)) - 1; @@ -1031,13 +1035,13 @@ int com_init(struct stream_cipher_context *scc, int argc, char * const * const a ret = make_database_dir(); if (ret < 0) return ret; - if (argc != 1) { + if (cc->argc != 1) { table_mask = 0; - for (i = 1; i < argc; i++) { + for (i = 1; i < cc->argc; i++) { for (j = 0; j < NUM_AFS_TABLES; j++) { struct afs_table *t = &afs_tables[j]; - if (strcmp(argv[i], t->name)) + if (strcmp(cc->argv[i], t->name)) continue; table_mask |= (1 << j); break; @@ -1047,10 +1051,10 @@ 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); + afs_cb_result_handler, cc); if (ret < 0) /* ignore return value */ - sc_send_va_buffer(scc, "%s\n", para_strerror(-ret)); + sc_send_va_buffer(&cc->scc, "%s\n", para_strerror(-ret)); return ret; } @@ -1068,13 +1072,13 @@ enum com_check_flags { CHECK_PLAYLISTS = 4 }; -int com_check(struct stream_cipher_context *scc, int argc, char * const * const argv) +int com_check(struct command_context *cc) { unsigned flags = 0; int i, ret; - for (i = 1; i < argc; i++) { - const char *arg = argv[i]; + for (i = 1; i < cc->argc; i++) { + const char *arg = cc->argv[i]; if (arg[0] != '-') break; if (!strcmp(arg, "--")) { @@ -1095,25 +1099,25 @@ int com_check(struct stream_cipher_context *scc, int argc, char * const * const } return -E_AFS_SYNTAX; } - if (i < argc) + if (i < cc->argc) return -E_AFS_SYNTAX; if (!flags) flags = ~0U; if (flags & CHECK_AFT) { ret = send_callback_request(aft_check_callback, NULL, - sc_send_result, scc); + afs_cb_result_handler, cc); if (ret < 0) return ret; } if (flags & CHECK_PLAYLISTS) { ret = send_callback_request(playlist_check_callback, - NULL, sc_send_result, scc); + NULL, afs_cb_result_handler, cc); if (ret < 0) return ret; } if (flags & CHECK_MOODS) { ret = send_callback_request(mood_check_callback, NULL, - sc_send_result, scc); + afs_cb_result_handler, cc); if (ret < 0) return ret; }