diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-01-04 23:14:07 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-01-04 23:14:07 +0100 |
commit | b949545598eaa75b38b4d57c9aea6216bd82256c (patch) | |
tree | e8716e9b8ad6fb3bec788ed7f78c332284f1934c /plugin.c | |
parent | 0e7c0877717534db5ecac58df9f01c60776e85db (diff) |
add lua plugin support
Diffstat (limited to 'plugin.c')
-rw-r--r-- | plugin.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/plugin.c b/plugin.c new file mode 100644 index 0000000..25a8464 --- /dev/null +++ b/plugin.c @@ -0,0 +1,55 @@ +/* + * uhttpd - Tiny single-threaded httpd - Main header + * + * Copyright (C) 2010-2012 Jo-Philipp Wich <xm@subsignal.org> + * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org> + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <dlfcn.h> +#include "uhttpd.h" +#include "plugin.h" + +static const struct uhttpd_ops ops = { + .dispatch_add = uh_dispatch_add, + .path_match = uh_path_match, + .create_process = uh_create_process, + .get_process_vars = uh_get_process_vars, + .client_error = uh_client_error, + .chunk_write = uh_chunk_write, + .urlencode = uh_urlencode, + .urldecode = uh_urldecode, +}; + +int uh_plugin_init(const char *name) +{ + struct uhttpd_plugin *p; + const char *sym; + void *dlh; + + dlh = dlopen(name, RTLD_LAZY | RTLD_LOCAL); + if (!dlh) { + fprintf(stderr, "Could not open plugin %s: %s\n", name, dlerror()); + return -ENOENT; + } + + sym = "uhttpd_plugin"; + p = dlsym(dlh, sym); + if (!p) { + fprintf(stderr, "Could not find symbol '%s' in plugin '%s'\n", sym, name); + return -ENOENT; + } + + return p->init(&ops, &conf); +} |