| |
| #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))); |