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
13typedef 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
25typedef 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
39typedef 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
46typedef enum
47{
48 FD_FLAGS_NONE = 0,
49 FD_FLAGS_CLOEXEC = 1 << 0,
50} FDFlag;
51
52typedef 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
63typedef 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
80should_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