summaryrefslogtreecommitdiff
path: root/plugin.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-01-04 23:14:07 +0100
committerFelix Fietkau <nbd@openwrt.org>2013-01-04 23:14:07 +0100
commitb949545598eaa75b38b4d57c9aea6216bd82256c (patch)
treee8716e9b8ad6fb3bec788ed7f78c332284f1934c /plugin.c
parent0e7c0877717534db5ecac58df9f01c60776e85db (diff)
add lua plugin support
Diffstat (limited to 'plugin.c')
-rw-r--r--plugin.c55
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);
+}