Apache-LogFile
view release on metacpan or search on metacpan
*
* 5. Redistributions of any form whatsoever must retain the following
* acknowledgment:
* "This product includes software developed by the Apache Group
* for use in the Apache HTTP server project (http://www.apache.org/)."
*
* THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Group and was originally based
* on public domain software written at the National Center for
* Supercomputing Applications, University of Illinois, Urbana-Champaign.
* For more information on the Apache Group and the Apache HTTP server
* project, please see <http://www.apache.org/>.
*
*/
/* $Id: LogFile.xs,v 1.1.1.1 1998/11/16 20:44:25 dougm Exp $ */
#include "modules/perl/mod_perl.h"
/* some stuff borrowed from mod_log_config.c */
static int xfer_flags = (O_WRONLY | O_APPEND | O_CREAT);
#if defined(__EMX__) || defined(WIN32)
/* OS/2 dosen't support users and groups */
static mode_t xfer_mode = (S_IREAD | S_IWRITE);
#else
static mode_t xfer_mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
#endif
typedef struct {
char *fname;
array_header *format;
int log_fd;
#ifdef BUFFERED_LOGS
int outcnt;
char outbuf[LOG_BUFSIZE];
#endif
} config_log_state;
typedef config_log_state *Apache__LogFile;
/* when the startup pool is cleared, delete the caller's file
* from %INC so the log is re-opened
*/
static void inc_delete(void *data)
{
SV *file = (SV*)data;
/*fprintf(stderr, "removing %s from INC\n", SvPV(file,na));*/
(void)hv_delete_ent(GvHV(incgv), file, G_DISCARD, FALSE);
SvREFCNT_dec(file);
}
static void mark_for_inc_delete(SV *file)
{
pool *p = perl_get_startup_pool();
if(!p) croak("can't get startup pool!");
register_cleanup(p, (void*)SvREFCNT_inc(file),
inc_delete, inc_delete);
}
MODULE = Apache::LogFile PACKAGE = Apache::LogFile
Apache::LogFile
_new(self, file)
SV *self
char *file
PREINIT:
pool *p = perl_get_startup_pool();
CODE:
if(!p) croak("can't get startup pool!");
RETVAL = (config_log_state *)palloc(p, sizeof(config_log_state));
RETVAL->fname = file;
if (*RETVAL->fname == '|') {
char *pname = server_root_relative(p, (RETVAL->fname+1));
piped_log *pl = open_piped_log(p, pname);
if(pl == NULL) croak("can't open piped log `%s'", pname);
RETVAL->log_fd = piped_log_write_fd(pl);
}
else {
char *fname = server_root_relative(p, RETVAL->fname);
if ((RETVAL->log_fd = popenf(p, fname, xfer_flags, xfer_mode)) < 0) {
fprintf(stderr, "Apache::LogFile: could not open log file %s.\n",
fname);
exit(1);
}
}
OUTPUT:
RETVAL
int
print(self, ...)
Apache::LogFile self
ALIAS:
Apache::LogFile::PRINT = 1
PREINIT:
int i;
STRLEN len;
char *str;
CODE:
for(i=1; i<items; i++) {
str = SvPV(ST(i),len);
RETVAL += write(self->log_fd, str, len);
}
if(*(SvEND(ST(i-1)) - 1) != '\n')
RETVAL += write(self->log_fd, "\n", 1);
OUTPUT:
RETVAL
void
mark_for_inc_delete(file)
SV *file
( run in 0.840 second using v1.01-cache-2.11-cpan-39bf76dae61 )