@@ -128,10 +128,15 @@ var SyscallsLibrary = {
128
128
}
129
129
return 0 ;
130
130
} ,
131
- doDup: function ( path , flags , suggestFD ) {
131
+ doDup: function ( stream , suggestFD ) {
132
132
var suggest = FS . getStream ( suggestFD ) ;
133
133
if ( suggest ) FS . close ( suggest ) ;
134
- return FS . open ( path , flags , 0 , suggestFD , suggestFD ) . fd ;
134
+
135
+ var newStream = FS . duplicateStream ( stream ) ;
136
+ newStream . fd = suggestFD ;
137
+
138
+ FS . streams [ suggestFD ] = newStream ;
139
+ return suggestFD ;
135
140
} ,
136
141
doReadv : function ( stream , iov , iovcnt , offset ) {
137
142
var ret = 0 ;
@@ -366,7 +371,7 @@ var SyscallsLibrary = {
366
371
} ,
367
372
__syscall41 : function ( which , varargs ) { // dup
368
373
var old = SYSCALLS . getStreamFromFD ( ) ;
369
- return FS . open ( old . path , old . flags , 0 ) . fd ;
374
+ return SYSCALLS . doDup ( old , FS . nextfd ( ) ) ;
370
375
} ,
371
376
__syscall42__deps : [ '$PIPEFS' ] ,
372
377
__syscall42 : function ( which , varargs ) { // pipe
@@ -459,7 +464,7 @@ var SyscallsLibrary = {
459
464
__syscall63 : function ( which , varargs ) { // dup2
460
465
var old = SYSCALLS . getStreamFromFD ( ) , suggestFD = SYSCALLS . get ( ) ;
461
466
if ( old . fd === suggestFD ) return suggestFD ;
462
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
467
+ return SYSCALLS . doDup ( old , suggestFD ) ;
463
468
} ,
464
469
__syscall64__deps : [ '$PROCINFO' ] ,
465
470
__syscall64 : function ( which , varargs ) { // getppid
@@ -1074,14 +1079,14 @@ var SyscallsLibrary = {
1074
1079
#else
1075
1080
var stream = SYSCALLS . getStreamFromFD ( ) , cmd = SYSCALLS . get ( ) ;
1076
1081
switch ( cmd ) {
1082
+ // TODO: FreeBSD also defines F_DUP2FD and F_DUP2FD_CLOEXEC
1083
+ case { { { cDefine ( 'F_DUPFD_CLOEXEC' ) } } } : // ignore O_CLOEXEC in single process environment
1077
1084
case { { { cDefine ( 'F_DUPFD' ) } } } : {
1078
1085
var arg = SYSCALLS . get ( ) ;
1079
1086
if ( arg < 0 ) {
1080
1087
return - { { { cDefine ( 'EINVAL' ) } } } ;
1081
1088
}
1082
- var newStream ;
1083
- newStream = FS . open ( stream . path , stream . flags , 0 , arg ) ;
1084
- return newStream . fd ;
1089
+ return SYSCALLS . doDup ( stream , FS . nextfd ( arg ) ) ;
1085
1090
}
1086
1091
case { { { cDefine ( 'F_GETFD' ) } } } :
1087
1092
case { { { cDefine ( 'F_SETFD' ) } } } :
@@ -1308,8 +1313,13 @@ var SyscallsLibrary = {
1308
1313
#if ASSERTIONS
1309
1314
assert ( ! flags ) ;
1310
1315
#endif
1311
- if ( old . fd === suggestFD ) return - { { { cDefine ( 'EINVAL' ) } } } ;
1312
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
1316
+ if ( old . fd === suggestFD ) return - ERRNO_CODES . EINVAL ;
1317
+
1318
+ // intentionally ignore flags, since O_CLOEXEC make no sense in
1319
+ // singleprocess environment
1320
+ if ( flags & ~ { { { cDefine ( 'O_CLOEXEC' ) } } } ) return - ERRNO_CODES . EINVAL ;
1321
+
1322
+ return SYSCALLS . doDup ( old , suggestFD ) ;
1313
1323
} ,
1314
1324
__syscall331 : function ( which , varargs ) { // pipe2
1315
1325
return - { { { cDefine ( 'ENOSYS' ) } } } ; // unsupported feature
0 commit comments