X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=plugin.c;h=687944d672d8cd6c383ba11fe4c09b781cb03f21;hb=0c4e97b4e7b440d02aec3aff9d06c9bc93717571;hp=d6bdcef516a69bf788cbb30d36be6f0553c3639e;hpb=0b4d4aeeace1c0a2cab6b913f309efb83ffd7c97;p=project%2Frpcd.git diff --git a/plugin.c b/plugin.c index d6bdcef..687944d 100644 --- a/plugin.c +++ b/plugin.c @@ -1,7 +1,7 @@ /* - * luci-rpcd - LuCI UBUS RPC server + * rpcd - UBUS RPC server * - * Copyright (C) 2013 Jo-Philipp Wich + * Copyright (C) 2013-2014 Jo-Philipp Wich * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -16,8 +16,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "plugin.h" -#include "exec.h" +#include static struct blob_buf buf; @@ -195,7 +194,7 @@ rpc_plugin_parse_signature(struct blob_attr *sig, struct ubus_method *method) struct blob_attr *attr; struct blobmsg_policy *policy = NULL; - if (!sig || blob_id(sig) != BLOBMSG_TYPE_TABLE) + if (!sig || blobmsg_type(sig) != BLOBMSG_TYPE_TABLE) return false; n_attr = 0; @@ -214,7 +213,7 @@ rpc_plugin_parse_signature(struct blob_attr *sig, struct ubus_method *method) blobmsg_for_each_attr(attr, sig, rem) { - type = blob_id(attr); + type = blobmsg_type(attr); if (type == BLOBMSG_TYPE_INT32) { @@ -254,7 +253,7 @@ rpc_plugin_parse_signature(struct blob_attr *sig, struct ubus_method *method) } static struct ubus_object * -rpc_plugin_parse_plugin(const char *name, int fd) +rpc_plugin_parse_exec(const char *name, int fd) { int len, rem, n_method; struct blob_attr *cur; @@ -341,7 +340,7 @@ rpc_plugin_parse_plugin(const char *name, int fd) } static int -rpc_plugin_register(struct ubus_context *ctx, const char *path) +rpc_plugin_register_exec(struct ubus_context *ctx, const char *path) { pid_t pid; int rv = UBUS_STATUS_NO_DATA, fd, fds[2]; @@ -382,7 +381,7 @@ rpc_plugin_register(struct ubus_context *ctx, const char *path) return UBUS_STATUS_UNKNOWN_ERROR; default: - plugin = rpc_plugin_parse_plugin(name + 1, fds[0]); + plugin = rpc_plugin_parse_exec(name + 1, fds[0]); if (!plugin) goto out; @@ -398,6 +397,37 @@ out: } } + +static LIST_HEAD(plugins); + +static const struct rpc_daemon_ops ops = { + .session_access = rpc_session_access, + .session_create_cb = rpc_session_create_cb, + .session_destroy_cb = rpc_session_destroy_cb, + .exec = rpc_exec, +}; + +static int +rpc_plugin_register_library(struct ubus_context *ctx, const char *path) +{ + struct rpc_plugin *p; + void *dlh; + + dlh = dlopen(path, RTLD_LAZY | RTLD_GLOBAL); + + if (!dlh) + return UBUS_STATUS_UNKNOWN_ERROR; + + p = dlsym(dlh, "rpc_plugin"); + + if (!p) + return UBUS_STATUS_NOT_FOUND; + + list_add(&p->list, &plugins); + + return p->init(&ops, ctx); +} + int rpc_plugin_api_init(struct ubus_context *ctx) { DIR *d; @@ -406,22 +436,37 @@ int rpc_plugin_api_init(struct ubus_context *ctx) struct dirent *e; char path[PATH_MAX]; - d = opendir(RPC_PLUGIN_DIRECTORY); + if ((d = opendir(RPC_PLUGIN_DIRECTORY)) != NULL) + { + while ((e = readdir(d)) != NULL) + { + snprintf(path, sizeof(path) - 1, + RPC_PLUGIN_DIRECTORY "/%s", e->d_name); - if (!d) - return UBUS_STATUS_NOT_FOUND; + if (stat(path, &s) || !S_ISREG(s.st_mode) || !(s.st_mode & S_IXUSR)) + continue; + + rv |= rpc_plugin_register_exec(ctx, path); + } - while ((e = readdir(d)) != NULL) + closedir(d); + } + + if ((d = opendir(RPC_LIBRARY_DIRECTORY)) != NULL) { - snprintf(path, sizeof(path) - 1, RPC_PLUGIN_DIRECTORY "/%s", e->d_name); + while ((e = readdir(d)) != NULL) + { + snprintf(path, sizeof(path) - 1, + RPC_LIBRARY_DIRECTORY "/%s", e->d_name); - if (stat(path, &s) || !S_ISREG(s.st_mode) || !(s.st_mode & S_IXUSR)) - continue; + if (stat(path, &s) || !S_ISREG(s.st_mode)) + continue; - rv |= rpc_plugin_register(ctx, path); - } + rv |= rpc_plugin_register_library(ctx, path); + } - closedir(d); + closedir(d); + } return rv; }