X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=blob.c;h=fbfea00ce90a2ac4bf49c5b8e7002248d5c329e0;hb=6b9707e20a57b750853358f39e231ce262270b34;hp=47253b5e08811c7fbb4a2c2aa12e6f368307454c;hpb=79bfc7a2a6577000c405be6344ba91ec3f8745e9;p=paraslash.git diff --git a/blob.c b/blob.c index 47253b5e..fbfea00c 100644 --- a/blob.c +++ b/blob.c @@ -122,7 +122,7 @@ static int print_blob(struct osl_table *table, struct osl_row *row, } ret = osl(osl_get_object(table, row, BLOBCOL_ID, &obj)); if (ret < 0) { - para_printf(&lbad->pb, "%s: %s\n", name, para_strerror(-ret)); + para_printf(&lbad->pb, "cannot list %s\n", name); return ret; } id = *(uint32_t *)obj.data; @@ -130,7 +130,7 @@ static int print_blob(struct osl_table *table, struct osl_row *row, return 1; } -static void com_lsblob_callback(struct osl_table *table, +static int com_lsblob_callback(struct osl_table *table, int fd, const struct osl_object *query) { struct lsblob_action_data lbad = { @@ -163,10 +163,12 @@ static void com_lsblob_callback(struct osl_table *table, pmd.loop_col_num = BLOBCOL_ID; ret = for_each_matching_row(&pmd); if (ret < 0) - para_printf(&lbad.pb, "%s\n", para_strerror(-ret)); - else if (pmd.num_matches == 0 && pmd.patterns.size > 0) - para_printf(&lbad.pb, "no matches\n"); + goto out; + if (pmd.num_matches == 0 && pmd.patterns.size > 0) + ret = -E_NO_MATCH; +out: flush_and_free_pb(&lbad.pb); + return ret; } static int com_lsblob(callback_function *f, struct command_context *cc) @@ -218,9 +220,10 @@ static int cat_blob(struct osl_table *table, struct osl_row *row, return (ret < 0)? ret : ret2; } -static void com_catblob_callback(struct osl_table *table, int fd, +static int com_catblob_callback(struct osl_table *table, int fd, const struct osl_object *query) { + int ret; struct pattern_match_data pmd = { .table = table, .patterns = *query, @@ -230,11 +233,12 @@ static void com_catblob_callback(struct osl_table *table, int fd, .data = &fd, .action = cat_blob }; - for_each_matching_row(&pmd); - if (pmd.num_matches == 0) { - char err_msg[] = "no matches\n"; - pass_buffer_as_shm(fd, SBD_OUTPUT, err_msg, sizeof(err_msg)); - } + ret = for_each_matching_row(&pmd); + if (ret < 0) + return ret; + if (pmd.num_matches == 0) + ret = -E_NO_MATCH; + return ret; } static int com_catblob(callback_function *f, struct command_context *cc) @@ -245,37 +249,29 @@ static int com_catblob(callback_function *f, struct command_context *cc) afs_cb_result_handler, cc); } -/** Used for removing rows from a blob table. */ -struct rmblob_data { - /** Message buffer. */ - struct para_buffer pb; -}; - static int remove_blob(struct osl_table *table, struct osl_row *row, const char *name, void *data) { - struct rmblob_data *rmbd = data; + struct para_buffer *pb = data; int ret = osl(osl_del_row(table, row)); if (ret < 0) { - para_printf(&rmbd->pb, "%s: %s\n", name, para_strerror(-ret)); + para_printf(pb, "cannot remove %s\n", name); return ret; } return 1; } -static void com_rmblob_callback(struct osl_table *table, int fd, +static int com_rmblob_callback(struct osl_table *table, int fd, const struct osl_object *query) { int ret; - struct rmblob_data rmbd = { - .pb = { - .max_size = shm_get_shmmax(), - .private_data = &(struct afs_max_size_handler_data) { - .fd = fd, - .band = SBD_OUTPUT - }, - .max_size_handler = afs_max_size_handler, - } + struct para_buffer pb = { + .max_size = shm_get_shmmax(), + .private_data = &(struct afs_max_size_handler_data) { + .fd = fd, + .band = SBD_OUTPUT + }, + .max_size_handler = afs_max_size_handler, }; struct pattern_match_data pmd = { .table = table, @@ -283,19 +279,21 @@ static void com_rmblob_callback(struct osl_table *table, int fd, .loop_col_num = BLOBCOL_NAME, .match_col_num = BLOBCOL_NAME, .pm_flags = PM_SKIP_EMPTY_NAME, - .data = &rmbd, + .data = &pb, .action = remove_blob }; ret = for_each_matching_row(&pmd); if (ret < 0) - para_printf(&rmbd.pb, "%s\n", para_strerror(-ret)); + goto out; if (pmd.num_matches == 0) - para_printf(&rmbd.pb, "no matches, nothing removed\n"); + ret = -E_NO_MATCH; else { - para_printf(&rmbd.pb, "removed %d blobs\n", pmd.num_matches); + para_printf(&pb, "removed %d blob(s)\n", pmd.num_matches); afs_event(BLOB_RENAME, NULL, table); } - flush_and_free_pb(&rmbd.pb); +out: + flush_and_free_pb(&pb); + return ret; } static int com_rmblob(callback_function *f, struct command_context *cc) @@ -306,7 +304,7 @@ static int com_rmblob(callback_function *f, struct command_context *cc) afs_cb_result_handler, cc); } -static void com_addblob_callback(struct osl_table *table, int fd, +static int com_addblob_callback(struct osl_table *table, int fd, const struct osl_object *query) { struct osl_object objs[NUM_BLOB_COLUMNS]; @@ -376,12 +374,12 @@ static void com_addblob_callback(struct osl_table *table, int fd, afs_event(BLOB_ADD, NULL, table); out: if (ret < 0) - msg_len = xasprintf(&msg, "could not add %s: %s\n", name, - para_strerror(-ret)); + msg_len = xasprintf(&msg, "cannot add %s\n", name); else msg_len = xasprintf(&msg, "added %s as id %u\n", name, id); pass_buffer_as_shm(fd, SBD_OUTPUT, msg, msg_len); free(msg); + return ret; } /* Write input from fd to dynamically allocated buffer, but maximal 10M. */ @@ -466,7 +464,7 @@ static int com_addblob(callback_function *f, struct command_context *cc) return stdin_command(cc, &arg_obj, f); } -static void com_mvblob_callback(struct osl_table *table, int fd, +static int com_mvblob_callback(struct osl_table *table, int fd, const struct osl_object *query) { char *src = (char *) query->data; @@ -481,38 +479,32 @@ static void com_mvblob_callback(struct osl_table *table, int fd, int ret = osl(osl_get_row(table, BLOBCOL_NAME, &obj, &row)); if (ret < 0) { - para_printf(&pb, "could not locate %s: %s\n", src, - para_strerror(-ret)); + para_printf(&pb, "cannot find source blob %s\n", src); goto out; } obj.data = dest; obj.size = strlen(dest) + 1; ret = osl(osl_update_object(table, row, BLOBCOL_NAME, &obj)); if (ret < 0) { - para_printf(&pb, "failed to update object %s: %s\n", dest, - para_strerror(-ret)); + para_printf(&pb, "cannot rename blob %s to %s\n", src, dest); goto out; } afs_event(BLOB_RENAME, NULL, table); out: flush_and_free_pb(&pb); + return ret; } static int com_mvblob(callback_function *f, struct command_context *cc) { - int ret; - if (cc->argc != 3) return -E_MOOD_SYNTAX; - ret = send_option_arg_callback_request(NULL, cc->argc - 1, + return send_option_arg_callback_request(NULL, cc->argc - 1, cc->argv + 1, f, afs_cb_result_handler, cc); - if (ret < 0) - send_strerror(cc, -ret); - return ret; } #define DEFINE_BLOB_COMMAND(cmd_name, table_name, cmd_prefix) \ - static void com_ ## cmd_name ## cmd_prefix ## _callback(int fd, const struct osl_object *query) \ + static int com_ ## cmd_name ## cmd_prefix ## _callback(int fd, const struct osl_object *query) \ { \ return com_ ## cmd_name ## blob_callback(table_name ## _table, fd, query); \ } \