aboutsummaryrefslogtreecommitdiff
path: root/core/sys/haiku/find_directory.odin
blob: c700bd53bd42b3157f8a1b1a1fcedd4fc5d48b3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#+build haiku
package sys_haiku

import "base:intrinsics"

foreign import libroot "system:c"

directory_which :: enum i32 {
	// Per volume directories
	DESKTOP_DIRECTORY = 0,
	TRASH_DIRECTORY,

	// System directories
	SYSTEM_DIRECTORY        = 1000,
	SYSTEM_ADDONS_DIRECTORY = 1002,
	SYSTEM_BOOT_DIRECTORY,
	SYSTEM_FONTS_DIRECTORY,
	SYSTEM_LIB_DIRECTORY,
	SYSTEM_SERVERS_DIRECTORY,
	SYSTEM_APPS_DIRECTORY,
	SYSTEM_BIN_DIRECTORY,
	SYSTEM_DOCUMENTATION_DIRECTORY = 1010,
	SYSTEM_PREFERENCES_DIRECTORY,
	SYSTEM_TRANSLATORS_DIRECTORY,
	SYSTEM_MEDIA_NODES_DIRECTORY,
	SYSTEM_SOUNDS_DIRECTORY,
	SYSTEM_DATA_DIRECTORY,
	SYSTEM_DEVELOP_DIRECTORY,
	SYSTEM_PACKAGES_DIRECTORY,
	SYSTEM_HEADERS_DIRECTORY,
	SYSTEM_ETC_DIRECTORY      = 2008,
	SYSTEM_SETTINGS_DIRECTORY = 2010,
	SYSTEM_LOG_DIRECTORY      = 2012,
	SYSTEM_SPOOL_DIRECTORY,
	SYSTEM_TEMP_DIRECTORY,
	SYSTEM_VAR_DIRECTORY,
	SYSTEM_CACHE_DIRECTORY       = 2020,
	SYSTEM_NONPACKAGED_DIRECTORY = 2023,
	SYSTEM_NONPACKAGED_ADDONS_DIRECTORY,
	SYSTEM_NONPACKAGED_TRANSLATORS_DIRECTORY,
	SYSTEM_NONPACKAGED_MEDIA_NODES_DIRECTORY,
	SYSTEM_NONPACKAGED_BIN_DIRECTORY,
	SYSTEM_NONPACKAGED_DATA_DIRECTORY,
	SYSTEM_NONPACKAGED_FONTS_DIRECTORY,
	SYSTEM_NONPACKAGED_SOUNDS_DIRECTORY,
	SYSTEM_NONPACKAGED_DOCUMENTATION_DIRECTORY,
	SYSTEM_NONPACKAGED_LIB_DIRECTORY,
	SYSTEM_NONPACKAGED_HEADERS_DIRECTORY,
	SYSTEM_NONPACKAGED_DEVELOP_DIRECTORY,

	// User directories. These are interpreted in the context of the user making the find_directory call.
	USER_DIRECTORY = 3000,
	USER_CONFIG_DIRECTORY,
	USER_ADDONS_DIRECTORY,
	USER_BOOT_DIRECTORY,
	USER_FONTS_DIRECTORY,
	USER_LIB_DIRECTORY,
	USER_SETTINGS_DIRECTORY,
	USER_DESKBAR_DIRECTORY,
	USER_PRINTERS_DIRECTORY,
	USER_TRANSLATORS_DIRECTORY,
	USER_MEDIA_NODES_DIRECTORY,
	USER_SOUNDS_DIRECTORY,
	USER_DATA_DIRECTORY,
	USER_CACHE_DIRECTORY,
	USER_PACKAGES_DIRECTORY,
	USER_HEADERS_DIRECTORY,
	USER_NONPACKAGED_DIRECTORY,
	USER_NONPACKAGED_ADDONS_DIRECTORY,
	USER_NONPACKAGED_TRANSLATORS_DIRECTORY,
	USER_NONPACKAGED_MEDIA_NODES_DIRECTORY,
	USER_NONPACKAGED_BIN_DIRECTORY,
	USER_NONPACKAGED_DATA_DIRECTORY,
	USER_NONPACKAGED_FONTS_DIRECTORY,
	USER_NONPACKAGED_SOUNDS_DIRECTORY,
	USER_NONPACKAGED_DOCUMENTATION_DIRECTORY,
	USER_NONPACKAGED_LIB_DIRECTORY,
	USER_NONPACKAGED_HEADERS_DIRECTORY,
	USER_NONPACKAGED_DEVELOP_DIRECTORY,
	USER_DEVELOP_DIRECTORY,
	USER_DOCUMENTATION_DIRECTORY,
	USER_SERVERS_DIRECTORY,
	USER_APPS_DIRECTORY,
	USER_BIN_DIRECTORY,
	USER_PREFERENCES_DIRECTORY,
	USER_ETC_DIRECTORY,
	USER_LOG_DIRECTORY,
	USER_SPOOL_DIRECTORY,
	USER_VAR_DIRECTORY,

	// Global directories
	APPS_DIRECTORY = 4000,
	PREFERENCES_DIRECTORY,
	UTILITIES_DIRECTORY,
	PACKAGE_LINKS_DIRECTORY,

	// Obsolete: Legacy BeOS definition to be phased out
	BEOS_DIRECTORY = 1000,
	BEOS_SYSTEM_DIRECTORY,
	BEOS_ADDONS_DIRECTORY,
	BEOS_BOOT_DIRECTORY,
	BEOS_FONTS_DIRECTORY,
	BEOS_LIB_DIRECTORY,
	BEOS_SERVERS_DIRECTORY,
	BEOS_APPS_DIRECTORY,
	BEOS_BIN_DIRECTORY,
	BEOS_ETC_DIRECTORY,
	BEOS_DOCUMENTATION_DIRECTORY,
	BEOS_PREFERENCES_DIRECTORY,
	BEOS_TRANSLATORS_DIRECTORY,
	BEOS_MEDIA_NODES_DIRECTORY,
	BEOS_SOUNDS_DIRECTORY,
}

