| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | #pragma once |
| 4 | |
| 5 | #include <abi-bits/fcntl.h> |
| 6 | #include <mos/mm/mm_types.h> |
| 7 | #include <mos/mos_global.h> |
| 8 | #include <mos/types.h> |
| 9 | |
| 10 | #define PATH_DELIM '/' |
| 11 | #define PATH_DELIM_STR "/" |
| 12 | |
| 13 | typedef enum |
| 14 | { |
| 15 | FILE_TYPE_REGULAR, |
| 16 | FILE_TYPE_DIRECTORY, |
| 17 | FILE_TYPE_SYMLINK, |
| 18 | FILE_TYPE_CHAR_DEVICE, |
| 19 | FILE_TYPE_BLOCK_DEVICE, |
| 20 | FILE_TYPE_NAMED_PIPE, |
| 21 | FILE_TYPE_SOCKET, |
| 22 | FILE_TYPE_UNKNOWN, |
| 23 | } file_type_t; |
| 24 | |
| 25 | typedef enum |
| 26 | { |
| 27 | OPEN_NONE = MEM_PERM_NONE, // 0 |
| 28 | OPEN_READ = MEM_PERM_READ, // 1 << 0 |
| 29 | OPEN_WRITE = MEM_PERM_WRITE, // 1 << 1 |
| 30 | OPEN_EXECUTE = MEM_PERM_EXEC, // 1 << 2 |
| 31 | OPEN_NO_FOLLOW = 1 << 3, |
| 32 | OPEN_CREATE = 1 << 4, |
| 33 | OPEN_TRUNCATE = 1 << 5, |
| 34 | OPEN_DIR = 1 << 6, |
| 35 | OPEN_APPEND = 1 << 7, |
| 36 | OPEN_EXCLUSIVE = 1 << 8, |
| 37 | } open_flags; |
| 38 | |
| 39 | typedef enum |
| 40 | { |
| 41 | FSTATAT_NONE = 0, |
| 42 | FSTATAT_NOFOLLOW = 1 << 1, // lstat, operates on the link itself |
| 43 | FSTATAT_FILE = 1 << 2, // the fd is a file, not a directory |
| 44 | } fstatat_flags; |
| 45 | |
| 46 | typedef enum |
| 47 | { |
| 48 | FD_FLAGS_NONE = 0, |
| 49 | FD_FLAGS_CLOEXEC = 1 << 0, |
| 50 | } FDFlag; |
| 51 | |
| 52 | typedef u16 file_perm_t; |
| 53 | |
| 54 | #define PERM_OWNER 0x1C0 // 111 000 000 |
| 55 | #define PERM_GROUP 0x38 // 000 111 000 |
| 56 | #define PERM_OTHER 0x7 // 000 000 111 |
| 57 | #define PERM_READ 0x124 // 100 100 100 |
| 58 | #define PERM_WRITE 0x92 // 010 010 010 |
| 59 | #define PERM_EXEC 0x49 // 001 001 001 |
| 60 | |
| 61 | #define PERM_MASK 0777 |
| 62 | |
| 63 | typedef struct |
| 64 | { |
| 65 | u64 ino; |
| 66 | file_type_t type; |
| 67 | file_perm_t perm; |
| 68 | size_t size; |
| 69 | uid_t uid; |
| 70 | gid_t gid; |
| 71 | bool sticky; |
| 72 | bool suid; |
| 73 | bool sgid; |
| 74 | ssize_t nlinks; |
| 75 | u64 accessed; |
| 76 | u64 created; |
| 77 | u64 modified; |
| 78 | } file_stat_t; |
| 79 | |
| 80 | should_inline void file_format_perm(file_perm_t perms, char buf[10]) |
| 81 | { |
| 82 | buf[0] = perms & (PERM_READ & PERM_OWNER) ? 'r' : '-'; |
| 83 | buf[1] = perms & (PERM_WRITE & PERM_OWNER) ? 'w' : '-'; |
| 84 | buf[2] = perms & (PERM_EXEC & PERM_OWNER) ? 'x' : '-'; |
| 85 | |
| 86 | buf[3] = perms & (PERM_READ & PERM_GROUP) ? 'r' : '-'; |
| 87 | buf[4] = perms & (PERM_WRITE & PERM_GROUP) ? 'w' : '-'; |
| 88 | buf[5] = perms & (PERM_EXEC & PERM_GROUP) ? 'x' : '-'; |
| 89 | |
| 90 | buf[6] = perms & (PERM_READ & PERM_OTHER) ? 'r' : '-'; |
| 91 | buf[7] = perms & (PERM_WRITE & PERM_OTHER) ? 'w' : '-'; |
| 92 | buf[8] = perms & (PERM_EXEC & PERM_OTHER) ? 'x' : '-'; |
| 93 | buf[9] = '\0'; |
| 94 | } |
| 95 | |