@@ -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
@@ -1076,14 +1081,14 @@ var SyscallsLibrary = {
1076
1081
#else
1077
1082
var stream = SYSCALLS . getStreamFromFD ( ) , cmd = SYSCALLS . get ( ) ;
1078
1083
switch ( cmd ) {
1084
+ // TODO: FreeBSD also defines F_DUP2FD and F_DUP2FD_CLOEXEC
1085
+ case { { { cDefine ( 'F_DUPFD_CLOEXEC' ) } } } : // ignore O_CLOEXEC in single process environment
1079
1086
case { { { cDefine ( 'F_DUPFD' ) } } } : {
1080
1087
var arg = SYSCALLS . get ( ) ;
1081
1088
if ( arg < 0 ) {
1082
1089
return - { { { cDefine ( 'EINVAL' ) } } } ;
1083
1090
}
1084
- var newStream ;
1085
- newStream = FS . open ( stream . path , stream . flags , 0 , arg ) ;
1086
- return newStream . fd ;
1091
+ return SYSCALLS . doDup ( stream , FS . nextfd ( arg ) ) ;
1087
1092
}
1088
1093
case { { { cDefine ( 'F_GETFD' ) } } } :
1089
1094
case { { { cDefine ( 'F_SETFD' ) } } } :
@@ -1310,8 +1315,13 @@ var SyscallsLibrary = {
1310
1315
#if ASSERTIONS
1311
1316
assert ( ! flags ) ;
1312
1317
#endif
1313
- if ( old . fd === suggestFD ) return - { { { cDefine ( 'EINVAL' ) } } } ;
1314
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
1318
+ if ( old . fd === suggestFD ) return - ERRNO_CODES . EINVAL ;
1319
+
1320
+ // intentionally ignore flags, since O_CLOEXEC make no sense in
1321
+ // singleprocess environment
1322
+ if ( flags & ~ { { { cDefine ( 'O_CLOEXEC' ) } } } ) return - ERRNO_CODES . EINVAL ;
1323
+
1324
+ return SYSCALLS . doDup ( old , suggestFD ) ;
1315
1325
} ,
1316
1326
__syscall331 : function ( which , varargs ) { // pipe2
1317
1327
return - { { { cDefine ( 'ENOSYS' ) } } } ; // unsupported feature
0 commit comments