Introduce set_prop_label(), get_prop_label(), print_prop_label() to set/get/print label.
Signed-off-by: Su Yue <suy.f...@cn.fujitsu.com> --- props.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/props.c b/props.c index da69f6e9314c..28a81b6bdc81 100644 --- a/props.c +++ b/props.c @@ -145,23 +145,68 @@ out: return ret; } -static int prop_label(enum prop_object_type type, - const char *object, - const char *name, - const char *value) +static ssize_t prop_label(enum prop_object_type type, const char *object, + const char *name, char *value, enum prop_operation operation) { - int ret; + ssize_t ret; - if (value) { + if (operation == set_prop) { ret = set_label((char *) object, (char *) value); } else { char label[BTRFS_LABEL_SIZE]; ret = get_label((char *) object, label); - if (!ret) - fprintf(stdout, "label=%s\n", label); + if (ret) + goto out; + + if (!value) + ret = strlen(label); + else + memcpy(value, label, strlen(label)); + } +out: + return ret; +} + +static int set_prop_label(enum prop_object_type type, const char *object, + const char *name, const char *value) +{ + return prop_label(type, object, name, (char *)value, set_prop); +} + +static ssize_t get_prop_label(enum prop_object_type type, const char *object, + const char *name, char *value) +{ + return prop_label(type, object, name, value, get_prop); +} + +static int print_prop_label(enum prop_object_type type, const char *object, + const char *name) +{ + int ret; + ssize_t len; + char *value = NULL; + + len = get_prop_label(type, object, name, NULL); + if (len < 0) { + ret = len; + goto out; } + value = malloc(len + 1); + if (!value) { + ret = -ENOMEM; + goto out; + } + ret = get_prop_label(type, object, name, value); + if (ret) + goto out; + + value[len] = '\0'; + printf("label=%s\n", value); +out: + if (value) + free(value); return ret; } @@ -243,7 +288,8 @@ const struct prop_handler prop_handlers[] = { set_prop_read_only, get_prop_read_only, print_prop_read_only}, {"label", "Set/get label of device.", 0, - prop_object_dev | prop_object_root, NULL, NULL, NULL}, + prop_object_dev | prop_object_root, + set_prop_label, get_prop_label, print_prop_label}, {"compression", "Set/get compression for a file or directory", 0, prop_object_inode, NULL, NULL, NULL}, -- 2.15.0 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html