X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=blob.c;h=33a6f63ba29a9bf8b0056d64e567972fab4b853a;hb=e469622d99718d49158d5da649eb02180269b4c8;hp=5eb125c8262f6b34aaff506f9c6cb1310fa5916d;hpb=050003ccbd8b314038352f55d9fae53245670e78;p=paraslash.git diff --git a/blob.c b/blob.c index 5eb125c8..33a6f63b 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; @@ -163,14 +163,15 @@ static int 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 0; + return ret; } -static int com_lsblob(callback_function *f, struct command_context *cc) +static int com_lsblob(afs_callback *f, struct command_context *cc) { uint32_t flags = 0; struct osl_object options = {.data = &flags, .size = sizeof(flags)}; @@ -222,6 +223,7 @@ static int cat_blob(struct osl_table *table, struct osl_row *row, 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, @@ -231,15 +233,15 @@ static int 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)); - } - return 0; + 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) +static int com_catblob(afs_callback *f, struct command_context *cc) { if (cc->argc < 2) return -E_BLOB_SYNTAX; @@ -247,19 +249,13 @@ 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; @@ -269,15 +265,13 @@ 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, @@ -285,23 +279,24 @@ static int 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); - afs_event(BLOB_RENAME, NULL, table); + para_printf(&pb, "removed %d blob(s)\n", pmd.num_matches); + ret = afs_event(BLOB_RENAME, NULL, table); } - flush_and_free_pb(&rmbd.pb); - return 0; +out: + flush_and_free_pb(&pb); + return ret; } -static int com_rmblob(callback_function *f, struct command_context *cc) +static int com_rmblob(afs_callback *f, struct command_context *cc) { if (cc->argc < 2) return -E_MOOD_SYNTAX; @@ -376,16 +371,15 @@ static int com_addblob_callback(struct osl_table *table, int fd, ret = osl(osl_add_row(table, objs)); if (ret < 0) goto out; - afs_event(BLOB_ADD, NULL, table); + ret = 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 0; + return ret; } /* Write input from fd to dynamically allocated buffer, but maximal 10M. */ @@ -434,7 +428,7 @@ again: * afs process via the callback method. */ static int stdin_command(struct command_context *cc, struct osl_object *arg_obj, - callback_function *f) + afs_callback *f) { struct osl_object query, stdin_obj; int ret; @@ -457,7 +451,7 @@ static int stdin_command(struct command_context *cc, struct osl_object *arg_obj, return ret; } -static int com_addblob(callback_function *f, struct command_context *cc) +static int com_addblob(afs_callback *f, struct command_context *cc) { struct osl_object arg_obj; @@ -485,35 +479,28 @@ static int 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); + ret = afs_event(BLOB_RENAME, NULL, table); out: flush_and_free_pb(&pb); - return 0; + return ret; } -static int com_mvblob(callback_function *f, struct command_context *cc) +static int com_mvblob(afs_callback *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) \