summaryrefslogtreecommitdiff
path: root/doio.c
diff options
context:
space:
mode:
authorNick Ing-Simmons <nik@tiuk.ti.com>2001-03-22 14:35:46 +0000
committerNick Ing-Simmons <nik@tiuk.ti.com>2001-03-22 14:35:46 +0000
commite620cd7232b242c1500abd8a6a5b86efdf1c5c2b (patch)
tree62b27a249ce39c519adcc3c671e456ae3c92178a /doio.c
parent1f852d0d1f9745d51afb4cb836d527bbbac0c64e (diff)
downloadperl-e620cd7232b242c1500abd8a6a5b86efdf1c5c2b.tar.gz
Give a meaning to '&' in n-arg open case:
open($fh,"<&",$scalar); $scalar can be: - an integer which does "fdopen" open($fh,"<&",2); # like open($fh,"<&2") - something that will yield a file handle via sv_2io() useful for dup'ing anonymous handles. e.g.: open(my $fh,"<&",\*STDIN); open(my $dup,"<&",$fh); p4raw-id: //depot/perlio@9298
Diffstat (limited to 'doio.c')
-rw-r--r--doio.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/doio.c b/doio.c
index 5a5b889f5d..a32604e6c9 100644
--- a/doio.c
+++ b/doio.c
@@ -283,29 +283,39 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
strcat(mode, "t");
if (*type == '&') {
- name = type;
duplicity:
dodup = 1;
- name++;
- if (*name == '=') {
+ type++;
+ if (*type == '=') {
dodup = 0;
- name++;
- }
- if (num_svs) {
- goto unknown_desr;
+ type++;
}
- if (!*name && supplied_fp)
+ if (!num_svs && !*type && supplied_fp)
/* "<+&" etc. is used by typemaps */
fp = supplied_fp;
else {
- /*SUPPRESS 530*/
- for (; isSPACE(*name); name++) ;
- if (isDIGIT(*name))
- fd = atoi(name);
+ if (num_svs > 1) {
+ Perl_croak(aTHX_ "More than one argument to '%c&' open",IoTYPE(io));
+ }
+ if (num_svs && SvIOK(*svp))
+ fd = SvUV(*svp);
+ else if (isDIGIT(*type)) {
+ /*SUPPRESS 530*/
+ for (; isSPACE(*type); type++) ;
+ fd = atoi(type);
+ }
else {
IO* thatio;
- gv = gv_fetchpv(name,FALSE,SVt_PVIO);
- thatio = GvIO(gv);
+ if (num_svs) {
+ thatio = sv_2io(*svp);
+ }
+ else {
+ GV *thatgv;
+ /*SUPPRESS 530*/
+ for (; isSPACE(*type); type++) ;
+ thatgv = gv_fetchpv(type,FALSE,SVt_PVIO);
+ thatio = GvIO(thatgv);
+ }
if (!thatio) {
#ifdef EINVAL
SETERRNO(EINVAL,SS$_IVCHAN);
@@ -387,7 +397,6 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
strcat(mode, "t");
if (*type == '&') {
- name = type;
goto duplicity;
}
if (*type == IoTYPE_STD && (!type[1] || isSPACE(type[1]) || type[1] == ':')) {
@@ -431,8 +440,7 @@ Perl_do_openn(pTHX_ GV *gv, register char *name, I32 len, int as_raw,
if (num_svs > 1) {
fp = PerlProc_popen_list(mode,num_svs,svp);
}
- else
- {
+ else {
fp = PerlProc_popen(name,mode);
}
IoTYPE(io) = IoTYPE_PIPE;