PerlIO *
PerlIO_openn(pTHX_ const char *layers, const char *mode, int fd,
int imode, int perm, PerlIO *old, int narg, SV **args)
{
if (narg) {
if (narg > 1) {
Perl_croak(aTHX_ "More than one argument to open");
}
if (*args == &PL_sv_undef)
return PerlIO_tmpfile();
else {
char *name = SvPV_nolen(*args);
if (*mode == IoTYPE_NUMERIC) {
fd = PerlLIO_open3(name, imode, perm);
if (fd >= 0)
return PerlIO_fdopen(fd, (char *) mode + 1);
}
else if (old) {
return PerlIO_reopen(name, mode, old);
}
else {
return PerlIO_open(name, mode);
}
}
}
else {
return PerlIO_fdopen(fd, (char *) mode);
}
return NULL;
}
####
...
if ((*type == IoTYPE_RDWR) && /* scary */
(*(type+1) == IoTYPE_RDONLY || *(type+1) == IoTYPE_WRONLY) &&
((!num_svs || (tend > type+1 && tend[-1] != IoTYPE_PIPE)))) {
TAINT_PROPER("open");
mode[1] = *type++;
writing = 1;
}
####
else if (*type == IoTYPE_RDONLY) {
/*SUPPRESS 530*/
for (type++; isSPACE(*type); type++) ;
mode[0] = 'r';
#ifdef HAS_STRLCAT
if (in_raw)
strlcat(mode, "b", PERL_MODE_MAX);
else if (in_crlf)
strlcat(mode, "t", PERL_MODE_MAX);
#else
if (in_raw)
strcat(mode, "b");
else if (in_crlf)
strcat(mode, "t");
#endif
if (*type == '&') {
goto duplicity;
}
if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) {
####
...
else {
if (!num_svs) {
namesv = sv_2mortal(newSVpvn(type,strlen(type)));
num_svs = 1;
svp = &namesv;
type = Nullch;
}
fp = PerlIO_openn(aTHX_ type,mode,-1,0,0,NULL,num_svs,svp);
}
####
if (!fp && type && *type && *type != ':' && !isIDFIRST(*type))
goto unknown_open_mode;
}