com_rmblob(): Return negative on errors, cleanup
authorAndre Noll <maan@tuebingen.mpg.de>
Sun, 5 Apr 2015 14:50:32 +0000 (14:50 +0000)
committerAndre Noll <maan@tuebingen.mpg.de>
Wed, 12 Aug 2015 21:23:48 +0000 (23:23 +0200)
blob.c

diff --git a/blob.c b/blob.c
index 5e9fe75..ea74607 100644 (file)
--- a/blob.c
+++ b/blob.c
@@ -249,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;
@@ -271,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,
@@ -287,20 +279,21 @@ 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);
+               para_printf(&pb, "removed %d blob(s)\n", pmd.num_matches);
                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)