Val _lib7_P_FileSys_fchown (Task* task, Val arg) { //====================== // // Mythryl type: (Int, Unt, Unt) -> Void // fd uid gid // // Change owner and group of file given a file descriptor for it. // // This fn gets bound as fchown' in: // // src/lib/std/src/psx/posix-file.pkg // src/lib/std/src/psx/posix-file-system-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN(__func__); int fd = GET_TUPLE_SLOT_AS_INT( arg, 0); uid_t uid = TUPLE_GETWORD( arg, 1); gid_t gid = TUPLE_GETWORD( arg, 2); RELEASE_MYTHRYL_HEAP( task->hostthread, __func__, NULL ); // int status = fchown (fd, uid, gid); // RECOVER_MYTHRYL_HEAP( task->hostthread, __func__ ); Val result = RETURN_VOID_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN(task, status, NULL); EXIT_MYTHRYL_CALLABLE_C_FN(__func__); return result; }
Val _lib7_P_FileSys_chown (Task* task, Val arg) { //===================== // // Mythryl type: (String, Unt, Unt) -> Void // name uid gid // // Change owner and group of file given its name. // // This fn gets bound as chown' in: // // src/lib/std/src/psx/posix-file.pkg // src/lib/std/src/psx/posix-file-system-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN(__func__); int status; Val path = GET_TUPLE_SLOT_AS_VAL( arg, 0); uid_t uid = TUPLE_GETWORD( arg, 1); gid_t gid = TUPLE_GETWORD( arg, 2); char* heap_path= HEAP_STRING_AS_C_STRING(path); // We cannot reference anything on the Mythryl // heap between RELEASE_MYTHRYL_HEAP and RECOVER_MYTHRYL_HEAP // because garbage collection might be moving // it around, so copy heap_path into C storage: // Mythryl_Heap_Value_Buffer path_buf; // { char* c_path = buffer_mythryl_heap_value( &path_buf, (void*) path, strlen( heap_path ) +1 ); // '+1' for terminal NUL on string. RELEASE_MYTHRYL_HEAP( task->hostthread, __func__, NULL ); // status = chown (c_path, uid, gid); // RECOVER_MYTHRYL_HEAP( task->hostthread, __func__ ); // unbuffer_mythryl_heap_value( &path_buf ); } Val result = RETURN_VOID_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN(task, status, NULL); EXIT_MYTHRYL_CALLABLE_C_FN(__func__); return result; }
Val _lib7_P_FileSys_openf (Task* task, Val arg) { //===================== // // Mythryl type: (String, Unt, Unt) -> int // name flags mode // // Open a file and return the file descriptor. // // This fn gets bound as openf' in: // // src/lib/std/src/posix-1003.1b/posix-file.pkg // src/lib/std/src/posix-1003.1b/posix-file-system-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_P_FileSys_openf"); Val path = GET_TUPLE_SLOT_AS_VAL( arg, 0); int flags = TUPLE_GETWORD( arg, 1); int mode = TUPLE_GETWORD( arg, 2); int fd; char* heap_path = HEAP_STRING_AS_C_STRING( path ); // We cannot reference anything on the Mythryl // heap between RELEASE_MYTHRYL_HEAP and RECOVER_MYTHRYL_HEAP // because garbage collection might be moving // it around, so copy heap_path into C storage: // Mythryl_Heap_Value_Buffer path_buf; // { char* c_path = buffer_mythryl_heap_value( &path_buf, (void*) heap_path, strlen( heap_path ) +1 ); // '+1' for terminal NUL on string. /* do { */ // Backed out 2010-02-26 CrT: See discussion at bottom of src/c/lib/socket/connect.c RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_P_FileSys_openf", NULL ); // fd = open( c_path, flags, mode ); // RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_P_FileSys_openf" ); /* } while (fd < 0 && errno == EINTR); */ // Restart if interrupted by a SIGALRM or SIGCHLD or whatever. unbuffer_mythryl_heap_value( &path_buf ); } RETURN_STATUS_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN( task, fd, NULL ); }
Val _lib7_P_IO_fcntl_sfd (Task* task, Val arg) { //==================== // // Mythryl type: (Int, Unt) -> Void // // Set the close-on-exec flag associated with the file descriptor. // // This fn gets bound as fcntl_sfd in: // // src/lib/std/src/posix-1003.1b/posix-io.pkg // src/lib/std/src/posix-1003.1b/posix-io-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_P_IO_fcntl_sfd"); int status; int fd0 = GET_TUPLE_SLOT_AS_INT( arg, 0 ); Vunt flag = TUPLE_GETWORD( arg, 1 ); /* do { */ // Backed out 2010-02-26 CrT: See discussion at bottom of src/c/lib/socket/connect.c RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_P_IO_fcntl_sfd", NULL ); // status = fcntl(fd0, F_SETFD, flag); // RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_P_IO_fcntl_sfd" ); /* } while (status < 0 && errno == EINTR); */ // Restart if interrupted by a SIGALRM or SIGCHLD or whatever. RETURN_VOID_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN(task, status, NULL); }
Val _lib7_P_FileSys_fchmod (Task* task, Val arg) { //====================== // // Mythryl type: (Fd, Unt) -> Void // fd mode // // Change mode of file. // // This fn gets bound as fchmod' in: // // src/lib/std/src/psx/posix-file.pkg // src/lib/std/src/psx/posix-file-system-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN(__func__); int fd = GET_TUPLE_SLOT_AS_INT( arg, 0); mode_t mode = TUPLE_GETWORD( arg, 1); RELEASE_MYTHRYL_HEAP( task->hostthread, __func__, NULL ); // int status = fchmod (fd, mode); // RECOVER_MYTHRYL_HEAP( task->hostthread, __func__ ); Val result = RETURN_VOID_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN(task, status, NULL); EXIT_MYTHRYL_CALLABLE_C_FN(__func__); return result; }
Val _lib7_P_Process_waitpid (Task* task, Val arg) { //======================= // // Mythryl type: (Int, Unt) -> (Int, Int, Int) // // Wait for child processes to stop or terminate. // // This fn gets bound as waitpid' in: // // src/lib/std/src/posix-1003.1b/posix-process.pkg int status; int how; int val; int pid; /* do { */ // Backed out 2010-02-26 CrT: See discussion at bottom of src/c/lib/socket/connect.c pid = waitpid(GET_TUPLE_SLOT_AS_INT(arg, 0), &status, TUPLE_GETWORD(arg, 1)); /* } while (pid < 0 && errno == EINTR); */ // Restart if interrupted by a SIGALRM or SIGCHLD or whatever. if (pid < 0) return RAISE_SYSERR(task, pid); if (WIFEXITED(status)) { // how = 0; val = WEXITSTATUS(status); } else if (WIFSIGNALED(status)) { how = 1; val = WTERMSIG(status); } else if (WIFSTOPPED(status)) { how = 2; val = WSTOPSIG(status); } else { return RAISE_ERROR(task, "unknown child status"); } Val result; REC_ALLOC3(task, result, TAGGED_INT_FROM_C_INT(pid), TAGGED_INT_FROM_C_INT(how), TAGGED_INT_FROM_C_INT(val)); return result; }
Val _lib7_netdb_get_network_by_address (Task* task, Val arg) { //================================== // // Mythryl type: (Sysword, Address_Family) -> Null_Or( (String, List(String), Address_Family, Sysword) ) // // This fn gets bound as get_network_by_address' in: // // src/lib/std/src/socket/net-db.pkg #if defined(OPSYS_WIN32) // XXX BUGGO FIXME: getnetbyaddr() does not seem to exist under Windows. What is the equivalent? return RAISE_ERROR(task, "<getnetbyaddr not implemented>"); #else unsigned long net = TUPLE_GETWORD(arg, 0); int type = GET_TUPLE_SLOT_AS_INT( arg, 1); // return _util_NetDB_mknetent (task, getnetbyaddr(net, type)); #endif }
Val _lib7_P_FileSys_mkfifo (Task* task, Val arg) { //====================== // // Mythryl type: (String, Unt) -> Void // name mode // // Make a FIFO special file. // // This fn gets bound as make_pipe' in: // // src/lib/std/src/posix-1003.1b/posix-file.pkg // // This fn gets bound as make_fifo' in: // // src/lib/std/src/posix-1003.1b/posix-file-system-64.pkg ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_P_FileSys_mkfifo"); int status; Val path = GET_TUPLE_SLOT_AS_VAL( arg, 0); mode_t mode = TUPLE_GETWORD( arg, 1); // char* heap_path = HEAP_STRING_AS_C_STRING( path ); // Mythryl_Heap_Value_Buffer path_buf; // { char* c_path = buffer_mythryl_heap_value( &path_buf, (void*) heap_path, strlen( heap_path ) +1 ); // '+1' for terminal NUL on string. RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_P_FileSys_mkfifo", NULL ); // status = mkfifo (c_path, mode); // RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_P_FileSys_mkfifo" ); unbuffer_mythryl_heap_value( &path_buf ); } RETURN_VOID_EXCEPT_RAISE_SYSERR_ON_NEGATIVE_STATUS__MAY_HEAPCLEAN(task, status, NULL); }