#define CORE_PRIVATE #include "mod_perl.h" #ifndef SERVER_BUILT #define SERVER_BUILT "unknown" #endif #ifndef MOD_PERL_STRING_VERSION #define MOD_PERL_STRING_VERSION "mod_perl/x.xx" #endif #ifdef XS_IMPORT #include "Exports.c" static void export_cv(SV *pclass, SV *caller, char *sub) { GV *gv; #if 0 fprintf(stderr, "*%s::%s = \\&%s::%s\n", SvPVX(caller), sub, SvPVX(pclass), sub); #endif gv = gv_fetchpv(form("%_::%s", caller, sub), TRUE, SVt_PVCV); GvCV(gv) = perl_get_cv(form("%_::%s", pclass, sub), TRUE); GvIMPORTED_CV_on(gv); } static void my_import(SV *pclass, SV *caller, SV *sv) { char *sym = SvPV(sv,na), **tags; int i; switch (*sym) { case ':': ++sym; tags = export_tags(sym); for(i=0; tags[i]; i++) { export_cv(pclass, caller, tags[i]); } break; case '$': case '%': case '*': case '@': croak("\"%s\" is not exported by the Apache::Constants module", sym); case '&': ++sym; default: if(isALPHA(sym[0])) { export_cv(pclass, caller, sym); break; } else { croak("Can't export symbol: %s", sym); } } } #endif /*XS_IMPORT*/ /* prevent prototype mismatch warnings */ static void check_proto(HV *stash, char *name) { GV **gvp = (GV**)hv_fetch(stash, name, strlen(name), FALSE); CV *cv; if (!(gvp && *gvp && (cv = GvCVu(*gvp)))) { return; } if (CvROOT(cv)) { return; } if (!SvPOK(cv)) { sv_setsv((SV*)cv, &sv_no); } } #ifdef newCONSTSUB #define my_newCONSTSUB(stash, name, sv) \ check_proto(stash, name); \ newCONSTSUB(stash, name, sv) #else static void my_newCONSTSUB(HV *stash, char *name, SV *sv) { #ifdef dTHR dTHR; #endif I32 oldhints = hints; HV *old_cop_stash = curcop->cop_stash; HV *old_curstash = curstash; line_t oldline = curcop->cop_line; hints &= ~HINT_BLOCK_SCOPE; if(stash) { save_hptr(&curstash); save_hptr(&curcop->cop_stash); curstash = curcop->cop_stash = stash; } check_proto(stash, name); (void)newSUB(start_subparse(FALSE, 0), newSVOP(OP_CONST, 0, newSVpv(name,0)), newSVOP(OP_CONST, 0, &sv_no), newSTATEOP(0, Nullch, newSVOP(OP_CONST, 0, sv))); hints = oldhints; curcop->cop_stash = old_cop_stash; curstash = old_curstash; curcop->cop_line = oldline; } #endif static enum cmd_how autoload_args_how(char *name) { if (strEQ(name, "FLAG")) return FLAG; if (strEQ(name, "ITERATE")) return ITERATE; if (strEQ(name, "ITERATE2")) return ITERATE2; if (strEQ(name, "NO_ARGS")) return NO_ARGS; if (strEQ(name, "RAW_ARGS")) return RAW_ARGS; if (strEQ(name, "TAKE1")) return TAKE1; if (strEQ(name, "TAKE12")) return TAKE12; if (strEQ(name, "TAKE123")) return TAKE123; if (strEQ(name, "TAKE2")) return TAKE2; if (strEQ(name, "TAKE23")) return TAKE23; if (strEQ(name, "TAKE3")) return TAKE3; return (enum cmd_how) -1; } static double constant(char *name) { errno = 0; switch (*name) { case 'A': if (strEQ(name, "AUTH_REQUIRED")) #ifdef AUTH_REQUIRED return AUTH_REQUIRED; #else goto not_there; #endif if (strEQ(name, "ACCESS_CONF")) #ifdef ACCESS_CONF return ACCESS_CONF; #else goto not_there; #endif break; case 'B': if (strEQ(name, "BAD_GATEWAY")) #ifdef BAD_GATEWAY return BAD_GATEWAY; #else goto not_there; #endif if (strEQ(name, "BAD_REQUEST")) #ifdef BAD_REQUEST return BAD_REQUEST; #else goto not_there; #endif break; case 'C': if (strEQ(name, "CONTINUE")) return DECLINED; break; case 'D': if (strEQ(name, "DECLINED")) #ifdef DECLINED return DECLINED; #else goto not_there; #endif if (strEQ(name, "DOCUMENT_FOLLOWS")) #ifdef DOCUMENT_FOLLOWS return DOCUMENT_FOLLOWS; #else goto not_there; #endif if (strEQ(name, "DONE")) #ifdef DONE return DONE; #else return -2; #endif if (strEQ(name, "DYNAMIC_MODULE_LIMIT")) #ifdef DYNAMIC_MODULE_LIMIT return DYNAMIC_MODULE_LIMIT; #else goto not_there; #endif break; case 'E': break; case 'F': if (strEQ(name, "FORBIDDEN")) #ifdef FORBIDDEN return FORBIDDEN; #else goto not_there; #endif break; case 'G': break; case 'H': if (strEQ(name, "HTTP_ACCEPTED")) #ifdef HTTP_ACCEPTED return HTTP_ACCEPTED; #else goto not_there; #endif if (strEQ(name, "HTTP_BAD_GATEWAY")) #ifdef HTTP_BAD_GATEWAY return HTTP_BAD_GATEWAY; #else goto not_there; #endif if (strEQ(name, "HTTP_BAD_REQUEST")) #ifdef HTTP_BAD_REQUEST return HTTP_BAD_REQUEST; #else goto not_there; #endif if (strEQ(name, "HTTP_CONFLICT")) #ifdef HTTP_CONFLICT return HTTP_CONFLICT; #else goto not_there; #endif if (strEQ(name, "HTTP_CONTINUE")) #ifdef HTTP_CONTINUE return HTTP_CONTINUE; #else goto not_there; #endif if (strEQ(name, "HTTP_CREATED")) #ifdef HTTP_CREATED return HTTP_CREATED; #else goto not_there; #endif if (strEQ(name, "HTTP_FORBIDDEN")) #ifdef HTTP_FORBIDDEN return HTTP_FORBIDDEN; #else goto not_there; #endif if (strEQ(name, "HTTP_GATEWAY_TIME_OUT")) #ifdef HTTP_GATEWAY_TIME_OUT return HTTP_GATEWAY_TIME_OUT; #else goto not_there; #endif if (strEQ(name, "HTTP_GONE")) #ifdef HTTP_GONE return HTTP_GONE; #else goto not_there; #endif if (strEQ(name, "HTTP_INTERNAL_SERVER_ERROR")) #ifdef HTTP_INTERNAL_SERVER_ERROR return HTTP_INTERNAL_SERVER_ERROR; #else goto not_there; #endif if (strEQ(name, "HTTP_LENGTH_REQUIRED")) #ifdef HTTP_LENGTH_REQUIRED return HTTP_LENGTH_REQUIRED; #else goto not_there; #endif if (strEQ(name, "HTTP_METHOD_NOT_ALLOWED")) #ifdef HTTP_METHOD_NOT_ALLOWED return HTTP_METHOD_NOT_ALLOWED; #else goto not_there; #endif if (strEQ(name, "HTTP_MOVED_PERMANENTLY")) #ifdef HTTP_MOVED_PERMANENTLY return HTTP_MOVED_PERMANENTLY; #else goto not_there; #endif if (strEQ(name, "HTTP_MOVED_TEMPORARILY")) #ifdef HTTP_MOVED_TEMPORARILY return HTTP_MOVED_TEMPORARILY; #else goto not_there; #endif if (strEQ(name, "HTTP_MULTIPLE_CHOICES")) #ifdef HTTP_MULTIPLE_CHOICES return HTTP_MULTIPLE_CHOICES; #else goto not_there; #endif if (strEQ(name, "HTTP_NON_AUTHORITATIVE")) #ifdef HTTP_NON_AUTHORITATIVE return HTTP_NON_AUTHORITATIVE; #else goto not_there; #endif if (strEQ(name, "HTTP_NOT_ACCEPTABLE")) #ifdef HTTP_NOT_ACCEPTABLE return HTTP_NOT_ACCEPTABLE; #else goto not_there; #endif if (strEQ(name, "HTTP_NOT_FOUND")) #ifdef HTTP_NOT_FOUND return HTTP_NOT_FOUND; #else goto not_there; #endif if (strEQ(name, "HTTP_NOT_IMPLEMENTED")) #ifdef HTTP_NOT_IMPLEMENTED return HTTP_NOT_IMPLEMENTED; #else goto not_there; #endif if (strEQ(name, "HTTP_NOT_MODIFIED")) #ifdef HTTP_NOT_MODIFIED return HTTP_NOT_MODIFIED; #else goto not_there; #endif if (strEQ(name, "HTTP_NO_CONTENT")) #ifdef HTTP_NO_CONTENT return HTTP_NO_CONTENT; #else goto not_there; #endif if (strEQ(name, "HTTP_OK")) #ifdef HTTP_OK return HTTP_OK; #else goto not_there; #endif if (strEQ(name, "HTTP_PARTIAL_CONTENT")) #ifdef HTTP_PARTIAL_CONTENT return HTTP_PARTIAL_CONTENT; #else goto not_there; #endif if (strEQ(name, "HTTP_PAYMENT_REQUIRED")) #ifdef HTTP_PAYMENT_REQUIRED return HTTP_PAYMENT_REQUIRED; #else goto not_there; #endif if (strEQ(name, "HTTP_PRECONDITION_FAILED")) #ifdef HTTP_PRECONDITION_FAILED return HTTP_PRECONDITION_FAILED; #else goto not_there; #endif if (strEQ(name, "HTTP_PROXY_AUTHENTICATION_REQUIRED")) #ifdef HTTP_PROXY_AUTHENTICATION_REQUIRED return HTTP_PROXY_AUTHENTICATION_REQUIRED; #else goto not_there; #endif if (strEQ(name, "HTTP_REQUEST_ENTITY_TOO_LARGE")) #ifdef HTTP_REQUEST_ENTITY_TOO_LARGE return HTTP_REQUEST_ENTITY_TOO_LARGE; #else goto not_there; #endif if (strEQ(name, "HTTP_REQUEST_TIME_OUT")) #ifdef HTTP_REQUEST_TIME_OUT return HTTP_REQUEST_TIME_OUT; #else goto not_there; #endif if (strEQ(name, "HTTP_REQUEST_URI_TOO_LARGE")) #ifdef HTTP_REQUEST_URI_TOO_LARGE return HTTP_REQUEST_URI_TOO_LARGE; #else goto not_there; #endif if (strEQ(name, "HTTP_RESET_CONTENT")) #ifdef HTTP_RESET_CONTENT return HTTP_RESET_CONTENT; #else goto not_there; #endif if (strEQ(name, "HTTP_SEE_OTHER")) #ifdef HTTP_SEE_OTHER return HTTP_SEE_OTHER; #else goto not_there; #endif if (strEQ(name, "HTTP_SERVICE_UNAVAILABLE")) #ifdef HTTP_SERVICE_UNAVAILABLE return HTTP_SERVICE_UNAVAILABLE; #else goto not_there; #endif if (strEQ(name, "HTTP_SWITCHING_PROTOCOLS")) #ifdef HTTP_SWITCHING_PROTOCOLS return HTTP_SWITCHING_PROTOCOLS; #else goto not_there; #endif if (strEQ(name, "HTTP_UNAUTHORIZED")) #ifdef HTTP_UNAUTHORIZED return HTTP_UNAUTHORIZED; #else goto not_there; #endif if (strEQ(name, "HTTP_UNSUPPORTED_MEDIA_TYPE")) #ifdef HTTP_UNSUPPORTED_MEDIA_TYPE return HTTP_UNSUPPORTED_MEDIA_TYPE; #else goto not_there; #endif if (strEQ(name, "HTTP_USE_PROXY")) #ifdef HTTP_USE_PROXY return HTTP_USE_PROXY; #else goto not_there; #endif if (strEQ(name, "HTTP_VARIANT_ALSO_VARIES")) #ifdef HTTP_VARIANT_ALSO_VARIES return HTTP_VARIANT_ALSO_VARIES; #else goto not_there; #endif if (strEQ(name, "HTTP_VERSION_NOT_SUPPORTED")) #ifdef HTTP_VERSION_NOT_SUPPORTED return HTTP_VERSION_NOT_SUPPORTED; #else goto not_there; #endif if (strEQ(name, "HUGE_STRING_LEN")) #ifdef HUGE_STRING_LEN return HUGE_STRING_LEN; #else goto not_there; #endif break; case 'I': break; case 'J': break; case 'K': break; case 'L': break; case 'M': if (strEQ(name, "MAX_HEADERS")) #ifdef MAX_HEADERS return MAX_HEADERS; #else goto not_there; #endif if (strEQ(name, "MAX_STRING_LEN")) #ifdef MAX_STRING_LEN return MAX_STRING_LEN; #else goto not_there; #endif if (strEQ(name, "METHODS")) #ifdef METHODS return METHODS; #else goto not_there; #endif if (strEQ(name, "MOVED")) #ifdef MOVED return MOVED; #else goto not_there; #endif if (strEQ(name, "M_CONNECT")) #ifdef M_CONNECT return M_CONNECT; #else goto not_there; #endif if (strEQ(name, "MODULE_MAGIC_NUMBER")) #ifdef MODULE_MAGIC_NUMBER return MODULE_MAGIC_NUMBER; #else goto not_there; #endif if (strEQ(name, "M_DELETE")) #ifdef M_DELETE return M_DELETE; #else goto not_there; #endif if (strEQ(name, "M_GET")) #ifdef M_GET return M_GET; #else goto not_there; #endif if (strEQ(name, "M_INVALID")) #ifdef M_INVALID return M_INVALID; #else goto not_there; #endif if (strEQ(name, "M_OPTIONS")) #ifdef M_OPTIONS return M_OPTIONS; #else goto not_there; #endif if (strEQ(name, "M_POST")) #ifdef M_POST return M_POST; #else goto not_there; #endif if (strEQ(name, "M_PUT")) #ifdef M_PUT return M_PUT; #else goto not_there; #endif if (strEQ(name, "M_TRACE")) #ifdef M_TRACE return M_TRACE; #else goto not_there; #endif if (strEQ(name, "M_PATCH")) #ifdef M_PATCH return M_PATCH; #else goto not_there; #endif if (strEQ(name, "M_PROPFIND")) #ifdef M_PROPFIND return M_PROPFIND; #else goto not_there; #endif if (strEQ(name, "M_PROPPATCH")) #ifdef M_PROPPATCH return M_PROPPATCH; #else goto not_there; #endif if (strEQ(name, "M_MKCOL")) #ifdef M_MKCOL return M_MKCOL; #else goto not_there; #endif if (strEQ(name, "M_COPY")) #ifdef M_COPY return M_COPY; #else goto not_there; #endif if (strEQ(name, "M_MOVE")) #ifdef M_MOVE return M_MOVE; #else goto not_there; #endif if (strEQ(name, "M_LOCK")) #ifdef M_LOCK return M_LOCK; #else goto not_there; #endif if (strEQ(name, "M_UNLOCK")) #ifdef M_UNLOCK return M_UNLOCK; #else goto not_there; #endif break; case 'N': if (strEQ(name, "NOT_AUTHORITATIVE")) #ifdef NOT_AUTHORITATIVE return NOT_AUTHORITATIVE; #else return DECLINED; #endif if (strEQ(name, "NOT_FOUND")) #ifdef NOT_FOUND return NOT_FOUND; #else goto not_there; #endif if (strEQ(name, "NOT_IMPLEMENTED")) #ifdef NOT_IMPLEMENTED return NOT_IMPLEMENTED; #else goto not_there; #endif break; case 'O': if (strEQ(name, "OK")) #ifdef OK return OK; #else goto not_there; #endif if (strEQ(name, "OPT_ALL")) #ifdef OPT_ALL return OPT_ALL; #else goto not_there; #endif if (strEQ(name, "OPT_EXECCGI")) #ifdef OPT_EXECCGI return OPT_EXECCGI; #else goto not_there; #endif if (strEQ(name, "OPT_INCLUDES")) #ifdef OPT_INCLUDES return OPT_INCLUDES; #else goto not_there; #endif if (strEQ(name, "OPT_INCNOEXEC")) #ifdef OPT_INCNOEXEC return OPT_INCNOEXEC; #else goto not_there; #endif if (strEQ(name, "OPT_INDEXES")) #ifdef OPT_INDEXES return OPT_INDEXES; #else goto not_there; #endif if (strEQ(name, "OPT_MULTI")) #ifdef OPT_MULTI return OPT_MULTI; #else goto not_there; #endif if (strEQ(name, "OPT_NONE")) #ifdef OPT_NONE return OPT_NONE; #else goto not_there; #endif if (strEQ(name, "OPT_SYM_LINKS")) #ifdef OPT_SYM_LINKS return OPT_SYM_LINKS; #else goto not_there; #endif if (strEQ(name, "OPT_SYM_OWNER")) #ifdef OPT_SYM_OWNER return OPT_SYM_OWNER; #else goto not_there; #endif if (strEQ(name, "OPT_UNSET")) #ifdef OPT_UNSET return OPT_UNSET; #else goto not_there; #endif if (strEQ(name, "OR_NONE")) #ifdef OR_NONE return OR_NONE; #else goto not_there; #endif if (strEQ(name, "OR_LIMIT")) #ifdef OR_LIMIT return OR_LIMIT; #else goto not_there; #endif if (strEQ(name, "OR_OPTIONS")) #ifdef OR_OPTIONS return OR_OPTIONS; #else goto not_there; #endif if (strEQ(name, "OR_FILEINFO")) #ifdef OR_FILEINFO return OR_FILEINFO; #else goto not_there; #endif if (strEQ(name, "OR_AUTHCFG")) #ifdef OR_AUTHCFG return OR_AUTHCFG; #else goto not_there; #endif if (strEQ(name, "OR_INDEXES")) #ifdef OR_INDEXES return OR_INDEXES; #else goto not_there; #endif if (strEQ(name, "OR_UNSET")) #ifdef OR_UNSET return OR_UNSET; #else goto not_there; #endif if (strEQ(name, "OR_ALL")) #ifdef OR_ALL return OR_ALL; #else goto not_there; #endif break; case 'P': break; case 'Q': break; case 'R': if (strEQ(name, "REDIRECT")) #ifdef REDIRECT return REDIRECT; #else goto not_there; #endif if (strEQ(name, "RSRC_CONF")) #ifdef RSRC_CONF return RSRC_CONF; #else goto not_there; #endif if (strEQ(name, "REMOTE_HOST")) #ifdef REMOTE_HOST return REMOTE_HOST; #else goto not_there; #endif if (strEQ(name, "REMOTE_NAME")) #ifdef REMOTE_NAME return REMOTE_NAME; #else goto not_there; #endif if (strEQ(name, "REMOTE_NOLOOKUP")) #ifdef REMOTE_NOLOOKUP return REMOTE_NOLOOKUP; #else goto not_there; #endif if (strEQ(name, "REMOTE_DOUBLE_REV")) #ifdef REMOTE_DOUBLE_REV return REMOTE_DOUBLE_REV; #else goto not_there; #endif if (strEQ(name, "REQUEST_NO_BODY")) #ifdef REQUEST_NO_BODY return REQUEST_NO_BODY; #else goto not_there; #endif if (strEQ(name, "REQUEST_CHUNKED_ERROR")) #ifdef REQUEST_CHUNKED_ERROR return REQUEST_CHUNKED_ERROR; #else goto not_there; #endif if (strEQ(name, "REQUEST_CHUNKED_DECHUNK")) #ifdef REQUEST_CHUNKED_DECHUNK return REQUEST_CHUNKED_DECHUNK; #else goto not_there; #endif if (strEQ(name, "REQUEST_CHUNKED_PASS")) #ifdef REQUEST_CHUNKED_PASS return REQUEST_CHUNKED_PASS; #else goto not_there; #endif if (strEQ(name, "RESPONSE_CODES")) #ifdef RESPONSE_CODES return RESPONSE_CODES; #else goto not_there; #endif break; case 'S': if (strEQ(name, "SATISFY_ALL")) #ifdef SATISFY_ALL return SATISFY_ALL; #else goto not_there; #endif if (strEQ(name, "SATISFY_ANY")) #ifdef SATISFY_ANY return SATISFY_ANY; #else goto not_there; #endif if(strEQ(name, "SATISFY_NOSPEC")) #ifdef SATISFY_NOSPEC return SATISFY_NOSPEC; #else goto not_there; #endif if (strEQ(name, "SERVER_ERROR")) #ifdef SERVER_ERROR return SERVER_ERROR; #else goto not_there; #endif if (strEQ(name, "SERVICE_UNAVAILABLE")) #ifdef SERVICE_UNAVAILABLE return SERVICE_UNAVAILABLE; #else goto not_there; #endif case 'T': break; case 'U': if (strEQ(name, "USE_LOCAL_COPY")) #ifdef USE_LOCAL_COPY return USE_LOCAL_COPY; #else goto not_there; #endif break; case 'V': break; case 'W': break; case 'X': break; case 'Y': break; case 'Z': break; default: errno = EINVAL; return 0; } not_there: { enum cmd_how args_how = autoload_args_how(name); if(((int)args_how) > -1) return (double)args_how; } errno = ENOENT; return 0; } #define __PACKAGE__ "Apache::Constants" #define __PACKAGE_LEN__ 17 #define __AUTOLOAD__ "Apache::Constants::AUTOLOAD" /* this is kinda ugly, but wtf */ static void boot_ConstSubs(char *tag) { dTHR; HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, FALSE); I32 i; #ifdef XS_IMPORT char **export = export_tags(tag); for (i=0; export[i]; i++) { #define EXP_NAME export[i] #else HV *exp_tags = perl_get_hv("Apache::Constants::EXPORT_TAGS", TRUE); SV **avrv = hv_fetch(exp_tags, tag, strlen(tag), FALSE); AV *export; if(avrv) export = (AV*)SvRV(*avrv); else return; #define EXP_NAME SvPV(*av_fetch(export, i, 0),na) for(i=0; i<=AvFILL(export); i++) { #endif char *name = EXP_NAME; double val = constant(name); my_newCONSTSUB(stash, name, newSViv( (I32) val)); } } MODULE = Apache::Constants PACKAGE = Apache::Constants PROTOTYPES: DISABLE BOOT: items = items; #ifndef XS_IMPORT perl_require_module("Apache::Constants::Exports", NULL); #endif boot_ConstSubs("common"); #ifdef XS_IMPORT void import(pclass, ...) SV *pclass PREINIT: I32 i = 0; SV *caller = perl_eval_pv("scalar caller", TRUE); CODE: for(i=1; i= 19980413 RETVAL = ap_get_server_version(); #else RETVAL = SERVER_VERSION; #endif OUTPUT: RETVAL char * SERVER_BUILT() CODE: #if MODULE_MAGIC_NUMBER >= 19980413 RETVAL = (char *)ap_get_server_built(); #else RETVAL = SERVER_BUILT; #endif OUTPUT: RETVAL char * DECLINE_CMD() CODE: #ifdef DECLINE_CMD RETVAL = DECLINE_CMD; #else RETVAL = "\a\b"; #endif OUTPUT: RETVAL char * DIR_MAGIC_TYPE() CODE: RETVAL = DIR_MAGIC_TYPE; OUTPUT: RETVAL