@@ -137,10 +137,13 @@ var SyscallsLibrary = {
137
137
}
138
138
return 0 ;
139
139
} ,
140
- doDup: function ( path , flags , suggestFD ) {
141
- var suggest = FS . getStream ( suggestFD ) ;
142
- if ( suggest ) FS . close ( suggest ) ;
143
- return FS . open ( path , flags , 0 , suggestFD , suggestFD ) . fd ;
140
+ doDup: function ( stream , minFD , maxFD ) {
141
+ if ( stream . path . startsWith ( "pipe[" ) ) {
142
+ // A pipe
143
+ stream . node . pipe . refcnt ++ ;
144
+ return FS . createStream ( stream , minFD , maxFD ) . fd ;
145
+ }
146
+ return FS . open ( stream . path , stream . flags , 0 , minFD , maxFD ) . fd ;
144
147
} ,
145
148
doReadv : function ( stream , iov , iovcnt , offset ) {
146
149
var ret = 0 ;
@@ -374,7 +377,7 @@ var SyscallsLibrary = {
374
377
} ,
375
378
__sys_dup : function ( fd ) {
376
379
var old = SYSCALLS . getStreamFromFD ( fd ) ;
377
- return FS . open ( old . path , old . flags , 0 ) . fd ;
380
+ return SYSCALLS . doDup ( old ) ;
378
381
} ,
379
382
__sys_pipe__deps : [ '$PIPEFS' ] ,
380
383
__sys_pipe : function ( fdPtr ) {
@@ -461,7 +464,8 @@ var SyscallsLibrary = {
461
464
__sys_dup2 : function ( oldfd , suggestFD ) {
462
465
var old = SYSCALLS . getStreamFromFD ( oldfd ) ;
463
466
if ( old . fd === suggestFD ) return suggestFD ;
464
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
467
+ FS . closeStream ( suggestFD ) ;
468
+ return SYSCALLS . doDup ( old , suggestFD , suggestFD ) ;
465
469
} ,
466
470
__sys_getppid__nothrow : true ,
467
471
__sys_getppid__proxy : false ,
@@ -1107,9 +1111,7 @@ var SyscallsLibrary = {
1107
1111
if ( arg < 0 ) {
1108
1112
return - { { { cDefine ( 'EINVAL' ) } } } ;
1109
1113
}
1110
- var newStream ;
1111
- newStream = FS . open ( stream . path , stream . flags , 0 , arg ) ;
1112
- return newStream . fd ;
1114
+ return SYSCALLS . doDup ( stream , arg ) ;
1113
1115
}
1114
1116
case { { { cDefine ( 'F_GETFD' ) } } } :
1115
1117
case { { { cDefine ( 'F_SETFD' ) } } } :
@@ -1329,7 +1331,8 @@ var SyscallsLibrary = {
1329
1331
assert ( ! flags ) ;
1330
1332
#endif
1331
1333
if ( old . fd === suggestFD ) return - { { { cDefine ( 'EINVAL' ) } } } ;
1332
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
1334
+ FS . closeStream ( suggestFD ) ;
1335
+ return SYSCALLS . doDup ( old , suggestFD , suggestFD ) ;
1333
1336
} ,
1334
1337
1335
1338
__sys_prlimit64 : function ( pid , resource , new_limit , old_limit ) {
0 commit comments