Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYousong Zhou <yszhou4tech@gmail.com>2016-02-17 10:45:05 +0300
committerFelix Fietkau <nbd@openwrt.org>2016-02-20 15:36:08 +0300
commit02db6d71b67d9efe33292fbf7f92da888aaf879f (patch)
treecaafaaa6c4490c2389378b22b886da7985f3b96d /json_script.c
parentf43da92dd7b80d955de751c2cc53525447870d96 (diff)
json_script: add "isdir" support
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
Diffstat (limited to 'json_script.c')
-rw-r--r--json_script.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/json_script.c b/json_script.c
index 7cef481..b5d414d 100644
--- a/json_script.c
+++ b/json_script.c
@@ -32,6 +32,7 @@ struct json_handler {
static int json_process_expr(struct json_call *call, struct blob_attr *cur);
static int json_process_cmd(struct json_call *call, struct blob_attr *cur);
+static int eval_string(struct json_call *call, struct blob_buf *buf, const char *name, const char *pattern);
struct json_script_file *
json_script_file_from_blobmsg(const char *name, void *data, int len)
@@ -345,6 +346,30 @@ static int handle_expr_not(struct json_call *call, struct blob_attr *expr)
return !ret;
}
+static int handle_expr_isdir(struct json_call *call, struct blob_attr *expr)
+{
+ static struct blob_buf b;
+ struct blob_attr *tb[3];
+ const char *pattern, *path;
+ struct stat s;
+ int ret;
+
+ json_get_tuple(expr, tb, BLOBMSG_TYPE_STRING, 0);
+ if (!tb[1] || blobmsg_type(tb[1]) != BLOBMSG_TYPE_STRING)
+ return -1;
+ pattern = blobmsg_data(tb[1]);
+
+ blob_buf_init(&b, 0);
+ ret = eval_string(call, &b, NULL, pattern);
+ if (ret < 0)
+ return ret;
+ path = blobmsg_data(blob_data(b.head));
+ ret = stat(path, &s);
+ if (ret < 0)
+ return 0;
+ return S_ISDIR(s.st_mode);
+}
+
static const struct json_handler expr[] = {
{ "eq", handle_expr_eq },
{ "regex", handle_expr_regex },
@@ -352,6 +377,7 @@ static const struct json_handler expr[] = {
{ "and", handle_expr_and },
{ "or", handle_expr_or },
{ "not", handle_expr_not },
+ { "isdir", handle_expr_isdir },
};
static int