From 35d9a39100fc8396ef8cadbe513a8c0fef860db7 Mon Sep 17 00:00:00 2001 From: "roberto@precise64" Date: Sun, 1 Apr 2012 06:14:09 +0200 Subject: [PATCH] fixed autoload --- plugins.c | 63 +++++++++++++++++++++++++++++++--- plugins/python/python_plugin.c | 1 - uwsgi.c | 3 ++ uwsgi.h | 1 + 4 files changed, 63 insertions(+), 5 deletions(-) diff --git a/plugins.c b/plugins.c index c6259fb3..6b479cc8 100644 --- a/plugins.c +++ b/plugins.c @@ -81,7 +81,8 @@ void *uwsgi_load_plugin(int modifier, char *plugin, char *has_option) { if (strchr(plugin_name, '/')) { plugin_handle = dlopen(plugin_name, RTLD_NOW | RTLD_GLOBAL); if (!plugin_handle) { - uwsgi_log( "%s\n", dlerror()); + if (!has_option) + uwsgi_log( "%s\n", dlerror()); goto end; } plugin_symbol_name_start = uwsgi_get_last_char(plugin_name, '/'); @@ -115,7 +116,8 @@ void *uwsgi_load_plugin(int modifier, char *plugin, char *has_option) { success: if (!plugin_handle) { - uwsgi_log( "%s\n", dlerror()); + if (!has_option) + uwsgi_log( "%s\n", dlerror()); } else { char *plugin_entry_symbol = uwsgi_concat2n(plugin_symbol_name_start, strlen(plugin_symbol_name_start)-3, "", 0); @@ -170,7 +172,7 @@ success: return NULL; } if (has_option) { - struct uwsgi_option *op = uwsgi.options; + struct uwsgi_option *op = up->options; int found = 0; while (op && op->name) { if (!strcmp(has_option, op->name)) { @@ -208,7 +210,8 @@ success: up->on_load(); return plugin_handle; } - uwsgi_log( "%s\n", dlerror()); + if (!has_option) + uwsgi_log( "%s\n", dlerror()); } end: @@ -219,3 +222,55 @@ end: return NULL; } + +int uwsgi_try_autoload(char *option) { + DIR *d; + struct dirent *dp; + // step dir, check for user-supplied plugins directory + struct uwsgi_string_list *pdir = uwsgi.plugins_dir; + while(pdir) { + d = opendir(pdir->value); + if (d) { + while ((dp = readdir(d)) != NULL) { + if (uwsgi_endswith(dp->d_name, "_plugin.so")) { + char *filename = uwsgi_concat3(pdir->value, "/", dp->d_name); + if (uwsgi_load_plugin(-1, filename, option)) { + uwsgi_log("option \"%s\" found in plugin %s\n", option, filename); + free(filename); + closedir(d); + // add new options + build_options(); + return 1; + } + free(filename); + } + } + closedir(d); + } + pdir = pdir->next; + } + + // last step: search in compile-time plugin_dir + d = opendir(UWSGI_PLUGIN_DIR); + if (!d) return 0; + + while((dp = readdir(d)) != NULL) { + if (uwsgi_endswith(dp->d_name, "_plugin.so")) { + char *filename = uwsgi_concat3(UWSGI_PLUGIN_DIR, "/", dp->d_name); + if (uwsgi_load_plugin(-1, filename, option)) { + uwsgi_log("option \"%s\" found in plugin %s\n", option, filename); + free(filename); + closedir(d); + // add new options + build_options(); + return 1; + } + free(filename); + } + } + + closedir(d); + + return 0; + +} diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c index b5df8670..7bcfdb48 100644 --- a/plugins/python/python_plugin.c +++ b/plugins/python/python_plugin.c @@ -246,7 +246,6 @@ void uwsgi_python_reset_random_seed() { random_seed = PyDict_GetItemString(random_dict, "seed"); if (random_seed) { PyObject *random_args = PyTuple_New(1); - Py_INCREF(random_args); #ifdef UWSGI_PYPY Py_INCREF(Py_None); #endif diff --git a/uwsgi.c b/uwsgi.c index 441a85d8..e6379580 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -446,6 +446,9 @@ restart: continue; uwsgi.dirty_config = 0; uwsgi.exported_opts[i]->configured = uwsgi_manage_opt(uwsgi.exported_opts[i]->key, uwsgi.exported_opts[i]->value); + if (uwsgi.exported_opts[i]->configured == 0 && uwsgi.autoload) { + uwsgi.dirty_config = uwsgi_try_autoload(uwsgi.exported_opts[i]->key); + } if (uwsgi.dirty_config) goto restart; } diff --git a/uwsgi.h b/uwsgi.h index acccc475..513a7c12 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -2771,6 +2771,7 @@ int uwsgi_socket_uniq(struct uwsgi_socket *, struct uwsgi_socket *); int uwsgi_socket_is_already_bound(char *name); char *uwsgi_expand_path(char *, int, char *); +int uwsgi_try_autoload(char *); uint64_t uwsgi_micros(void);