diff --git a/plugins/cgi/cgi_plugin.c b/plugins/cgi/cgi_plugin.c index e4f4245a..4ae43dc2 100644 --- a/plugins/cgi/cgi_plugin.c +++ b/plugins/cgi/cgi_plugin.c @@ -5,7 +5,7 @@ extern struct uwsgi_server uwsgi; struct uwsgi_cgi { struct uwsgi_dyn_dict *mountpoint; struct uwsgi_dyn_dict *helpers; - int buffer_size; + size_t buffer_size; int timeout; struct uwsgi_string_list *index; struct uwsgi_string_list *allowed_ext; @@ -17,31 +17,49 @@ struct uwsgi_cgi { int path_info; } uc ; -#define LONG_ARGS_CGI_BASE 17000 + ((9 + 1) * 1000) -#define LONG_ARGS_CGI LONG_ARGS_CGI_BASE + 1 -#define LONG_ARGS_CGI_MAP_HELPER LONG_ARGS_CGI_BASE + 2 -#define LONG_ARGS_CGI_BUFFER_SIZE LONG_ARGS_CGI_BASE + 3 -#define LONG_ARGS_CGI_TIMEOUT LONG_ARGS_CGI_BASE + 4 -#define LONG_ARGS_CGI_INDEX LONG_ARGS_CGI_BASE + 5 -#define LONG_ARGS_CGI_ALLOWED_EXT LONG_ARGS_CGI_BASE + 6 -#define LONG_ARGS_CGI_UNSET LONG_ARGS_CGI_BASE + 7 -#define LONG_ARGS_CGI_LOADLIB LONG_ARGS_CGI_BASE + 8 +void uwsgi_opt_add_cgi(char *opt, char *value, void *foobar) { -struct option uwsgi_cgi_options[] = { + char *val = strchr(optarg, '='); + if (!val) { + uwsgi_dyn_dict_new(&uc.mountpoint, value, strlen(value), NULL, 0); + } + else { + uwsgi_dyn_dict_new(&uc.mountpoint, value, val-value, val+1, strlen(val+1)); + } - {"cgi", required_argument, 0, LONG_ARGS_CGI}, - {"cgi-map-helper", required_argument, 0, LONG_ARGS_CGI_MAP_HELPER}, - {"cgi-helper", required_argument, 0, LONG_ARGS_CGI_MAP_HELPER}, - {"cgi-buffer-size", required_argument, 0, LONG_ARGS_CGI_BUFFER_SIZE}, - {"cgi-timeout", required_argument, 0, LONG_ARGS_CGI_TIMEOUT}, - {"cgi-index", required_argument, 0, LONG_ARGS_CGI_INDEX}, - {"cgi-allowed-ext", required_argument, 0, LONG_ARGS_CGI_ALLOWED_EXT}, - {"cgi-unset", required_argument, 0, LONG_ARGS_CGI_UNSET}, - {"cgi-loadlib", required_argument, 0, LONG_ARGS_CGI_LOADLIB}, - {"cgi-optimize", no_argument, &uc.optimize, 1}, - {"cgi-optimized", no_argument, &uc.optimize, 1}, - {"cgi-path-info", no_argument, &uc.path_info, 1}, - {0, 0, 0, 0}, +} + +void uwsgi_opt_add_cgi_maphelper(char *opt, char *value, void *foobar) { + char *val = strchr(value, '='); + if (!val) { + uwsgi_log("invalid CGI helper syntax, must be ext=command\n"); + exit(1); + } + uwsgi_dyn_dict_new(&uc.helpers, value, val-value, val+1, strlen(val+1)); +} + +struct uwsgi_option uwsgi_cgi_options[] = { + + {"cgi", required_argument, 0, "add a cgi mountpoint/directory/script", uwsgi_opt_add_cgi, NULL, 0}, + + {"cgi-map-helper", required_argument, 0, "add a cgi map-helper", uwsgi_opt_add_cgi_maphelper, NULL, 0}, + {"cgi-helper", required_argument, 0, "add a cgi map-helper", uwsgi_opt_add_cgi_maphelper, NULL, 0}, + + {"cgi-buffer-size", required_argument, 0, "set cgi buffer size", uwsgi_opt_set_64bit, &uc.buffer_size, 0}, + {"cgi-timeout", required_argument, 0, "set cgi script timeout", uwsgi_opt_set_int, &uc.timeout, 0}, + + {"cgi-index", required_argument, 0, "add a cgi index file", uwsgi_opt_add_string_list, &uc.index, 0}, + {"cgi-allowed-ext", required_argument, 0, "cgi allowed extension", uwsgi_opt_add_string_list, &uc.allowed_ext, 0}, + + {"cgi-unset", required_argument, 0, "unset specified environment variables", uwsgi_opt_add_string_list, &uc.unset, 0}, + + {"cgi-loadlib", required_argument, 0, "load a cgi shared library/optimizer", uwsgi_opt_add_string_list, &uc.loadlib, 0}, + {"cgi-optimize", no_argument, 0, "enable cgi realpath() optimizer", uwsgi_opt_true, &uc.optimize, 0}, + {"cgi-optimized", no_argument, 0, "enable cgi realpath() optimizer", uwsgi_opt_true, &uc.optimize, 0}, + + {"cgi-path-info", no_argument, 0, "disable PATH_INFO management in cgi scripts", uwsgi_opt_true, &uc.path_info, 0}, + + {0, 0, 0, 0, 0, 0, 0}, }; @@ -938,51 +956,6 @@ void uwsgi_cgi_after_request(struct wsgi_request *wsgi_req) { log_request(wsgi_req); } -int uwsgi_cgi_manage_options(int i, char *optarg) { - - char *value; - - switch(i) { - case LONG_ARGS_CGI: - value = strchr(optarg, '='); - if (!value) { - uwsgi_dyn_dict_new(&uc.mountpoint, optarg, strlen(optarg), NULL, 0); - } - else { - uwsgi_dyn_dict_new(&uc.mountpoint, optarg, value-optarg, value+1, strlen(value+1)); - } - return 1; - case LONG_ARGS_CGI_BUFFER_SIZE: - uc.buffer_size = atoi(optarg); - return 1; - case LONG_ARGS_CGI_TIMEOUT: - uc.timeout = atoi(optarg); - return 1; - case LONG_ARGS_CGI_INDEX: - uwsgi_string_new_list(&uc.index, optarg); - return 1; - case LONG_ARGS_CGI_ALLOWED_EXT: - uwsgi_string_new_list(&uc.allowed_ext, optarg); - return 1; - case LONG_ARGS_CGI_LOADLIB: - uwsgi_string_new_list(&uc.loadlib, uwsgi_str(optarg)); - return 1; - case LONG_ARGS_CGI_UNSET: - uwsgi_string_new_list(&uc.unset, optarg); - return 1; - case LONG_ARGS_CGI_MAP_HELPER: - value = strchr(optarg, '='); - if (!value) { - uwsgi_log("invalid CGI helper syntax, must be ext=command\n"); - exit(1); - } - uwsgi_dyn_dict_new(&uc.helpers, optarg, value-optarg, value+1, strlen(value+1)); - return 1; - } - - return 0; -} - struct uwsgi_plugin cgi_plugin = { @@ -991,7 +964,6 @@ struct uwsgi_plugin cgi_plugin = { .init = uwsgi_cgi_init, .init_apps = uwsgi_cgi_apps, .options = uwsgi_cgi_options, - .manage_opt = uwsgi_cgi_manage_options, .request = uwsgi_cgi_request, .after_request = uwsgi_cgi_after_request,