find_path_flag :: enum u32 {
	CREATE_DIRECTORY        = intrinsics.constant_log2(0x0001),
	CREATE_PARENT_DIRECTORY = intrinsics.constant_log2(0x0002),
	EXISTING_ONLY           = intrinsics.constant_log2(0x0004),
	
	// find_paths() only
	SYSTEM_ONLY             = intrinsics.constant_log2(0x0010),
	USER_ONLY               = intrinsics.constant_log2(0x0020),
}
find_path_flags :: distinct bit_set[find_path_flag; u32]

path_base_directory :: enum i32 {
	INSTALLATION_LOCATION_DIRECTORY,
	ADD_ONS_DIRECTORY,
	APPS_DIRECTORY,
	BIN_DIRECTORY,
	BOOT_DIRECTORY,
	CACHE_DIRECTORY,
	DATA_DIRECTORY,
	DEVELOP_DIRECTORY,
	DEVELOP_LIB_DIRECTORY,
	DOCUMENTATION_DIRECTORY,
	ETC_DIRECTORY,
	FONTS_DIRECTORY,
	HEADERS_DIRECTORY,
	LIB_DIRECTORY,
	LOG_DIRECTORY,
	MEDIA_NODES_DIRECTORY,
	PACKAGES_DIRECTORY,
	PREFERENCES_DIRECTORY,
	SERVERS_DIRECTORY,
	SETTINGS_DIRECTORY,
	SOUNDS_DIRECTORY,
	SPOOL_DIRECTORY,
	TRANSLATORS_DIRECTORY,
	VAR_DIRECTORY,

	// find_path() only
	IMAGE_PATH = 1000,
	PACKAGE_PATH,
}

// value that can be used instead of a pointer to a symbol in the program image
APP_IMAGE_SYMBOL :: rawptr(addr_t(0))
// pointer to a symbol in the callers image (same as B_CURRENT_IMAGE_SYMBOL)
current_image_symbol :: proc "contextless" () -> rawptr { return rawptr(current_image_symbol) }

@(default_calling_convention="c")
foreign libroot {
	find_directory         :: proc(which: directory_which, volume: dev_t, createIt: bool, pathString: [^]byte, length: i32) -> status_t ---
	find_path              :: proc(codePointer: rawptr, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]byte, bufferSize: uint) -> status_t ---
	find_path_etc          :: proc(codePointer: rawptr, dependency: cstring, architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, pathBuffer: [^]byte, bufferSize: uint) -> status_t ---
	find_path_for_path     :: proc(path: cstring, baseDirectory: path_base_directory, subPath: cstring, pathBuffer: [^]byte, bufferSize: uint) -> status_t ---
	find_path_for_path_etc :: proc(path: cstring, dependency: cstring, architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, pathBuffer: [^]byte, bufferSize: uint) -> status_t ---
	find_paths             :: proc(baseDirectory: path_base_directory, subPath: cstring, _paths: ^[^][^]byte, _pathCount: ^uint) -> status_t ---
	find_paths_etc         :: proc(architecture: cstring, baseDirectory: path_base_directory, subPath: cstring, flags: find_path_flags, _paths: ^[^][^]byte, _pathCount: ^uint) -> status_t ---
}