blob: cfab2961037906bbe3f10de2ce324e7e3607b982 [file] [log] [blame]
#include "mod_perl.h"
#define ap_fopen(r, name, mode) \
ap_pfopen(r->pool, name, mode)
#define ap_fclose(r, fd) \
ap_pfclose(r->pool, fd)
#define ap_mtime(r) r->mtime
#ifndef SvCLASS
#define SvCLASS(o) HvNAME(SvSTASH(SvRV(o)))
#endif
static bool ApacheFile_open(SV *obj, SV *sv)
{
PerlIO *IOp = Nullfp;
GV *gv = (GV*)SvRV(obj);
STRLEN len;
char *filename = SvPV(sv,len);
return do_open(gv, filename, len, FALSE, 0, 0, IOp);
}
static SV *ApacheFile_new(char *pclass)
{
SV *RETVAL = sv_newmortal();
GV *gv = newGVgen(pclass);
HV *stash = GvSTASH(gv);
sv_setsv(RETVAL, sv_bless(sv_2mortal(newRV((SV*)gv)), stash));
(void)hv_delete(stash, GvNAME(gv), GvNAMELEN(gv), G_DISCARD);
return RETVAL;
}
#if 0
static char *ApacheFile_basename(SV *self, const char *filename)
{
char *RETVAL = strrchr(filename, '/');
++RETVAL;
return RETVAL;
}
static SV *ApacheFile_dirname(SV *self, const char *filename)
{
SV *RETVAL = newSVpv(ap_make_dirstr_parent(perl_get_util_pool(), filename), 0);
*(SvEND(RETVAL) - 1) = '\0';
--SvCUR(RETVAL);
return RETVAL;
}
typedef struct {
SV *base;
SV *ext;
} AFparsed;
AFparsed *ApacheFile_parse(SV *fname, SV *pattern)
{
AFparsed *afp = (AFparsed *)safemalloc(sizeof(AFparsed));
regexp *re;
PMOP pm;
STRLEN len;
STRLEN slen;
char *s = SvPV(pattern,len), *ptr = SvPV(fname,slen);
Zero(&pm,1,PMOP);
re = Perl_pregcomp(s, s+len, &pm);
Perl_pregexec(re, ptr, ptr+slen, ptr, 0, Nullsv, 1);
if (re->endp[1]) {
afp->ext = sv_newmortal();
afp->base = sv_newmortal();
sv_setpvn(afp->ext, re->startp[1], re->endp[1] - re->startp[1]);
sv_setpvn(afp->base, ptr, slen - SvCUR(afp->ext));
}
else {
afp->ext = &sv_undef;
afp->base = sv_2mortal(newSVsv(fname));
}
Perl_pregfree(re);
return afp;
}
#endif
MODULE = Apache::File PACKAGE = Apache::File PREFIX = ApacheFile_
PROTOTYPES: DISABLE
BOOT:
items = items; /*avoid warning*/
void
ApacheFile_new(pclass, filename=Nullsv)
char *pclass
SV *filename
PREINIT:
SV *RETVAL;
PPCODE:
RETVAL = ApacheFile_new(pclass);
if(filename) {
if(!ApacheFile_open(RETVAL, filename))
XSRETURN_UNDEF;
}
XPUSHs(RETVAL);
bool
ApacheFile_open(self, filename)
SV *self
SV *filename
#if 0
void
ApacheFile_tmp(self)
SV *self
PREINIT:
PerlIO *fp = PerlIO_tmpfile();
char *pclass = SvROK(self) ? SvCLASS(self) : SvPV(self,na);
SV *RETVAL = ApacheFile_new(pclass);
PPCODE:
if(!do_open((GV*)SvRV(RETVAL), "+>&", 3, FALSE, 0, 0, fp))
XSRETURN_UNDEF;
else
XPUSHs(RETVAL);
#endif
bool
ApacheFile_close(self)
SV *self
CODE:
RETVAL = do_close((GV*)SvRV(self), TRUE);
OUTPUT:
RETVAL
#if 0
SV *
ApacheFile_dirname(self, filename)
SV *self
const char *filename
char *
ApacheFile_basename(self, filename)
SV *self
const char *filename
void
parse(self, filename, pattern)
SV *self
SV *filename
SV *pattern
PREINIT:
SV *name, *path, *base, *par = newSVpv("",0);
AFparsed *afp;
PPCODE:
path = ApacheFile_dirname(self, SvPVX(filename));
sv_2mortal(path);
base = newSVpv(ApacheFile_basename(self, SvPVX(filename)),0);
sv_setpvf(par, "%c%_%c", '(', pattern, ')');
afp = ApacheFile_parse(base, par);
EXTEND(sp, 3); PUSHs(afp->base); PUSHs(path); PUSHs(afp->ext);
safefree(afp); SvREFCNT_dec(base); SvREFCNT_dec(par);
#endif
MODULE = Apache::File PACKAGE = Apache PREFIX = ap_
PROTOTYPES: DISABLE
int
ap_set_content_length(r, clength=r->finfo.st_size)
Apache r
long clength
void
ap_set_last_modified(r, mtime=0)
Apache r
time_t mtime
CODE:
if(mtime) ap_update_mtime(r, mtime);
ap_set_last_modified(r);
void
ap_set_etag(r)
Apache r
int
ap_meets_conditions(r)
Apache r
time_t
ap_update_mtime(r, dependency_mtime=r->finfo.st_mtime)
Apache r
time_t dependency_mtime
time_t
ap_mtime(r)
Apache r
int
ap_discard_request_body(r)
Apache r
int
ap_set_byterange(r)
Apache r
void
ap_each_byterange(r)
Apache r
PREINIT:
long offset, length;
PPCODE:
if (!ap_each_byterange(r, &offset, &length)) {
XSRETURN_EMPTY;
}
EXTEND(sp, 2);
PUSHs(sv_2mortal(newSViv(offset)));
PUSHs(sv_2mortal(newSViv(length)));