Fix some bugs in blob handling.
[paraslash.git] / blob.c
diff --git a/blob.c b/blob.c
index eca3c5630ef8a24061f818fb1bf2c2852e405ba3..b396ef792c1ecc6bec8d03b5b88885ea1f7f0bac 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -106,7 +106,7 @@ int com_lsblob_callback(struct osl_table *table,
        return ret;
 }
 
-static int com_lsblob(callback_function *f, int fd, int argc, const char **argv)
+static int com_lsblob(callback_function *f, int fd, int argc, char * const * const argv)
 {
        struct com_lsblob_options clbo = {.flags = 0};
        struct osl_object query = {.data = &clbo, .size = sizeof(clbo)},
@@ -138,9 +138,10 @@ static int com_lsblob(callback_function *f, int fd, int argc, const char **argv)
                return -E_BLOB_SYNTAX;
        ret = send_option_arg_callback_request(&query, argc - i,
                argv + i, f, &ls_output);
-       if (ret >= 0 && ls_output.data)
+       if (ret > 0) {
                send_buffer(fd, (char *)ls_output.data);
-       free(ls_output.data);
+               free(ls_output.data);
+       }
        return ret;
 }
 
@@ -162,8 +163,9 @@ static int com_catblob_callback(struct osl_table *table,
        memcpy(output->data, obj.data, obj.size);
        return osl_close_disk_object(&obj);
 }
+
 static int com_catblob(callback_function *f, int fd, int argc,
-               const char **argv)
+               char * const * const argv)
 {
        struct osl_object cat_output = {.data = NULL};
        int ret;
@@ -173,8 +175,8 @@ static int com_catblob(callback_function *f, int fd, int argc,
        if (!*argv[1]) /* empty name is reserved of the dummy row */
                return -E_BLOB_SYNTAX;
        ret = send_standard_callback_request(1, argv + 1, f, &cat_output);
-       if (ret >= 0 && cat_output.data)
-               ret = send_buffer(fd, (char *)cat_output.data);
+       if (ret > 0)
+               ret = send_bin_buffer(fd, (char *)cat_output.data, cat_output.size);
        free(cat_output.data);
        return ret;
 
@@ -231,8 +233,8 @@ static int com_addblob_callback(struct osl_table *table,
        return osl_add_row(table, objs);
 }
 
-static int com_addblob(callback_function *f, __a_unused int fd, int argc,
-               const char **argv)
+static int com_addblob(callback_function *f, int fd, int argc,
+               char * const * const argv)
 {
        struct osl_object arg_obj;
 
@@ -243,7 +245,7 @@ static int com_addblob(callback_function *f, __a_unused int fd, int argc,
        PARA_NOTICE_LOG("argv[1]: %s\n", argv[1]);
        arg_obj.size = strlen(argv[1]) + 1;
        arg_obj.data = (char *)argv[1];
-       return stdin_command(&arg_obj, f, 10 * 1024 * 1024, NULL);
+       return stdin_command(fd, &arg_obj, f, 10 * 1024 * 1024, NULL);
 }
 
 static int com_rmblob_callback(struct osl_table *table,
@@ -272,7 +274,7 @@ static int com_rmblob_callback(struct osl_table *table,
 }
 
 static int com_rmblob(callback_function *f, __a_unused int fd, int argc,
-               const char **argv)
+               char * const * const argv)
 {
        if (argc < 2)
                return -E_MOOD_SYNTAX;
@@ -298,7 +300,7 @@ static int com_mvblob_callback(struct osl_table *table,
 }
 
 static int com_mvblob(callback_function *f,  __a_unused int fd,
-               int argc, const char **argv)
+               int argc, char * const * const argv)
 {
        if (argc != 3)
                return -E_MOOD_SYNTAX;
@@ -312,7 +314,7 @@ static int com_mvblob(callback_function *f,  __a_unused int fd,
        { \
                return com_ ## cmd_name ## blob_callback(table_name ## _table, query, output); \
        } \
-       int com_ ## cmd_name ## cmd_prefix(__a_unused int fd, int argc, const char **argv) \
+       int com_ ## cmd_name ## cmd_prefix(int fd, int argc, char * const * const argv) \
        { \
                return com_ ## cmd_name ## blob(com_ ## cmd_name ## cmd_prefix ## _callback, fd, argc, argv); \
        }
@@ -352,11 +354,11 @@ static int blob_get_name_by_id(struct osl_table *table, uint32_t id,
        }
 
 static int blob_init(struct osl_table **table,
-               const struct osl_table_description *desc,
-               struct table_info *ti)
+               struct osl_table_description *desc,
+               struct table_info *ti, const char *db)
 {
        int ret;
-
+       desc->dir = db;
        ti->desc = desc;
        ret = osl_open_table(ti->desc, &ti->table);
        if (ret >= 0) {
@@ -369,10 +371,10 @@ static int blob_init(struct osl_table **table,
 
 /** Define the \p init function for this blob type. */
 #define DEFINE_BLOB_INIT(table_name) \
-       int table_name ## _init(struct table_info *ti) \
+       int table_name ## _init(struct table_info *ti, const char *db) \
        { \
                return blob_init(&table_name ## _table, \
-                       &table_name ## _table_desc, ti); \
+                       &table_name ## _table_desc, ti, db); \
        }