Diff for /parser3/src/targets/apache/mod_parser3.c between versions 1.2 and 1.13

version 1.2, 2010/11/13 00:44:08 version 1.13, 2012/04/18 13:34:39
Line 1 Line 1
 /** @file  /** @file
         Parser: apache 1.3 and 2.2 module          Parser: apache 1.3 and 2.2 module
   
         Copyright (c) 2001-2010 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
   
 static const char * const IDENT_MOD_PARSER3_C="$Date$";  
   
 #ifdef WIN32  #ifdef WIN32
 #include <winsock2.h>  #include <winsock2.h>
 #endif  #endif
Line 21  static const char * const IDENT_MOD_PARS Line 19  static const char * const IDENT_MOD_PARS
   
 #include "pa_httpd.h"  #include "pa_httpd.h"
   
   volatile const char * IDENT_MOD_PARSER3_C="$Id$" IDENT_PA_HTTPD_H;
   
   #define PARSER3_HANDLER "parser3-handler"
   
 /*  /*
 * To Ease Compatibility  * To Ease Compatibility
 */  */
Line 43  static const char * const IDENT_MOD_PARS Line 45  static const char * const IDENT_MOD_PARS
 #define apr_pool_t pool  #define apr_pool_t pool
 #define apr_table_t table  #define apr_table_t table
   
 #define ap_add_version_component(p, v) ap_add_version_component(v)   
   
 #endif /* STANDARD20_MODULE_STUFF */  #endif /* STANDARD20_MODULE_STUFF */
   
 /*  /*
Line 62  module MODULE_VAR_EXPORT parser3_module; Line 62  module MODULE_VAR_EXPORT parser3_module;
 * Locate our directory configuration record for the current request.  * Locate our directory configuration record for the current request.
 */  */
 static Parser_module_config *our_dconfig(request_rec *r) {  static Parser_module_config *our_dconfig(request_rec *r) {
         return (Parser_module_config *)           return (Parser_module_config *) ap_get_module_config(r->per_dir_config, &parser3_module);
                 ap_get_module_config(r->per_dir_config, &parser3_module);  
 }  }
   
 static const char* cmd_parser_config(cmd_parms *cmd, void *mconfig, char *file_spec) {  static const char* cmd_parser_config(cmd_parms *cmd, void *mconfig, const char *file_spec) {
         Parser_module_config *cfg = (Parser_module_config *) mconfig;          Parser_module_config *cfg = (Parser_module_config *) mconfig;
           
         // remember assigned filespec into cfg  
         cfg->parser_config_filespec=file_spec;          cfg->parser_config_filespec=file_spec;
           
         return NULL;  
 }  
   
 static const char* cmd_parser_status_allowed(cmd_parms *cmd, void *mconfig, char *file_spec) {  
         Parser_module_config *cfg = (Parser_module_config *) mconfig;  
           
         cfg->parser_status_allowed=1;  
           
         return NULL;          return NULL;
 }  }
   
