diff options
| author | jason <jkercher43@gmail.com> | 2024-07-23 17:50:30 -0400 |
|---|---|---|
| committer | jason <jkercher43@gmail.com> | 2024-07-23 17:50:30 -0400 |
| commit | 82deaa59ad7de52c381c8abc62cd895b76c9d96c (patch) | |
| tree | 25994c168768f266824ac944ca0ad53c8f5c0873 | |
| parent | 3c7d1f35db3ea8586c5b920fbdd1978a90c76bc7 (diff) | |
os2 linux: fix order of operations bug in _open; fix process_info routine
| -rw-r--r-- | core/os/os2/file_linux.odin | 2 | ||||
| -rw-r--r-- | core/os/os2/process_linux.odin | 49 |
2 files changed, 25 insertions, 26 deletions
diff --git a/core/os/os2/file_linux.odin b/core/os/os2/file_linux.odin index 9c7c3ac62..bf1b44c19 100644 --- a/core/os/os2/file_linux.odin +++ b/core/os/os2/file_linux.odin @@ -85,7 +85,7 @@ _open :: proc(name: string, flags: File_Flags, perm: int) -> (f: ^File, err: Err // terminal would be incredibly rare. This has no effect on files while // allowing us to open serial devices. sys_flags: linux.Open_Flags = {.NOCTTY, .CLOEXEC} - switch flags & O_RDONLY|O_WRONLY|O_RDWR { + switch flags & (O_RDONLY|O_WRONLY|O_RDWR) { case O_RDONLY: case O_WRONLY: sys_flags += {.WRONLY} case O_RDWR: sys_flags += {.RDWR} diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin index 371ae952c..50024b2b3 100644 --- a/core/os/os2/process_linux.odin +++ b/core/os/os2/process_linux.odin @@ -120,7 +120,7 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator s: linux.Stat linux.fstat(proc_fd, &s) - passwd_bytes := read_entire_file("/etc/passwd", temp_allocator()) or_return + passwd_bytes := _read_entire_pseudo_file_cstring("/etc/passwd", temp_allocator()) or_return passwd := string(passwd_bytes) for len(passwd) > 0 { n := strings.index_byte(passwd, ':') @@ -128,13 +128,12 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator break } username := passwd[:n] - passwd = passwd[:n+1] + passwd = passwd[n+1:] // skip password field - passwd = passwd[:strings.index_byte(passwd, ':') + 1] + passwd = passwd[strings.index_byte(passwd, ':') + 1:] n = strings.index_byte(passwd, ':') - username = passwd if uid, ok := strconv.parse_int(passwd[:n]); ok && uid == int(s.uid) { info.username = strings.clone(username, allocator) break @@ -148,14 +147,9 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator } } - if .Executable_Path in selection { - _ = fmt.bprintf(path_slice, "/proc/%d/exe", pid) - info.executable_path = _read_link_cstr(path_cstr, allocator) or_return - } - if .Working_Dir in selection { _ = fmt.bprintf(path_slice, "/proc/%d/cwd", pid) - info.working_dir = _read_link_cstr(path_cstr, allocator) or_return + info.working_dir, _ = _read_link_cstr(path_cstr, allocator) // allowed to fail } stat_if: if selection & {.PPid, .Priority} != {} { @@ -172,7 +166,7 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator stats = stats[strings.index_byte(stats, ' ') + 1:] if .PPid in selection { - ppid_str := stats[:strings.index_byte(stats, ' ')] + ppid_str := stats[strings.index_byte(stats, ' '):] if ppid, ok := strconv.parse_int(ppid_str); ok { info.ppid = ppid } @@ -183,15 +177,15 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator for i := 4; i < 19; i += 1 { stats = stats[strings.index_byte(stats, ' ') + 1:] } - nice_str := stats[:strings.index_byte(stats, ' ')] + nice_str := stats[strings.index_byte(stats, ' '):] if nice, ok := strconv.parse_int(nice_str); ok { info.priority = nice } } } - cmdline_if: if selection & {.Command_Line, .Command_Args} != {} { - _ = fmt.bprintf(path_slice, "/proc/%d/cmdline") + cmdline_if: if selection & {.Command_Line, .Command_Args, .Executable_Path} != {} { + _ = fmt.bprintf(path_slice, "/proc/%d/cmdline", pid) cmdline_bytes := _read_entire_pseudo_file(path_cstr, temp_allocator()) or_return if len(cmdline_bytes) == 0 { break cmdline_if @@ -199,6 +193,9 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator cmdline := string(cmdline_bytes) terminator := strings.index_byte(cmdline, 0) + if .Executable_Path in selection { + info.executable_path = strings.clone(cmdline[:terminator], allocator) + } if .Command_Line in selection { info.command_line = strings.clone(cmdline[:terminator], allocator) } @@ -219,17 +216,19 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator if .Environment in selection { _ = fmt.bprintf(path_slice, "/proc/%d/environ", pid) - env_bytes := _read_entire_pseudo_file(path_cstr, temp_allocator()) or_return - env := string(env_bytes) - - env_list := make([dynamic]string, allocator) - for len(env) > 0 { - terminator := strings.index_byte(env, 0) - if terminator == -1 || terminator == 0 { - break + if env_bytes, env_err := _read_entire_pseudo_file(path_cstr, temp_allocator()); env_err == nil { + env := string(env_bytes) + + env_list := make([dynamic]string, allocator) + for len(env) > 0 { + terminator := strings.index_byte(env, 0) + if terminator == -1 || terminator == 0 { + break + } + append(&env_list, strings.clone(env[:terminator], allocator)) + env = env[terminator + 1:] } - append(&env_list, strings.clone(env[:terminator], allocator)) - env = env[:terminator + 1] + info.environment = env_list[:] } } @@ -326,7 +325,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { cargs[i] = temp_cstring(desc.command[i]) or_return } - // Use current process's environment if descibutes not provided + // Use current process's environment if description not provided env: [^]cstring if desc.env == nil { // take this process's current environment |