@@ -128,10 +128,12 @@ 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
+ FS . streams [ suggestFD ] = stream ;
136
+ return suggestFD ;
135
137
} ,
136
138
doReadv : function ( stream , iov , iovcnt , offset ) {
137
139
var ret = 0 ;
@@ -375,7 +377,7 @@ var SyscallsLibrary = {
375
377
} ,
376
378
__syscall41 : function ( which , varargs ) { // dup
377
379
var old = SYSCALLS . getStreamFromFD ( ) ;
378
- return FS . open ( old . path , old . flags , 0 ) . fd ;
380
+ return SYSCALLS . doDup ( old , FS . nextfd ( ) ) ;
379
381
} ,
380
382
__syscall42__deps : [ '$PIPEFS' ] ,
381
383
__syscall42 : function ( which , varargs ) { // pipe
@@ -468,7 +470,7 @@ var SyscallsLibrary = {
468
470
__syscall63 : function ( which , varargs ) { // dup2
469
471
var old = SYSCALLS . getStreamFromFD ( ) , suggestFD = SYSCALLS . get ( ) ;
470
472
if ( old . fd === suggestFD ) return suggestFD ;
471
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
473
+ return SYSCALLS . doDup ( old , suggestFD ) ;
472
474
} ,
473
475
__syscall64__deps : [ '$PROCINFO' ] ,
474
476
__syscall64 : function ( which , varargs ) { // getppid
@@ -666,7 +668,7 @@ var SyscallsLibrary = {
666
668
for ( var i = 0 ; i < num ; i ++ ) {
667
669
var iovbase = { { { makeGetValue ( 'iov' , '(' + C_STRUCTS . iovec . __size__ + ' * i) + ' + C_STRUCTS . iovec . iov_base , 'i8*' ) } } } ;
668
670
var iovlen = { { { makeGetValue ( 'iov' , '(' + C_STRUCTS . iovec . __size__ + ' * i) + ' + C_STRUCTS . iovec . iov_len , 'i32' ) } } } ;
669
- for ( var j = 0 ; j < iovlen ; j ++ ) {
671
+ for ( var j = 0 ; j < iovlen ; j ++ ) {
670
672
view [ offset ++ ] = { { { makeGetValue ( 'iovbase' , 'j' , 'i8' ) } } } ;
671
673
}
672
674
}
@@ -852,7 +854,7 @@ var SyscallsLibrary = {
852
854
#endif
853
855
854
856
var total = 0 ;
855
-
857
+
856
858
var srcReadLow = ( readfds ? { { { makeGetValue ( 'readfds' , 0 , 'i32' ) } } } : 0 ) ,
857
859
srcReadHigh = ( readfds ? { { { makeGetValue ( 'readfds' , 4 , 'i32' ) } } } : 0 ) ;
858
860
var srcWriteLow = ( writefds ? { { { makeGetValue ( 'writefds' , 0 , 'i32' ) } } } : 0 ) ,
@@ -919,7 +921,7 @@ var SyscallsLibrary = {
919
921
{ { { makeSetValue ( 'exceptfds' , '0' , 'dstExceptLow' , 'i32' ) } } } ;
920
922
{ { { makeSetValue ( 'exceptfds' , '4' , 'dstExceptHigh' , 'i32' ) } } } ;
921
923
}
922
-
924
+
923
925
return total ;
924
926
} ,
925
927
__syscall144 : function ( which , varargs ) { // msync
@@ -1184,14 +1186,14 @@ var SyscallsLibrary = {
1184
1186
#else
1185
1187
var stream = SYSCALLS . getStreamFromFD ( ) , cmd = SYSCALLS . get ( ) ;
1186
1188
switch ( cmd ) {
1189
+ // TODO: FreeBSD also defines F_DUP2FD and F_DUP2FD_CLOEXEC
1190
+ case { { { cDefine ( 'F_DUPFD_CLOEXEC' ) } } } : // ignore O_CLOEXEC in single process environment
1187
1191
case { { { cDefine ( 'F_DUPFD' ) } } } : {
1188
1192
var arg = SYSCALLS . get ( ) ;
1189
1193
if ( arg < 0 ) {
1190
1194
return - { { { cDefine ( 'EINVAL' ) } } } ;
1191
1195
}
1192
- var newStream ;
1193
- newStream = FS . open ( stream . path , stream . flags , 0 , arg ) ;
1194
- return newStream . fd ;
1196
+ return SYSCALLS . doDup ( stream , FS . nextfd ( arg ) ) ;
1195
1197
}
1196
1198
case { { { cDefine ( 'F_GETFD' ) } } } :
1197
1199
case { { { cDefine ( 'F_SETFD' ) } } } :
@@ -1400,7 +1402,7 @@ var SyscallsLibrary = {
1400
1402
nanoseconds = { { { makeGetValue ( 'times' , C_STRUCTS . timespec . tv_nsec , 'i32' ) } } } ;
1401
1403
var mtime = ( seconds * 1000 ) + ( nanoseconds / ( 1000 * 1000 ) ) ;
1402
1404
FS . utime ( path , atime , mtime ) ;
1403
- return 0 ;
1405
+ return 0 ;
1404
1406
} ,
1405
1407
__syscall324 : function ( which , varargs ) { // fallocate
1406
1408
var stream = SYSCALLS . getStreamFromFD ( ) , mode = SYSCALLS . get ( ) , offset = SYSCALLS . get64 ( ) , len = SYSCALLS . get64 ( ) ;
@@ -1418,8 +1420,13 @@ var SyscallsLibrary = {
1418
1420
#if ASSERTIONS
1419
1421
assert ( ! flags ) ;
1420
1422
#endif
1421
- if ( old . fd === suggestFD ) return - { { { cDefine ( 'EINVAL' ) } } } ;
1422
- return SYSCALLS . doDup ( old . path , old . flags , suggestFD ) ;
1423
+ if ( old . fd === suggestFD ) return - ERRNO_CODES . EINVAL ;
1424
+
1425
+ // intentionally ignore flags, since O_CLOEXEC make no sense in
1426
+ // singleprocess environment
1427
+ if ( flags & ~ { { { cDefine ( 'O_CLOEXEC' ) } } } ) return - ERRNO_CODES . EINVAL ;
1428
+
1429
+ return SYSCALLS . doDup ( old , suggestFD ) ;
1423
1430
} ,
1424
1431
__syscall331 : function ( which , varargs ) { // pipe2
1425
1432
return - { { { cDefine ( 'ENOSYS' ) } } } ; // unsupported feature
0 commit comments