Apache2-ModLogConfig

 view release on metacpan or  search on metacpan

ModLogConfig.xs  view on Meta::CPAN

      struct writer_pair *w;

      apr_pool_userdata_get((void**)&w, PPROC_KEY, pproc);
      if( w ) {
	old_writer_init=w->wi;
	old_writer=w->w;
	W("found userdata: %p %p / %p %p",
	  old_writer_init, old_writer, writer_init, writer);
      } else {
	old_writer_init=set_writer_init(writer_init);
	old_writer=set_writer(writer);

	w=apr_palloc(pproc, sizeof(*w));
	w->wi=old_writer_init;
	w->w=old_writer;
	apr_pool_userdata_set(w, PPROC_KEY, apr_pool_cleanup_null, pproc);
	W("set up userdata: %p %p / %p %p",
	  old_writer_init, old_writer, writer_init, writer);
      }
    } else {
      old_writer_init=set_writer_init(writer_init);
      old_writer=set_writer(writer);

      if(old_writer_init==writer_init) croak("buggy");
    }
  }

# else	/* AP_VER < 2002017 */

  old_writer_init=set_writer_init(writer_init);
  old_writer=set_writer(writer);

  if(old_writer_init==writer_init) croak("buggy");

# endif

  return OK;
}

static void
boot_me_up(void)
{
  apr_pool_t *pconf=modperl_global_get_pconf();
  APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_register;

  log_register=APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler);
  if( !log_register ) croak("mod_log_config not loaded");

  log_register(pconf, HND_KEY, log_perl, 0);

  ap_hook_open_logs(openlogs, NULL, NULL, APR_HOOK_REALLY_FIRST);
}

MODULE = Apache2::ModLogConfig	PACKAGE = Apache2::ServerRec

PROTOTYPES: DISABLE

void
custom_logs(s)
  Apache2::ServerRec s
  PPCODE:
  {
    apr_pool_t *pconf=modperl_global_get_pconf();
    apr_hash_t *hash;

    apr_pool_userdata_get((void**)&hash, PPROC_KEY, pconf);
    if( hash ) {
      hash=apr_hash_get(hash, &s, sizeof(s));
      if( hash ) {
	apr_pool_t *p;
	apr_hash_index_t *hi;

	apr_pool_create(&p, pconf);
	for( hi=apr_hash_first(p, hash); hi; hi=apr_hash_next(hi) ) {
	  const char *k;
	  apr_ssize_t klen;
	  void *val;
	  apr_hash_this(hi, (const void**)&k, &klen, &val);
	  mXPUSHs(newSVpv(k, klen));
	}
	apr_pool_destroy(p);
      }
    }
  }

void
custom_log_by_name(s, name)
  Apache2::ServerRec s
  SV* name
  PPCODE:
  {
    apr_pool_t *pconf=modperl_global_get_pconf();
    apr_hash_t *hash;

    apr_pool_userdata_get((void**)&hash, PPROC_KEY, pconf);
    if( hash ) {
      hash=apr_hash_get(hash, &s, sizeof(s));
      if( hash ) {
	STRLEN len;
	char *str=SvPV(name, len);
	Apache2__CustomLog log=apr_hash_get(hash, str, len);
	if( log ) {
	  mXPUSHs(modperl_ptr2obj(aTHX_ "Apache2::CustomLog", log));
	}
      }
    }
  }

MODULE = Apache2::ModLogConfig	PACKAGE = Apache2::CustomLog

void
print(log, r, ...)
  Apache2::CustomLog log
  Apache2::RequestRec r
  PPCODE:
  if(items>2) {
    apr_pool_t *p;
    const char **strs;
    int *strl;
    int i;
    apr_size_t len=0;
    apr_status_t rv;

    apr_pool_create(&p, r->pool);
    strs=apr_palloc(p, (items-2)*sizeof(*strs));
    strl=apr_palloc(p, (items-2)*sizeof(*strl));
    for( i=2; i<items; i++ ) {
      STRLEN l;
      strs[i-2]=SvPV(ST(i), l);
      strl[i-2]=l;
      len+=strl[i-2];
    }
    rv=writer(r, log, strs, strl, items-2, len);
    apr_pool_destroy(p);
    mXPUSHi(rv);
  }

BOOT:
  boot_me_up();

## Local Variables: ##
## mode: c ##
## End: ##



( run in 0.665 second using v1.01-cache-2.11-cpan-71847e10f99 )