mod_netware.c revision 5cbcfb67829b89d261f9a1f16350212b1c776411
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke/* Copyright 2002-2004 The Apache Software Foundation
9eb6a481980d81a55898ba418fba72fc3c09d8c8Dominik Luecke * Licensed under the Apache License, Version 2.0 (the "License");
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * you may not use this file except in compliance with the License.
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * You may obtain a copy of the License at
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian Maeder * http://www.apache.org/licenses/LICENSE-2.0
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke * Unless required by applicable law or agreed to in writing, software
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * distributed under the License is distributed on an "AS IS" BASIS,
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2af38fde95f93562f2124ec615fba0e509c8202eDominik Luecke * See the License for the specific language governing permissions and
2af38fde95f93562f2124ec615fba0e509c8202eDominik Luecke * limitations under the License.
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecketypedef struct {
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke apr_table_t *file_type_handlers; /* CGI map from file types to CGI modules */
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke apr_table_t *file_handler_mode; /* CGI module mode (spawn in same address space or not) */
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke apr_table_t *extra_env_vars; /* Environment variables to be added to the CGI environment */
da955132262baab309a50fdffe228c9efe68251dCui Jianstatic void *create_netware_dir_config(apr_pool_t *p, char *dir)
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke netware_dir_config *new = (netware_dir_config*) apr_palloc(p, sizeof(netware_dir_config));
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke new->file_type_handlers = apr_table_make(p, 10);
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke new->file_handler_mode = apr_table_make(p, 10);
f90884915ff10ae83f59e709c68824de834e64f5Dominik Luecke apr_table_set(new->file_type_handlers, "NLM", "OS");
da955132262baab309a50fdffe228c9efe68251dCui Jianstatic void *merge_netware_dir_configs(apr_pool_t *p, void *basev, void *addv)
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke netware_dir_config *base = (netware_dir_config *) basev;
da955132262baab309a50fdffe228c9efe68251dCui Jian netware_dir_config *add = (netware_dir_config *) addv;
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke netware_dir_config *new = (netware_dir_config *) apr_palloc(p, sizeof(netware_dir_config));
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke new->file_type_handlers = apr_table_overlay(p, add->file_type_handlers, base->file_type_handlers);
b72a390042c19e630cf221494b60c9df2a60d187Dominik Luecke new->file_handler_mode = apr_table_overlay(p, add->file_handler_mode, base->file_handler_mode);
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke new->extra_env_vars = apr_table_overlay(p, add->extra_env_vars, base->extra_env_vars);
08056875f5f633ef432598d5245ea41c112d2178Dominik Lueckestatic const char *set_extension_map(cmd_parms *cmd, netware_dir_config *m,
548f3850942936a8c6021185c8391dfcd3b03018Dominik Luecke for (i=0; i<len; i++) {
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke apr_table_set(m->file_type_handlers, ext, CGIhdlr);
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke apr_table_set(m->file_handler_mode, ext, "y");
08056875f5f633ef432598d5245ea41c112d2178Dominik Lueckestatic apr_status_t ap_cgi_build_command(const char **cmd, const char ***argv,
08056875f5f633ef432598d5245ea41c112d2178Dominik Luecke d = (netware_dir_config *)ap_get_module_config(r->per_dir_config,
fcac596b16bb10f475066c323b9b1ca44db2b755Dominik Luecke /* Handle the complete file name, we DON'T want to follow suexec, since
fcac596b16bb10f475066c323b9b1ca44db2b755Dominik Luecke * an unrooted command is as predictable as shooting craps in Win32.
da955132262baab309a50fdffe228c9efe68251dCui Jian * Notice that unlike most mime extension parsing, we have to use the
4df63f7187b1ba16cbe5c781db187a42f2f49579Dominik Luecke * win32 parsing here, therefore the final extension is the only one
b694e4b3f771a2f32042c9c505dd698bde969558Dominik Luecke * we will consider
da955132262baab309a50fdffe228c9efe68251dCui Jian if (r->args && r->args[0] && !ap_strchr_c(r->args, '=')) {
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke /* truncate any arguments from the cmd */
da955132262baab309a50fdffe228c9efe68251dCui Jian for (ptr = cmd_only; *ptr && (*ptr != ' '); ptr++);
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke /* Figure out what the extension is so that we can matche it. */
da955132262baab309a50fdffe228c9efe68251dCui Jian ext = strrchr(apr_filepath_name_get(cmd_only), '.');
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke /* If there isn't an extension then give it an empty string */
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke /* eliminate the '.' if there is one */
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke /* check if we have a registered command for the extension*/
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke new_cmd = apr_table_get(d->file_type_handlers, ext);
5b9f5c1b3592b99fc74d3438740ebcf9eb4c94beDominik Luecke "Could not find a command associated with the %s extension", ext);
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke /* If we have a registered command then add the file that was passed in as a
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke parameter to the registered command. */
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke *cmd = apr_pstrcat (p, new_cmd, " ", cmd_only, NULL);
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke /* Run in its own address space if specified */
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke /* Tokenize the full command string into its arguments */
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke apr_tokenize_to_argv(*cmd, (char***)argv, p);
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke /* The first argument should be the executible */
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke APR_REGISTER_OPTIONAL_FN(ap_cgi_build_command);
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik LueckeAP_INIT_TAKE23("CGIMapExtension", set_extension_map, NULL, OR_FILEINFO,
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke "Full path to the CGI NLM module followed by a file extension. If the "
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke "first parameter is set to \"OS\" then the following file extension is "
da955132262baab309a50fdffe228c9efe68251dCui Jian "treated as NLM. The optional parameter \"detach\" can be specified if "
2ea0ce749d2525f96d5d2f285f519ab07b005b8dDominik Luecke "the NLM should be launched in its own address space."),
{ NULL }