/*
- * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** Structure passed to the \p print_blob function. */
struct lsblob_action_data {
+ /* The flags given at the command line. */
uint32_t flags;
+ /** Message buffer. */
struct para_buffer pb;
};
}
ret = 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, "%s: %s\n", name, para_strerror(-ret));
return ret;
}
id = *(uint32_t *)obj.data;
if (lbad.flags & BLOB_LS_FLAG_REVERSE)
pmd.pm_flags |= PM_REVERSE_LOOP;
if (!(lbad.flags & BLOB_LS_FLAG_SORT_BY_ID))
- pmd.loop_col_num = BLOBCOL_ID;
- else
pmd.loop_col_num = BLOBCOL_NAME;
+ else
+ pmd.loop_col_num = BLOBCOL_ID;
ret = for_each_matching_row(&pmd);
if (ret < 0)
- para_printf(&lbad.pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&lbad.pb, "%s\n", para_strerror(-ret));
if (!lbad.pb.buf)
return 0;
result->data = lbad.pb.buf;
// return -E_BLOB_SYNTAX;
ret = send_option_arg_callback_request(&options, argc - i,
argv + i, f, &result);
- if (ret > 0) {
- send_buffer(fd, (char *)result.data);
- free(result.data);
+ if (!ret)
+ return 0;
+ if (ret < 0) {
+ send_va_buffer(fd, "%s\n", para_strerror(-ret));
+ return ret;
}
+ ret = send_buffer(fd, (char *)result.data);
+ free(result.data);
return ret;
}
return ret;
}
+/** Used for removing rows from a blob table. */
struct rmblob_data {
+ /** Message buffer. */
struct para_buffer pb;
+ /** Number of removed blobs. */
unsigned num_removed;
};
struct rmblob_data *rmbd = data;
int ret = osl_del_row(table, row);
if (ret < 0) {
- para_printf(&rmbd->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
+ para_printf(&rmbd->pb, "%s: %s\n", name, para_strerror(-ret));
return ret;
}
rmbd->num_removed++;
static int com_rmblob_callback(struct osl_table *table,
const struct osl_object *query,
- __a_unused struct osl_object *result)
+ struct osl_object *result)
{
int ret;
struct rmblob_data rmbd = {.num_removed = 0};
result->data = NULL;
ret = for_each_matching_row(&pmd);
if (ret < 0)
- para_printf(&rmbd.pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&rmbd.pb, "%s\n", para_strerror(-ret));
if (!rmbd.num_removed)
para_printf(&rmbd.pb, "no matches, nothing removed\n");
- else
+ else {
para_printf(&rmbd.pb, "removed %d blobs\n", rmbd.num_removed);
+ afs_event(BLOB_RENAME, NULL, table);
+ }
result->data = rmbd.pb.buf;
result->size = rmbd.pb.size;
return 1;
}
-static int com_rmblob(callback_function *f, __a_unused int fd, int argc,
+static int com_rmblob(callback_function *f, int fd, int argc,
char * const * const argv)
{
int ret;
objs[BLOBCOL_NAME].size = name_len;
objs[BLOBCOL_DEF].data = name + name_len;
objs[BLOBCOL_DEF].size = query->size - name_len;
- return osl_add_row(table, objs);
+ ret = osl_add_row(table, objs);
+ if (ret < 0)
+ return ret;
+ afs_event(BLOB_ADD, NULL, table);
+ return 1;
}
static int com_addblob(callback_function *f, int fd, int argc,
return ret;
obj.data = dest;
obj.size = strlen(dest) + 1;
- return osl_update_object(table, row, BLOBCOL_NAME, &obj);
+ ret = osl_update_object(table, row, BLOBCOL_NAME, &obj);
+ if (ret < 0)
+ return ret;
+ afs_event(BLOB_RENAME, NULL, table);
+ return 1;
}
-static int com_mvblob(callback_function *f, __a_unused int fd,
+static int com_mvblob(callback_function *f, __a_unused int fd,
int argc, char * const * const argv)
{
if (argc != 3)
return blob_get_name_by_id(table_name ## _table, id, name); \
}
+
+static int blob_get_def_by_name(struct osl_table *table, char *name,
+ struct osl_object *def)
+{
+ struct osl_row *row;
+ struct osl_object obj = {.data = name, .size = strlen(name) + 1};
+ int ret;
+
+ def->data = NULL;
+ if (!*name)
+ return 1;
+ ret = osl_get_row(table, BLOBCOL_NAME, &obj, &row);
+ if (ret < 0)
+ return ret;
+ return osl_open_disk_object(table, row, BLOBCOL_DEF, def);
+}
+
+/** Define the \p get_def_by_id function for this blob type. */
+#define DEFINE_GET_DEF_BY_NAME(table_name, cmd_prefix) \
+ int cmd_prefix ## _get_def_by_name(char *name, struct osl_object *def) \
+ { \
+ return blob_get_def_by_name(table_name ## _table, name, def); \
+ }
+
static int blob_get_def_by_id(struct osl_table *table, uint32_t id,
struct osl_object *def)
{
t->open = table_name ## _open; \
t->close = table_name ## _close; \
t->create = table_name ## _create;\
+ t->event_handler = table_name ##_event_handler; \
+ table_name ## _table = NULL; \
}
DEFINE_BLOB_COMMAND(mv, table_name, cmd_prefix) \
DEFINE_GET_NAME_BY_ID(table_name, cmd_prefix); \
DEFINE_GET_DEF_BY_ID(table_name, cmd_prefix); \
+ DEFINE_GET_DEF_BY_NAME(table_name, cmd_prefix); \
DEFINE_GET_NAME_AND_DEF_BY_ROW(table_name, cmd_prefix); \
/** \cond doxygen isn't smart enough to recognize these */