Val _lib7_P_ProcEnv_times (Task* task, Val arg) { //===================== // // Mythryl type: Void -> (Int, Int, Int, Int, Int) // // Return process and child process times, in clock ticks. // // This fn gets bound as times' in: // // src/lib/std/src/posix-1003.1b/posix-id.pkg ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_P_ProcEnv_times"); Val e; Val u, s; Val cu, cs; struct tms ts; RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_P_ProcEnv_times", NULL ); // clock_t t = times( &ts ); // RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_P_ProcEnv_times" ); if (t == -1) return RAISE_SYSERR__MAY_HEAPCLEAN(task, -1, NULL); e = make_one_word_int(task, t ); u = make_one_word_int(task, ts.tms_utime ); s = make_one_word_int(task, ts.tms_stime ); cu = make_one_word_int(task, ts.tms_cutime); cs = make_one_word_int(task, ts.tms_cstime); return make_five_slot_record(task, e, u, s, cu, cs ); }
Val _lib7_P_SysDB_getpwnam (Task* task, Val arg) { //====================== // // _lib7_P_SysDB_getpwnam : String -> (String, word, word, String, String) // // Get password file entry by name. // // This fn gets bound as getpwnam' in: // // src/lib/std/src/posix-1003.1b/posix-etc.pkg ENTER_MYTHRYL_CALLABLE_C_FN("_lib7_P_SysDB_getpwnam"); struct passwd* info; // 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 name_buf; // { char* heap_name = HEAP_STRING_AS_C_STRING( arg ); char* c_name = buffer_mythryl_heap_value( &name_buf, (void*) heap_name, strlen( heap_name ) +1 ); // '+1' for terminal NUL on string. RELEASE_MYTHRYL_HEAP( task->pthread, "_lib7_P_SysDB_getpwnam", NULL ); // info = getpwnam( c_name ); // RECOVER_MYTHRYL_HEAP( task->pthread, "_lib7_P_SysDB_getpwnam" ); unbuffer_mythryl_heap_value( &name_buf ); } if (info == NULL) return RAISE_SYSERR__MAY_HEAPCLEAN(task, -1, NULL); Val pw_name = make_ascii_string_from_c_string__may_heapclean( task, info->pw_name, NULL ); Roots roots1 = { &pw_name, NULL }; Val pw_uid = make_one_word_unt( task, (Vunt) (info->pw_uid) ); Roots roots2 = { &pw_uid, &roots1 }; Val pw_gid = make_one_word_unt( task, (Vunt) (info->pw_gid) ); Roots roots3 = { &pw_gid, &roots2 }; Val pw_dir = make_ascii_string_from_c_string__may_heapclean( task, info->pw_dir, &roots3 ); Roots roots4 = { &pw_dir, &roots3 }; Val pw_shell = make_ascii_string_from_c_string__may_heapclean( task, info->pw_shell, &roots4 ); return make_five_slot_record(task, pw_name, pw_uid, pw_gid, pw_dir, pw_shell ); }
Val _lib7_P_IO_fcntl_l (Task* task, Val arg) { //================== // // Mythryl type: (Int, Int, Flock_Rep) -> Flock_Rep // Flock_Rep = (Int, Int, Offset, Offset, Int) // // Handle record locking. // // This fn gets bound as fcntl_l in: // // src/lib/std/src/psx/posix-io.pkg ENTER_MYTHRYL_CALLABLE_C_FN(__func__); int fd = GET_TUPLE_SLOT_AS_INT( arg, 0 ); int cmd = GET_TUPLE_SLOT_AS_INT( arg, 1 ); Val flock_rep = GET_TUPLE_SLOT_AS_VAL( arg, 2 ); struct flock flock; int status; flock.l_type = GET_TUPLE_SLOT_AS_INT( flock_rep, 0 ); flock.l_whence = GET_TUPLE_SLOT_AS_INT( flock_rep, 1 ); flock.l_start = GET_TUPLE_SLOT_AS_INT( flock_rep, 2 ); flock.l_len = GET_TUPLE_SLOT_AS_INT( flock_rep, 3 ); do { // RELEASE_MYTHRYL_HEAP( task->hostthread, __func__, NULL ); // status = fcntl(fd, cmd, &flock); // RECOVER_MYTHRYL_HEAP( task->hostthread, __func__ ); // } while (status < 0 && errno == EINTR); // Restart if interrupted by a SIGALRM or SIGCHLD or whatever. if (status < 0) return RAISE_SYSERR__MAY_HEAPCLEAN(task, status, NULL); Val result = make_five_slot_record( task, // TAGGED_INT_FROM_C_INT( flock.l_type ), TAGGED_INT_FROM_C_INT( flock.l_whence ), TAGGED_INT_FROM_C_INT( flock.l_start ), TAGGED_INT_FROM_C_INT( flock.l_len ), TAGGED_INT_FROM_C_INT( flock.l_pid ) ); EXIT_MYTHRYL_CALLABLE_C_FN(__func__); return result; }