plugin.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * uhttpd - Tiny single-threaded httpd - Main header
  3. *
  4. * Copyright (C) 2010-2012 Jo-Philipp Wich <xm@subsignal.org>
  5. * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. */
  19. #include <dlfcn.h>
  20. #include "uhttpd.h"
  21. #include "plugin.h"
  22. static const struct uhttpd_ops ops = {
  23. .dispatch_add = uh_dispatch_add,
  24. .path_match = uh_path_match,
  25. .create_process = uh_create_process,
  26. .get_process_vars = uh_get_process_vars,
  27. .client_error = uh_client_error,
  28. .chunk_write = uh_chunk_write,
  29. .urlencode = uh_urlencode,
  30. .urldecode = uh_urldecode,
  31. };
  32. int uh_plugin_init(const char *name)
  33. {
  34. struct uhttpd_plugin *p;
  35. const char *sym;
  36. void *dlh;
  37. dlh = dlopen(name, RTLD_LAZY | RTLD_LOCAL);
  38. if (!dlh) {
  39. fprintf(stderr, "Could not open plugin %s: %s\n", name, dlerror());
  40. return -ENOENT;
  41. }
  42. sym = "uhttpd_plugin";
  43. p = dlsym(dlh, sym);
  44. if (!p) {
  45. fprintf(stderr, "Could not find symbol '%s' in plugin '%s'\n", sym, name);
  46. return -ENOENT;
  47. }
  48. return p->init(&ops, &conf);
  49. }