File-Redirect
view release on metacpan or search on metacpan
Redirect.xs view on Meta::CPAN
redirected.Close(aTHX_ f);
if ( ret == 0 )
return 0;
errno = ret;
return -1;
}
static PerlIO*
PerlIOredirect_open(pTHX_ PerlIO_funcs *tab,
PerlIO_list_t *layers, IV n, const char *mode,
int fd, int imode, int perm,
PerlIO *f, int narg, SV **args) {
SV * handle;
PerlIO * proxy;
dSP;
if ( fd != -1 || narg != 1)
goto UNIX_OPEN;
if ( !is_path_redirected_sv(args[0]))
goto UNIX_OPEN;
ENTER;
SAVETMPS;
PUSHMARK( sp);
XPUSHs( newSVsv( args[0]));
XPUSHs( newSVpv( mode, PL_na ));
PUTBACK;
perl_call_pv("File::Redirect::Open", G_SCALAR);
SPAGAIN;
handle = newSVsv(POPs);
PUTBACK;
FREETMPS;
LEAVE;
if (SvROK(handle)) {
IO * io;
PerlIO * proxy = IoIFP(sv_2io(handle)), *p;
redirected = *(PerlIOBase(proxy)-> tab);
mapped = *(PerlIOBase(proxy)-> tab);
mapped.Close = PerlIOredirect_close;
PerlIOBase(proxy)-> tab = &mapped;
return proxy;
} else {
errno = SvIV(handle);
return NULL;
}
UNIX_OPEN:
return unix.Open(aTHX_ tab, layers, n, mode, fd, imode, perm, f, narg, args);
}
// #define PerlLIO_chmod(file, mode) \
// (*PL_LIO->pChmod)(PL_LIO, (file), (mode))
// #define PerlLIO_chown(file, owner, group) \
// (*PL_LIO->pChown)(PL_LIO, (file), (owner), (group))
// #define PerlLIO_link(oldname, newname) \
// (*PL_LIO->pLink)(PL_LIO, (oldname), (newname))
// #define PerlLIO_lstat(name, buf) \
// (*PL_LIO->pLstat)(PL_LIO, (name), (buf))
// #define PerlLIO_rename(oname, newname) \
// (*PL_LIO->pRename)(PL_LIO, (oname), (newname))
// #define PerlLIO_unlink(file) \
// (*PL_LIO->pUnlink)(PL_LIO, (file))
// #define PerlLIO_utime(file, time) \
// (*PL_LIO->pUtime)(PL_LIO, (file), (time))
// #define PerlDir_mkdir(name, mode) \
// (*PL_Dir->pMakedir)(PL_Dir, (name), (mode))
// #define PerlDir_chdir(name) \
// (*PL_Dir->pChdir)(PL_Dir, (name))
// #define PerlDir_rmdir(name) \
// (*PL_Dir->pRmdir)(PL_Dir, (name))
// #define PerlDir_close(dir) \
// (*PL_Dir->pClose)(PL_Dir, (dir))
// #define PerlDir_open(name) \
// (*PL_Dir->pOpen)(PL_Dir, (name))
// #define PerlDir_read(dir) \
// (*PL_Dir->pRead)(PL_Dir, (dir))
// #define PerlDir_rewind(dir) \
// (*PL_Dir->pRewind)(PL_Dir, (dir))
// #define PerlDir_seek(dir, loc) \
// (*PL_Dir->pSeek)(PL_Dir, (dir), (loc))
// #define PerlDir_tell(dir) \
// (*PL_Dir->pTell)(PL_Dir, (dir))
// #ifdef WIN32
// #define PerlDir_mapA(dir) \
// (*PL_Dir->pMapPathA)(PL_Dir, (dir))
// #define PerlDir_mapW(dir) \
// (*PL_Dir->pMapPathW)(PL_Dir, (dir))
// #endif
MODULE = File::Redirect PACKAGE = File::Redirect
BOOT:
{
int ok = 1;
PerlIO_funcs *old = PL_known_layers-> array[0]. funcs;
if ( strcmp(old-> name, "unix") != 0) {
warn("this perl is incompatible with redirect: IO layer 'unix' is not found");
ok = 0;
}
unix = *old;
old_lio = *PL_LIO;
old_dir = *PL_Dir;
if ( ok) {
old-> Open = PerlIOredirect_open;
PL_LIO-> pNameStat = new_stat;
}
}
UV
( run in 2.301 seconds using v1.01-cache-2.11-cpan-71847e10f99 )