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;
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,
.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)
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. */
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 0;
+ 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) \