};
/** Structure passed to the \p print_blob function. */
-struct lsblob_data {
+struct lsblob_action_data {
uint32_t flags;
struct para_buffer pb;
};
-static int print_blob(struct osl_table *table, struct osl_row *row, const char *name, void *data)
+static int print_blob(struct osl_table *table, struct osl_row *row,
+ const char *name, void *data)
{
+ struct lsblob_action_data *lbad = data;
struct osl_object obj;
uint32_t id;
int ret;
- struct lsblob_data *lbd = data;
- if (!(lbd->flags & BLOB_LS_FLAG_LONG)) {
- para_printf(&lbd->pb, "%s\n", name);
+ if (!(lbad->flags & BLOB_LS_FLAG_LONG)) {
+ para_printf(&lbad->pb, "%s\n", name);
return 1;
}
ret = osl_get_object(table, row, BLOBCOL_ID, &obj);
- if (ret < 0)
+ if (ret < 0) {
+ para_printf(&lbad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
return ret;
+ }
id = *(uint32_t *)obj.data;
- para_printf(&lbd->pb, "%u\t%s\n", id, name);
+ para_printf(&lbad->pb, "%u\t%s\n", id, name);
return 1;
}
-int com_lsblob_callback(struct osl_table *table,
- const struct osl_object *query, struct osl_object *ls_output)
+static int com_lsblob_callback(struct osl_table *table,
+ const struct osl_object *query, struct osl_object *result)
{
- struct lsblob_data lbd = {.flags = *(uint32_t *)query};
+ struct lsblob_action_data lbad = {.flags = *(uint32_t *)query->data};
struct pattern_match_data pmd = {
.table = table,
.patterns = {.data = (char *)query->data + sizeof(uint32_t),
.size = query->size - sizeof(uint32_t)},
.pm_flags = PM_NO_PATTERN_MATCHES_EVERYTHING | PM_SKIP_EMPTY_NAME,
.match_col_num = BLOBCOL_NAME,
- .data = &lbd,
+ .data = &lbad,
.action = print_blob,
};
int ret;
- if (lbd.flags & BLOB_LS_FLAG_REVERSE)
+ if (lbad.flags & BLOB_LS_FLAG_REVERSE)
pmd.pm_flags |= PM_REVERSE_LOOP;
- if (!(lbd.flags & BLOB_LS_FLAG_SORT_BY_ID))
+ if (!(lbad.flags & BLOB_LS_FLAG_SORT_BY_ID))
pmd.loop_col_num = BLOBCOL_ID;
else
pmd.loop_col_num = BLOBCOL_NAME;
ret = for_each_matching_row(&pmd);
- if (lbd.pb.buf) {
- ls_output->data = lbd.pb.buf;
- ls_output->size = lbd.pb.size;
- return 1;
- }
- if (ret > 0)
- ret = 0;
- return ret;
+ if (ret < 0)
+ para_printf(&lbad.pb, "%s\n", PARA_STRERROR(-ret));
+ if (!lbad.pb.buf)
+ return 0;
+ result->data = lbad.pb.buf;
+ result->size = lbad.pb.size;
+ return 1;
}
static int com_lsblob(callback_function *f, int fd, int argc, char * const * const argv)
flags |= BLOB_LS_FLAG_REVERSE;
continue;
}
+ break;
}
// if (argc > i)
// return -E_BLOB_SYNTAX;
return blob_get_name_by_id(table_name ## _table, id, name); \
}
+static int blob_get_def_by_id(struct osl_table *table, uint32_t id,
+ struct osl_object *def)
+{
+ struct osl_row *row;
+ struct osl_object obj = {.data = &id, .size = sizeof(id)};
+ int ret;
+
+ def->data = NULL;
+ if (!id)
+ return 1;
+ ret = osl_get_row(table, BLOBCOL_ID, &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_ID(table_name, cmd_prefix) \
+ int cmd_prefix ## _get_def_by_id(uint32_t id, struct osl_object *def) \
+ { \
+ return blob_get_def_by_id(table_name ## _table, id, def); \
+ }
+
static int blob_get_name_and_def_by_row(struct osl_table *table,
const struct osl_row *row, char **name, struct osl_object *def)
{
if (ret >= 0)
return ret;
*table = NULL;
- return ret == -E_NOENT? 1 : ret;
+ if (ret >= 0 || is_errno(-ret, -ENOENT))
+ return 1;
+ return ret;
}
/** Define the \p init function for this blob type. */
DEFINE_BLOB_COMMAND(rm, table_name, cmd_prefix) \
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_NAME_AND_DEF_BY_ROW(table_name, cmd_prefix); \
DEFINE_BLOB_SHUTDOWN(table_name); \
DEFINE_BLOB_INIT(table_name);