Previously, function prototype prop_handler_t() in props.h is
just for setting and getting @value. However, it prints @value
directly instead of returns the value. It was difficult to get
@value by @name.

For code-reuse, here divide prop_handler_t into three handlers:
1) prop_setter_t: set @value as origin.
2) prop_getter_t:
        if arg @value is NULL, return the length of result for
                caller to allocate.
        else copy result to memory space which arg @value points to.

3) prop_printer_t: just call correspond prop_getter_t and
prints result.

Notice:
Since C language has no feature like tpyeinfo in others.
After return of prop_getter_t(), the arg @value will point
to array of characters without null-terminated.

Signed-off-by: Su Yue <suy.f...@cn.fujitsu.com>
---
 cmds-property.c |  7 +++++--
 props.c         | 11 +++++++----
 props.h         | 19 +++++++++++++++----
 3 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/cmds-property.c b/cmds-property.c
index 03bafa054701..6795d1795027 100644
--- a/cmds-property.c
+++ b/cmds-property.c
@@ -180,7 +180,7 @@ static int dump_prop(const struct prop_handler *prop,
 
        if ((types & type) && (prop->types & type)) {
                if (!name_and_help)
-                       ret = prop->handler(type, object, prop->name, NULL);
+                       ret = prop->printer(type, object, prop->name);
                else
                        printf("%-20s%s\n", prop->name, prop->desc);
        }
@@ -244,7 +244,10 @@ static int setget_prop(int types, const char *object,
                goto out;
        }
 
-       ret = prop->handler(types, object, name, value);
+       if (value)
+               ret = prop->setter(types, object, name, value);
+       else
+               ret = prop->printer(types, object, name);
 
        if (ret < 0)
                ret = 50;
diff --git a/props.c b/props.c
index cddbd9272fe4..d6249f53887d 100644
--- a/props.c
+++ b/props.c
@@ -188,10 +188,13 @@ out:
 
 const struct prop_handler prop_handlers[] = {
        {"ro", "Set/get read-only flag of subvolume.", 0, prop_object_subvol,
-        prop_read_only},
+        NULL, NULL, NULL},
+
        {"label", "Set/get label of device.", 0,
-        prop_object_dev | prop_object_root, prop_label},
+        prop_object_dev | prop_object_root, NULL, NULL, NULL},
+
        {"compression", "Set/get compression for a file or directory", 0,
-        prop_object_inode, prop_compression},
-       {NULL, NULL, 0, 0, NULL}
+        prop_object_inode, NULL, NULL, NULL},
+
+       {NULL, NULL, 0, 0, NULL, NULL, NULL}
 };
diff --git a/props.h b/props.h
index a43cb2537f37..fd5796bff09d 100644
--- a/props.h
+++ b/props.h
@@ -17,6 +17,8 @@
 #ifndef __BTRFS_PROPS_H__
 #define __BTRFS_PROPS_H__
 
+#include <unistd.h>
+
 enum prop_object_type {
        prop_object_dev         = (1 << 0),
        prop_object_root        = (1 << 1),
@@ -25,17 +27,26 @@ enum prop_object_type {
        __prop_object_max,
 };
 
-typedef int (*prop_handler_t)(enum prop_object_type type,
+typedef int (*prop_setter_t)(enum prop_object_type type,
+                            const char *object,
+                            const char *name,
+                            const char *value);
+typedef ssize_t (*prop_getter_t)(enum prop_object_type type,
+                                const char *object,
+                                const char *name,
+                                char *value);
+typedef int (*prop_printer_t)(enum prop_object_type type,
                              const char *object,
-                             const char *name,
-                             const char *value);
+                             const char *name);
 
 struct prop_handler {
        const char *name;
        const char *desc;
        int read_only;
        int types;
-       prop_handler_t handler;
+       prop_setter_t setter;
+       prop_getter_t getter;
+       prop_printer_t printer;
 };
 
 extern const struct prop_handler prop_handlers[];
-- 
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

Reply via email to