gui: Rename client_cmd_cmdline() to para_cmd().
[paraslash.git] / afs.c
diff --git a/afs.c b/afs.c
index 9ef44d7bba82f44b4a615ed5144d7239b0e7218c..5939cbe69cc46c1095d7cb82ffc98a741d3f6505 100644 (file)
--- a/afs.c
+++ b/afs.c
@@ -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 */
@@ -591,23 +593,27 @@ out:
  */
 int sc_send_result(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);
+               &sc_send_result, cc);
 }
 
 static void init_admissible_files(char *arg)
@@ -813,7 +819,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 +1027,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 +1037,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 +1053,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);
+               sc_send_result, 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 +1074,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 +1101,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);
+                       sc_send_result, cc);
                if (ret < 0)
                        return ret;
        }
        if (flags & CHECK_PLAYLISTS) {
                ret = send_callback_request(playlist_check_callback,
-                       NULL, sc_send_result, scc);
+                       NULL, sc_send_result, cc);
                if (ret < 0)
                        return ret;
        }
        if (flags & CHECK_MOODS) {
                ret = send_callback_request(mood_check_callback, NULL,
-                       sc_send_result, scc);
+                       sc_send_result, cc);
                if (ret < 0)
                        return ret;
        }