Add sideband implementation.
[paraslash.git] / aft.c
diff --git a/aft.c b/aft.c
index f89235a484287ce2b5f5aa9081c38fd7a7a5d712..fb40a7be164232cf884a0a409272e5f34dedc3b9 100644 (file)
--- a/aft.c
+++ b/aft.c
@@ -21,6 +21,7 @@
 #include "fd.h"
 #include "ipc.h"
 #include "portable_io.h"
+#include "sideband.h"
 #include "command.h"
 
 static struct osl_table *audio_file_table;
@@ -1349,9 +1350,14 @@ static void com_ls_callback(int fd, const struct osl_object *query)
 {
        struct ls_options *opts = query->data;
        char *p, *pattern_start = (char *)query->data + sizeof(*opts);
-       struct para_buffer b = {.max_size = shm_get_shmmax(),
+       struct para_buffer b = {
+               .max_size = shm_get_shmmax(),
                .flags = (opts->mode == LS_MODE_PARSER)? PBF_SIZE_PREFIX : 0,
-               .max_size_handler = pass_buffer_as_shm, .private_data = &fd};
+               .max_size_handler = afs_max_size_handler,
+               .private_data = &(struct afs_max_size_handler_data) {
+                       .fd = fd,
+               }
+       };
        int i = 0, ret;
        time_t current_time;
 
@@ -1515,7 +1521,7 @@ int com_ls(struct command_context *cc)
        opts.mode = mode;
        opts.num_patterns = cc->argc - i;
        ret = send_option_arg_callback_request(&query, opts.num_patterns,
-               cc->argv + i, com_ls_callback, sc_send_result, cc);
+               cc->argv + i, com_ls_callback, afs_cb_result_handler, cc);
        return ret;
 }
 
@@ -1674,8 +1680,13 @@ static void com_add_callback(int fd, const struct osl_object *query)
        char afsi_buf[AFSI_SIZE];
        uint32_t flags = read_u32(buf + CAB_FLAGS_OFFSET);
        struct afs_info default_afsi = {.last_played = 0};
-       struct para_buffer msg = {.max_size = shm_get_shmmax(),
-               .max_size_handler = pass_buffer_as_shm, .private_data = &fd};
+       struct para_buffer msg = {
+               .max_size = shm_get_shmmax(),
+               .max_size_handler = afs_max_size_handler,
+               .private_data = &(struct afs_max_size_handler_data) {
+                       .fd = fd,
+               }
+       };
        uint16_t afhi_offset, chunks_offset;
 
        hash = (unsigned char *)buf + CAB_HASH_OFFSET;
@@ -1903,7 +1914,8 @@ static int add_one_audio_file(const char *path, void *private_data)
        }
        save_add_callback_buffer(hash, path, afhi_ptr, pad->flags, format_num, &obj);
        /* Ask afs to consider this entry for adding. */
-       ret = send_callback_request(com_add_callback, &obj, sc_send_result, pad->cc);
+       ret = send_callback_request(com_add_callback, &obj,
+               afs_cb_result_handler, pad->cc);
        goto out_free;
 
 out_unmap:
@@ -1914,15 +1926,7 @@ out_free:
                send_ret = sc_send_va_buffer(&pad->cc->scc,
                        "failed to add %s (%s)\n", path, para_strerror(-ret));
        free(obj.data);
-       if (afhi_ptr) {
-               free(afhi_ptr->chunk_table);
-               free(afhi_ptr->techinfo);
-               free(afhi_ptr->tags.artist);
-               free(afhi_ptr->tags.title);
-               free(afhi_ptr->tags.year);
-               free(afhi_ptr->tags.album);
-               free(afhi_ptr->tags.comment);
-       }
+       clear_afhi(afhi_ptr);
        /* Stop adding files only on send errors. */
        return send_ret;
 }
@@ -2090,7 +2094,7 @@ static void com_touch_callback(int fd, const struct osl_object *query)
                .pb = {
                        .max_size = shm_get_shmmax(),
                        .private_data = &fd,
-                       .max_size_handler = pass_buffer_as_shm
+                       .max_size_handler = afs_max_size_handler
                }
        };
        int ret, ret2 = 0;
@@ -2183,7 +2187,7 @@ int com_touch(struct command_context *cc)
        if (i >= cc->argc)
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, cc->argc - i,
-               cc->argv + i, com_touch_callback, sc_send_result, cc);
+               cc->argv + i, com_touch_callback, afs_cb_result_handler, cc);
        if (ret < 0)
                sc_send_va_buffer(&cc->scc, "%s\n", para_strerror(-ret));
        return ret;
@@ -2231,7 +2235,7 @@ static void com_rm_callback(int fd, const struct osl_object *query)
                .pb = {
                        .max_size = shm_get_shmmax(),
                        .private_data = &fd,
-                       .max_size_handler = pass_buffer_as_shm
+                       .max_size_handler = afs_max_size_handler
                }
        };
        int ret;
@@ -2294,7 +2298,7 @@ int com_rm(struct command_context *cc)
        if (i >= cc->argc)
                return -E_AFT_SYNTAX;
        ret = send_option_arg_callback_request(&query, cc->argc - i,
-               cc->argv + i, com_rm_callback, sc_send_result, cc);
+               cc->argv + i, com_rm_callback, afs_cb_result_handler, cc);
        if (ret < 0)
                sc_send_va_buffer(&cc->scc, "%s\n", para_strerror(-ret));
        return ret;
@@ -2373,7 +2377,7 @@ static void com_cpsi_callback(int fd, const struct osl_object *query)
                .pb = {
                        .max_size = shm_get_shmmax(),
                        .private_data = &fd,
-                       .max_size_handler = pass_buffer_as_shm
+                       .max_size_handler = afs_max_size_handler
                }
        };
        int ret;
@@ -2453,7 +2457,7 @@ int com_cpsi(struct command_context *cc)
        if (!(flags & ~CPSI_FLAG_VERBOSE)) /* no copy flags given */
                flags = ~(unsigned)CPSI_FLAG_VERBOSE | flags;
        ret = send_option_arg_callback_request(&options, cc->argc - i,
-               cc->argv + i, com_cpsi_callback, sc_send_result, cc);
+               cc->argv + i, com_cpsi_callback, afs_cb_result_handler, cc);
        if (ret < 0)
                sc_send_va_buffer(&cc->scc, "%s\n", para_strerror(-ret));
        return ret;
@@ -2489,7 +2493,8 @@ int send_afs_status(struct command_context *cc, int parser_friendly)
        struct osl_object query = {.data = &parser_friendly,
                .size = sizeof(parser_friendly)};
 
-       return send_callback_request(afs_stat_callback, &query, sc_send_result, cc);
+       return send_callback_request(afs_stat_callback, &query,
+               afs_cb_result_handler, cc);
 }
 
 /* TODO: optionally fix problems by removing offending rows */
@@ -2546,8 +2551,10 @@ void aft_check_callback(int fd, __a_unused 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
        };
        int ret = para_printf(&pb, "checking audio file table...\n");