| #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<items; i++) { |
| my_import(pclass, caller, ST(i)); |
| } |
| |
| #endif |
| |
| void |
| __AUTOLOAD() |
| |
| PREINIT: |
| HV *stash = gv_stashpvn(__PACKAGE__, __PACKAGE_LEN__, FALSE); |
| SV *sv = GvSV(gv_fetchpv(__AUTOLOAD__, TRUE, SVt_PV)); |
| char *name = SvPV(sv,na); |
| int len = __PACKAGE_LEN__+2; |
| double val; |
| |
| CODE: |
| while(len--) ++name; |
| |
| val = constant(name); |
| if(errno != 0) |
| croak("Your vendor has not defined Apache::Constants macro `%s'", name); |
| else |
| my_newCONSTSUB(stash, name, newSViv( (I32) val)); |
| |
| const char * |
| SERVER_VERSION() |
| CODE: |
| #if MODULE_MAGIC_NUMBER >= 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 |