void uwsgi_autoload_plugins_by_name(char *argv_zero) { char *plugins_requested = NULL; char *original_proc_name = getenv("UWSGI_ORIGINAL_PROC_NAME"); if (!original_proc_name) { // here we use argv[0]; original_proc_name = argv_zero; setenv("UWSGI_ORIGINAL_PROC_NAME", original_proc_name, 1); } char *p = strrchr(original_proc_name, '/'); if (p == NULL) p = original_proc_name; p = strstr(p, "uwsgi_"); if (p != NULL) { plugins_requested = strtok(uwsgi_str(p + 6), "_"); while (plugins_requested) { uwsgi_log("[uwsgi] implicit plugin requested %s\n", plugins_requested); uwsgi_load_plugin(-1, plugins_requested, NULL); plugins_requested = strtok(NULL, "_"); } } plugins_requested = getenv("UWSGI_PLUGINS"); if (plugins_requested) { plugins_requested = uwsgi_concat2(plugins_requested, ""); char *p = strtok(plugins_requested, ","); while (p != NULL) { uwsgi_load_plugin(-1, p, NULL); p = strtok(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; }
static void uwsgi_plugin_parse_section(char *filename) { size_t s_len = 0; char *buf = uwsgi_elf_section(filename, "uwsgi", &s_len); if (buf) { char *ctx = NULL; char *p = strtok_r(buf, "\n", &ctx); while (p) { char *equal = strchr(p, '='); if (equal) { *equal = 0; if (!strcmp(p, "requires")) { uwsgi_load_plugin(-1, equal + 1, NULL); } } p = strtok_r(NULL, "\n", &ctx); } free(buf); } }