Line 87  static const char* cmd_parser_status_all Line 75  static const char* cmd_parser_status_all
 * Now let's declare routines for each of the callback phase in order.  * Now let's declare routines for each of the callback phase in order.
 */  */
   
 static int parser_handler(request_rec *ar) {  static int parser_handler(request_rec *r) {
         // record clone  #ifdef STANDARD20_MODULE_STUFF
         pa_request_rec lr={          if(strcmp(r->handler, PARSER3_HANDLER))
                 ar,                  return DECLINED;
                 ar->pool,  #endif
                 ar->header_only,  
                 &ar->status,          // we setup module here to avoid GPF on init with php5-xsl installed
                 ar->method,          pa_setup_module_cells();
                 ar->headers_out,  
                 ar->subprocess_env,  
                 &ar->content_type,  
                 ar->uri,  
                 ar->filename,  
                 ar->path_info,  
                 ar->args,  
                 &ar->finfo  
         };  
   
         // config          // converting to parser version
         Parser_module_config *dcfg=our_dconfig(ar);          pa_request_rec pr={
                           r,
         return pa_parser_handler(&lr, dcfg);                  r->pool,
                   r->header_only,
                   &r->status,
                   r->method,
                   r->headers_out,
                   r->subprocess_env,
                   &r->content_type,
                   r->uri,
                   r->filename,
                   r->path_info,
                   r->args,
   #ifdef STANDARD20_MODULE_STUFF
                   r->finfo.filetype == 0
   #else           
                   r->finfo.st_mode == 0
   #endif
           };
           return pa_parser_handler(&pr, our_dconfig(r));
 }  }
   
 /*   /* 
 * This function is called during server initialisation.  * This function is called during process initialisation.
 */  */
   
   #ifdef STANDARD20_MODULE_STUFF
   static void parser_child_init(apr_pool_t *p, server_rec *s) {
   #else
 static void parser_module_init(server_rec *s, apr_pool_t *p) {  static void parser_module_init(server_rec *s, apr_pool_t *p) {
 #if MODULE_MAGIC_NUMBER >= 19980527  
         ap_add_version_component(p, pa_version());  
 #endif    #endif  
           //      ap_log_perror(APLOG_MARK, APLOG_EMERG, 0, p, "parser inited %d", getpid());
         /*  
         * Set up any module cells that ought to be initialised.  
         */  
         pa_setup_module_cells();  
 }  }
   
 /*   /* 
Line 137  static void parser_module_done(server_re Line 130  static void parser_module_done(server_re
 * This function gets called to create a per-directory configuration record.  * This function gets called to create a per-directory configuration record.
 */  */
 static void *parser_create_dir_config(apr_pool_t *p, char *dirspec) {  static void *parser_create_dir_config(apr_pool_t *p, char *dirspec) {
         /*          Parser_module_config *cfg= ap_pcalloc(p, sizeof(Parser_module_config));
         * Allocate the space for our record from the apr_pool_t supplied.          cfg->parser_config_filespec=NULL;
         */          return cfg;
         Parser_module_config *cfg=  
                 (Parser_module_config *) ap_pcalloc(p, sizeof(Parser_module_config));  
         return (void *) cfg;  
 }  
   
 /*  
 * This function gets called to merge two per-directory configuration records.  
 *  
 * 20011126 paf: noticed, that this is called even on virtual root merge with something "parent",  
 * while thought that that is part of merge_server...  
 *  
 */  
 static void *parser_merge_dir_config(apr_pool_t *p, void *parent_conf, void *newloc_conf) {  
         Parser_module_config *merged_config = (Parser_module_config *) ap_pcalloc(p, sizeof(Parser_module_config));  
         Parser_module_config *pconf = (Parser_module_config *) parent_conf;  
         Parser_module_config *nconf = (Parser_module_config *) newloc_conf;  
           
         merged_config->parser_config_filespec = ap_pstrdup(p, nconf->parser_config_filespec?  
                 nconf->parser_config_filespec:pconf->parser_config_filespec);  
         merged_config->parser_status_allowed=  
                 pconf->parser_status_allowed ||  
                 nconf->parser_status_allowed;  
           
         return (void *) merged_config;  
 }  }
   
 /*  /*
 * This function gets called to create a per-server configuration record.  * This function gets called to create a per-server configuration record.
 */  */
 static void *parser_create_server_config(apr_pool_t *p, server_rec *s) {  static void *parser_create_server_config(apr_pool_t *p, server_rec *s) {
         /*          Parser_module_config *cfg= ap_pcalloc(p, sizeof(Parser_module_config));
         * As with the parser_create_dir_config() routine, we allocate and fill          cfg->parser_config_filespec=NULL;
         * in an empty record.          return cfg;
         */  
         Parser_module_config *cfg=  
                 (Parser_module_config *) ap_pcalloc(p, sizeof(Parser_module_config));  
           
         return (void *) cfg;  
 }  
   
 /*  
 * This function gets called to merge two per-server configuration records.  
 */  
 static void *parser_merge_server_config(apr_pool_t *p, void *server1_conf, void *server2_conf)  
 {  
         Parser_module_config *merged_config = (Parser_module_config *) ap_pcalloc(p, sizeof(Parser_module_config));  
         Parser_module_config *s1conf = (Parser_module_config *) server1_conf;  
         Parser_module_config *s2conf = (Parser_module_config *) server2_conf;  
           
         /*  
         * Our inheritance rules are our own, and part of our module's semantics.  
         * Basically, just note whence we came.  
         */  
         merged_config->parser_config_filespec = ap_pstrdup(p, s2conf->parser_config_filespec?  
                 s2conf->parser_config_filespec:s1conf->parser_config_filespec);  
         merged_config->parser_status_allowed=  
                 s1conf->parser_status_allowed ||   
                 s2conf->parser_status_allowed;  
           
         return (void *) merged_config;  
 }  
   
 /*  
 * This routine gives our module an opportunity to translate the URI into an  
 * actual filename.  
 */  
 static int parser_translate_handler(request_rec *r) {  
         Parser_module_config *cfg=our_dconfig(r);  
         return DECLINED;  
 }  
   
 /*  
 * This routine is called to check the authentication information sent with  
 * the request  
 */  
 static int parser_check_user_id(request_rec *r) {  
         Parser_module_config *cfg=our_dconfig(r);  
         return DECLINED;  
 }  
   
 /*  
 * This routine is called to check to see if the resource being requested  
 * requires authorisation.  
 */  
 static int parser_auth_checker(request_rec *r) {  
         Parser_module_config *cfg=our_dconfig(r);  
         return DECLINED;  
 }  
   
 /*  
 * This routine is called to check for any module-specific restrictions placed  
 * upon the requested resource.  (See the mod_access module for an example.)  
 */  
 static int parser_access_checker(request_rec *r) {  
         Parser_module_config *cfg=our_dconfig(r);  
         return DECLINED;  
 }  }
   
 /*   /* 
Line 243  static int parser_access_checker(request Line 149  static int parser_access_checker(request
 */  */
 static const command_rec parser_cmds[] =  static const command_rec parser_cmds[] =
 {  {
         {          {"ParserConfig", (const char *(*)())cmd_parser_config, 0, OR_OPTIONS, TAKE1, "Parser config filespec"},
                 "ParserConfig",              /* directive name */  
                         (const char* (*)(void))((void *)cmd_parser_config), // config action routine  
                         (void*)0,                   /* argument to include in call */  
                         (int)(OR_OPTIONS),             /* where available */  
                         TAKE1,                /* arguments */  
                         "Parser config filespec" // directive description  
         },  
         {  
                 "ParserStatusAllowed",              /* directive name */  
                         (const char* (*)(void))((void *)cmd_parser_status_allowed), // config action routine  
                         (void*)0,                   /* argument to include in call */  
                         (int)(ACCESS_CONF),             /* where available */  
                         NO_ARGS,                /* arguments */  
                         "Parser status class can be used" // directive description  
         },  
         {NULL}          {NULL}
 };  };
   
Line 269  static const command_rec parser_cmds[] = Line 160  static const command_rec parser_cmds[] =
 #ifndef STANDARD20_MODULE_STUFF  #ifndef STANDARD20_MODULE_STUFF
 static const handler_rec parser_handlers[] =  static const handler_rec parser_handlers[] =
 {  {
         {"parser3-handler", parser_handler},          {PARSER3_HANDLER, parser_handler},
         {NULL}          {NULL}
 };  };
 #endif  #endif
Line 286  static const handler_rec parser_handlers Line 177  static const handler_rec parser_handlers
 */  */
 static void parser_register_hooks(apr_pool_t* pool)  static void parser_register_hooks(apr_pool_t* pool)
 {  {
         ap_add_version_component(pool, pa_version());  
 //      ap_hook_post_config(parser_server_init, NULL, NULL, APR_HOOK_MIDDLE);  
         ap_hook_handler(parser_handler, NULL, NULL, APR_HOOK_MIDDLE);          ap_hook_handler(parser_handler, NULL, NULL, APR_HOOK_MIDDLE);
 //      ap_hook_translate_name(parser_translate_handler, NULL, NULL, APR_HOOK_MIDDLE);          ap_hook_child_init(parser_child_init, NULL, NULL, APR_HOOK_MIDDLE);
 //      ap_hook_check_user_id(parser_check_user_id, NULL, NULL, APR_HOOK_MIDDLE);  
 //      ap_hook_auth_checker(parser_auth_checker, NULL, NULL, APR_HOOK_MIDDLE);  
 //      ap_hook_access_checker(parser_access_checker, NULL, NULL, APR_HOOK_MIDDLE);  
 };  };
   
 module AP_MODULE_DECLARE_DATA parser3_module =  module AP_MODULE_DECLARE_DATA parser3_module =
Line 302  module AP_MODULE_DECLARE_DATA parser3_mo Line 188  module AP_MODULE_DECLARE_DATA parser3_mo
 module MODULE_VAR_EXPORT parser3_module =  module MODULE_VAR_EXPORT parser3_module =
 {  {
         STANDARD_MODULE_STUFF,          STANDARD_MODULE_STUFF,
         parser_module_init,          /* module initializer */          parser_module_init,             /* module initializer */
 #endif  #endif
         parser_create_dir_config,    /* per-directory config creator */          parser_create_dir_config,       /* per-directory config creator */
         parser_merge_dir_config,     /* dir config merger */          0,                              /* dir config merger */
         parser_create_server_config, /* server config creator */          parser_create_server_config,    /* server config creator */
         parser_merge_server_config,  /* server config merger */          0,                              /* server config merger */
         parser_cmds,                 /* command apr_table_t */          parser_cmds,                    /* command apr_table_t */
 #ifdef STANDARD20_MODULE_STUFF  #ifdef STANDARD20_MODULE_STUFF
         parser_register_hooks        /* register hooks */          parser_register_hooks           /* register hooks */
 #else  #else
         parser_handlers,             /* [9] list of handlers */          parser_handlers,                /* [9] list of handlers */
         parser_translate_handler,    /* [2] filename-to-URI translation */          0,                              /* [2] filename-to-URI translation */
         parser_check_user_id,        /* [5] check/validate user_id */          0,                              /* [5] check/validate user_id */
         parser_auth_checker,         /* [6] check user_id is valid *here* */          0,                              /* [6] check user_id is valid *here* */
         parser_access_checker,       /* [4] check access by host address */          0,                              /* [4] check access by host address */
         0,                           /* [7] MIME type checker/setter */          0,                              /* [7] MIME type checker/setter */
         0,                           /* [8] fixups */          0,                              /* [8] fixups */
         0                            /* [10] logger */          0,                              /* [10] logger */
 #if MODULE_MAGIC_NUMBER >= 19970103          0,                              /* [3] header parser */
         ,0                           /* [3] header parser */          0,                              /* process initializer */
 #endif          parser_module_done              /* process exit/cleanup */
 #if MODULE_MAGIC_NUMBER >= 19970719  
         ,0                           /* process initializer */  
 #endif  
 #if MODULE_MAGIC_NUMBER >= 19970728  
         ,parser_module_done          /* process exit/cleanup */  
 #endif  
   
 #endif // STANDARD20_MODULE_STUFF  #endif // STANDARD20_MODULE_STUFF
 };  };
   
Line 345  module MODULE_VAR_EXPORT parser3_module Line 224  module MODULE_VAR_EXPORT parser3_module
   
 // interface to C++  // interface to C++
   
 #define PA_APLOG_EMERG  0       /* system is unusable */  
 #define PA_APLOG_ALERT  1       /* action must be taken immediately */  
 #define PA_APLOG_CRIT   2       /* critical conditions */  
 #define PA_APLOG_ERR    3       /* error conditions */  
 #define PA_APLOG_WARNING        4       /* warning conditions */  
 #define PA_APLOG_NOTICE 5       /* normal but significant condition */  
 #define PA_APLOG_INFO   6       /* informational */  
 #define PA_APLOG_DEBUG  7       /* debug-level messages */  
   
 #define PA_APLOG_LEVELMASK      7       /* mask off the level value */  
   
 #define PA_APLOG_NOERRNO                (PA_APLOG_LEVELMASK + 1)  
   
 #define PA_APLOG_MARK   __FILE__,__LINE__  
   
 void pa_ap_log_rerror(const char *file, int line, int level, const pa_request_rec *s, const char *fmt, ...) {  void pa_ap_log_rerror(const char *file, int line, int level, const pa_request_rec *s, const char *fmt, ...) {
         const char* str;          const char* str;
         va_list l;          va_list l;
Line 369  void pa_ap_log_rerror(const char *file, Line 233  void pa_ap_log_rerror(const char *file,
   
         ap_log_rerror(file, line, level,          ap_log_rerror(file, line, level,
 #ifdef STANDARD20_MODULE_STUFF  #ifdef STANDARD20_MODULE_STUFF
                                 0,                          0,
 #endif  #endif
                       (request_rec*)s->real_request_rec, "%s", str);                          (request_rec*)s->real_request_rec, "%s", str);
 }  }
   
   
Line 384  void pa_ap_log_error(const char *file, i Line 248  void pa_ap_log_error(const char *file, i
   
         ap_log_error(file, line, level,          ap_log_error(file, line, level,
 #ifdef STANDARD20_MODULE_STUFF  #ifdef STANDARD20_MODULE_STUFF
                                 0,                          0,
 #endif  #endif
                       (server_rec*)s, "%s", str);                          (server_rec*)s, "%s", str);
 }  }
   
 // ap_alloc.h  // ap_alloc.h
Line 435  int pa_ap_rwrite(const void *buf, int nb Line 299  int pa_ap_rwrite(const void *buf, int nb
   
 // http_main.h  // http_main.h
   
 void pa_ap_hard_timeout(char *s, pa_request_rec *r) {  void pa_ap_hard_timeout(const char *s, pa_request_rec *r) {
 // Apache 2 uses non-blocking I/O  // Apache 2 uses non-blocking I/O
 #ifndef STANDARD20_MODULE_STUFF  #ifndef STANDARD20_MODULE_STUFF
         ap_hard_timeout(s, (request_rec*)r->real_request_rec);          ap_hard_timeout((char *)s, (request_rec*)r->real_request_rec);
 #endif  #endif
 }  }
 void pa_ap_reset_timeout(pa_request_rec *r) {  void pa_ap_reset_timeout(pa_request_rec *r) {
Line 470  void (*pa_signal (int sig, void (*disp)( Line 334  void (*pa_signal (int sig, void (*disp)(
   
         return 0;          return 0;
 }  }
 #endif  
   
   #endif

Removed from v.1.2  
changed lines
  Added in v.1.13


E-mail: