code wiki / _hdl_build / nx_descriptor_candidate_t188.nx
nx_descriptor_candidate_t188.nx source
↩ module page · 25 lines · 1056 B
1import "nx_syscalls.nx"
2// Ordinary permission bits only. Special privilege bits are never copied by staging.
3const NX_FILE_PERMISSION_MASK:i64=511
4const NX_FILE_DESCRIPTOR_INVALID:i64=0-22
5func sys_fchmod_fd(fd:i64,mode:i64)->i64{
6 if fd<0 || mode<0 || mode>NX_FILE_PERMISSION_MASK {return NX_FILE_DESCRIPTOR_INVALID}
7 return __syscall(52,fd,mode,0,0,0,0)
8}
9// Portable descriptor syscall; consumers below use the x86-64 stat ABI layout.
10const NX_STAT_X64_BYTES:i64=144
11const NX_STAT_X64_MODE_OFFSET:i64=24
12const NX_STAT_X64_BLOCK_OFFSET:i64=56
13const NX_STAT_X64_SIZE_OFFSET:i64=48
14const NX_STAT_X64_DEVICE_OFFSET:i64=0
15const NX_STAT_X64_INODE_OFFSET:i64=8
16const NX_STAT_TYPE_MASK:i64=61440
17const NX_STAT_REGULAR_FILE:i64=32768
18func sys_fstat_fd(fd:i64,stat:*u8)->i64{
19 if fd<0 || (stat as i64)==0{return NX_FILE_DESCRIPTOR_INVALID}
20 return __syscall(80,fd,stat,0,0,0,0)
21}
22func sys_stat_permissions(stat:*u8)->i64{
23 let mode:i64=(stat[NX_STAT_X64_MODE_OFFSET] as i64)+((stat[NX_STAT_X64_MODE_OFFSET+1] as i64)<<8)
24 return mode & NX_FILE_PERMISSION_MASK
25}