#ifndef MODPERL_UTIL_H
#define MODPERL_UTIL_H
#include "modperl_common_util.h"
#define MP_CHECK_WBUCKET_INIT(func) \
if
(!rcfg->wbucket) { \
Perl_croak(aTHX_
"%s: "
func
" can't be called "
\
"before the response phase"
, MP_FUNC); \
}
#define MP_CGI_HEADER_PARSER_OFF(rcfg) \
MpReqPARSE_HEADERS_Off(rcfg); \
if
(rcfg->wbucket) { \
rcfg->wbucket->header_parse = 0; \
}
MP_INLINE server_rec *modperl_sv2server_rec(pTHX_ SV *sv);
MP_INLINE request_rec *modperl_sv2request_rec(pTHX_ SV *sv);
request_rec *modperl_xs_sv2request_rec(pTHX_ SV *sv,
char
*classname, CV *cv);
MP_INLINE SV *modperl_newSVsv_obj(pTHX_ SV *stashsv, SV *obj);
MP_INLINE SV *modperl_ptr2obj(pTHX_
char
*classname,
void
*ptr);
int
modperl_errsv(pTHX_
int
status, request_rec *r, server_rec *s);
void
modperl_errsv_prepend(pTHX_
const
char
*pat, ...);
int
modperl_require_module(pTHX_
const
char
*pv,
int
logfailure);
int
modperl_require_file(pTHX_
const
char
*pv,
int
logfailure);
void
modperl_xs_dl_handles_clear(pTHX);
void
**modperl_xs_dl_handles_get(pTHX);
void
modperl_xs_dl_handles_close(
void
**handles);
modperl_cleanup_data_t *modperl_cleanup_data_new(apr_pool_t *p,
void
*data);
MP_INLINE
void
modperl_perl_av_push_elts_ref(pTHX_ AV *dst, AV *src);
HE *modperl_perl_hv_fetch_he(pTHX_ HV *hv,
register
char
*key,
register
I32 klen,
register
U32 hash);
#define hv_fetch_he(hv,k,l,h) \
modperl_perl_hv_fetch_he(aTHX_ hv, k, l, h)
void
modperl_str_toupper(
char
*str);
void
modperl_perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg);
void
modperl_perl_call_list(pTHX_ AV *subs,
const
char
*name);
void
modperl_perl_exit(pTHX_
int
status);
MP_INLINE SV *modperl_dir_config(pTHX_ request_rec *r, server_rec *s,
char
*key, SV *sv_val);
SV *modperl_table_get_set(pTHX_ apr_table_t *table,
char
*key,
SV *sv_val,
int
do_taint);
MP_INLINE
int
modperl_perl_module_loaded(pTHX_
const
char
*name);
SV *modperl_slurp_filename(pTHX_ request_rec *r,
int
tainted);
char
*modperl_file2package(apr_pool_t *p,
const
char
*file);
SV *modperl_apr_array_header2avrv(pTHX_ apr_array_header_t *array);
apr_array_header_t *modperl_avrv2apr_array_header(pTHX_ apr_pool_t *p,
SV *avrv);
void
modperl_package_unload(pTHX_
const
char
*package);
#if defined(MP_TRACE) && defined(APR_HAS_THREADS)
#define MP_TRACEf_TID "/tid 0x%lx"
#define MP_TRACEv_TID (unsigned long)apr_os_thread_current()
#define MP_TRACEv_TID_ MP_TRACEv_TID,
#define MP_TRACEv__TID ,MP_TRACEv_TID
#else
#define MP_TRACEf_TID
#define MP_TRACEv_TID
#define MP_TRACEv_TID_
#define MP_TRACEv__TID
#endif /* APR_HAS_THREADS */
#if defined(MP_TRACE) && defined(USE_ITHREADS)
#define MP_TRACEf_PERLID "/perl id 0x%lx"
#define MP_TRACEv_PERLID (unsigned long)my_perl
#define MP_TRACEv_PERLID_ MP_TRACEv_PERLID,
#define MP_TRACEv__PERLID ,MP_TRACEv_PERLID
#else
#define MP_TRACEf_PERLID
#define MP_TRACEv_PERLID
#define MP_TRACEv_PERLID_
#define MP_TRACEv__PERLID
#endif /* USE_ITHREADS */
#define MP_TRACE_STR_LEN 35
#define MP_TRACE_STR_TRUNC(p, str, count) \
count < MP_TRACE_STR_LEN \
? (
char
*)apr_pstrmemdup(p, str, count) \
: (
char
*)apr_psprintf(p,
"%s..."
, \
apr_pstrmemdup(p, str, MP_TRACE_STR_LEN))
void
modperl_restart_count_inc(server_rec *base_server);
int
modperl_restart_count(
void
);
#endif /* MODPERL_UTIL_H */