2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009, 2011-2012, 2014, 2016 J. Ali Harlow <ali@juiblex.co.uk>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with this program; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #ifndef _RAZOR_INTERNAL_H_
22 #define _RAZOR_INTERNAL_H_
33 #include "types/types.h"
36 #if defined(__GNUC__) && __GNUC__ >= 4
37 #define RAZOR_EXPORT __attribute__ ((visibility("default")))
42 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
43 #define PADDING(value, base) (-(value) & (base - 1))
44 #define ALIGN(value, base) ((value) + PADDING(value, base))
46 #define str_has_prefix(s, prefix) (!strncmp(s, prefix, strlen(prefix)))
48 void *zalloc(size_t size);
50 struct razor_set_section {
56 struct razor_set_header {
59 uint32_t num_sections;
62 #define RAZOR_MAGIC 0x525a4442
64 #define RAZOR_STRING_POOL "string_pool"
65 #define RAZOR_PACKAGES "packages"
66 #define RAZOR_PROPERTIES "properties"
67 #define RAZOR_PACKAGE_POOL "package_pool"
68 #define RAZOR_PROPERTY_POOL "property_pool"
69 #define RAZOR_PREFIX_POOL "prefix_pool"
71 #define RAZOR_DETAILS_STRING_POOL "details_string_pool"
73 #define RAZOR_FILES "files"
74 #define RAZOR_FILE_POOL "file_pool"
75 #define RAZOR_FILE_STRING_POOL "file_string_pool"
82 struct razor_package {
83 unsigned int name : 24;
84 unsigned int flags : 8;
91 struct list_head properties;
92 struct list_head files;
93 struct list_head install_prefixes;
94 struct razor_script preun;
95 struct razor_script postun;
99 struct razor_property {
103 struct list_head packages;
110 struct list_head packages;
113 #define RAZOR_ENTRY_LAST 0x80
116 uint32_t header_version;
117 struct array string_pool;
118 struct array packages;
119 struct array properties;
121 struct array package_pool;
122 struct array property_pool;
123 struct array file_pool;
124 struct array prefix_pool;
125 struct array file_string_pool;
126 struct array details_string_pool;
127 struct razor_mapped_file *mapped_files;
128 int lock_fd, ref_count;
129 enum razor_set_flags flags;
132 struct import_entry {
137 struct import_directory {
138 uint32_t name, count;
140 struct array packages;
141 struct import_directory *last;
144 struct razor_importer {
145 struct razor_set *set;
146 struct hashtable table;
147 struct hashtable file_table;
148 struct hashtable details_table;
149 struct razor_package *package;
150 struct array properties;
152 struct array file_requires;
153 struct array install_prefixes;
156 struct razor_package_iterator {
157 struct razor_set *set;
158 struct razor_package *package, *end;
164 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
165 struct razor_set *set,
166 struct razor_property *property);
168 struct razor_property_iterator {
169 struct razor_set *set;
170 struct razor_property *property, *end;
174 struct razor_file_iterator {
175 struct razor_set *set;
181 struct razor_string_iterator {
182 struct razor_set *set;
187 razor_set_acquire_lock(struct razor_set *set, const char *path, int exclusive);
190 razor_set_find_entry(struct razor_set *set,
191 struct razor_entry *dir, const char *pattern);
193 struct razor_merger *
194 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
196 razor_merger_add_package(struct razor_merger *merger,
197 struct razor_package *package);
199 razor_merger_commit(struct razor_merger *merger);
201 razor_merger_package_add_script(struct razor_merger *merger,
202 struct razor_package *package,
203 enum razor_property_flags script,
204 const char *program, const char *body);
206 razor_merger_destroy(struct razor_merger *merger);
208 int run_lua_script(const char *root, const char *name, const char *body,
209 ssize_t len, int arg1);
211 int razor_run_script(const char *root, enum razor_property_flags script,
212 const char *program, const char *body, int arg1,
213 struct razor_error **error);
227 void razor_uri_destroy(struct razor_uri *ru);
228 int razor_uri_parse_uri(struct razor_uri *ru, const char *uri, int absolute,
229 struct razor_error **error);
230 int razor_uri_parse_relative_ref(struct razor_uri *ru, const char *uri,
231 struct razor_error **error);
232 int razor_uri_parse(struct razor_uri *ru, const char *uri,
233 struct razor_error **error);
234 void razor_uri_normalize(struct razor_uri *ru);
235 char *razor_uri_get_authority(const struct razor_uri *ru) RAZOR_MALLOC;
236 char *razor_uri_recompose(const struct razor_uri *ru) RAZOR_MALLOC;
237 void razor_uri_resolve(struct razor_uri *T, const struct razor_uri *base,
238 const struct razor_uri *R);
240 char *razor_resolve_uri_root(const char *root_uri, const char *relative_uri,
241 int is_relative, struct razor_error **error)
244 int razor_file_mkdir(const char *path, mode_t mode, struct razor_error **error);
245 int razor_file_unlink(const char *path, struct razor_error **error);
246 int razor_file_open(const char *path, int flags, mode_t mode,
247 struct razor_error **error);
248 int razor_file_move(const char *path, const char *dest,
249 struct razor_error **error);
250 void *razor_file_get_contents(const char *path, size_t *length, int _private,
251 struct razor_error **error);
252 int razor_file_free_contents(void *addr, size_t length);
253 int razor_file_is_directory(const char *path, struct razor_error **error);
254 char *razor_file_mkdtemp_near(const char *path, const char *_template,
255 struct razor_error **error);
256 void *razor_file_opendir(const char *path, struct razor_error **error);
257 char *razor_file_readdir(void *dir, struct razor_error **error);
258 int razor_file_closedir(void *dir, struct razor_error **error);
260 char *razor_path_from_parsed_uri(const struct razor_uri *ru,
261 struct razor_error **error);
263 /* Utility functions */
266 razor_package_get_details_varg(struct razor_set *set,
267 struct razor_package *package,
269 void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
271 typedef int (*razor_compare_with_data_func_t)(const void *p1,
275 razor_qsort_with_data(void *base, size_t nelem, size_t size,
276 razor_compare_with_data_func_t compare, void *data);
280 struct array vars, string_pool;
283 void environment_init(struct environment *env);
284 void environment_add_variable(struct environment *env,
285 const char *variable, const char *value);
286 void environment_set(struct environment *env);
287 void environment_unset(struct environment *env);
288 void environment_release(struct environment *env);
291 char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
292 wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
295 /* Error functions */
306 #define razor_error_new_posix(object) \
307 razor_error_new_str(RAZOR_POSIX_ERROR, errno, object, strerror(errno))
308 #define razor_set_error_posix(error, object) \
310 *(error) = razor_error_new_posix(object); \
312 #define razor_set_error(error, domain, code, object, str) \
314 *(error) = razor_error_new_str(domain, code, object, str); \
318 struct razor_error *razor_error_new_mswin(const wchar_t *object, DWORD error);
319 struct razor_error *razor_error_new_str2(int domain, int code,
320 const wchar_t *object,
323 #define razor_set_error_mswin(error, object, err) \
325 *(error) = razor_error_new_mswin(object, err); \
327 #define razor_set_error2(error, domain, code, object, str) \
329 *(error) = razor_error_new_str2(domain, code, object, str); \
331 #endif /* MSWIN_API */
333 /* Atomic functions */
336 struct razor_atomic {
339 struct razor_atomic_file {
344 struct razor_error *error;
347 struct atomic_action {
348 struct atomic_action *next;
349 enum atomic_action_type {
350 /* Complex actions */
353 /* Primitive actions */
356 ACTION_CREATE_SYMLINK,
362 union atomic_action_args {
381 struct razor_atomic {
382 struct atomic_action *actions;
385 unsigned next_file_tag;
387 struct razor_error *error;
390 char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
391 struct atomic_action *
392 atomic_action_list_prepend(struct atomic_action *list,
393 struct atomic_action *action);
394 struct atomic_action *atomic_action_new(enum atomic_action_type type);
395 void atomic_action_free(struct atomic_action *action);
396 struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
397 struct atomic_action *
398 atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
400 atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
401 #else /* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
402 struct razor_atomic {
404 struct razor_error *error;
408 char *razor_resolve_database_file(const char *root_uri, const char *filename,
409 struct razor_error **error);
411 int razor_allow_all_root_names(void);
412 int razor_valid_root_name(const char *name);
414 #define RAZOR_ASCII_ISALPHA(c) \
415 ((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z')
418 #define SKIP_DRIVE_LETTER(path) \
419 ((RAZOR_ASCII_ISALPHA(path[0]) && (path)[1] == ':') ? \
422 #define SKIP_DRIVE_LETTER(path) (path)
423 #endif /* MSWIN_API */
425 #endif /* _RAZOR_INTERNAL_H_ */