Add an error object.
This is intended to dis-entangle the two roles that the atomic
object has evolved into so that atomic need only be used where
atomic actions are actually being undertaken.
2 * Copyright (C) 2008 Kristian Høgsberg <krh@redhat.com>
3 * Copyright (C) 2008 Red Hat, Inc
4 * Copyright (C) 2009, 2011-2012 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))
45 void *zalloc(size_t size);
47 struct razor_set_section {
53 struct razor_set_header {
56 uint32_t num_sections;
59 #define RAZOR_MAGIC 0x525a4442
61 #define RAZOR_STRING_POOL "string_pool"
62 #define RAZOR_PACKAGES "packages"
63 #define RAZOR_PROPERTIES "properties"
64 #define RAZOR_PACKAGE_POOL "package_pool"
65 #define RAZOR_PROPERTY_POOL "property_pool"
66 #define RAZOR_PREFIX_POOL "prefix_pool"
68 #define RAZOR_DETAILS_STRING_POOL "details_string_pool"
70 #define RAZOR_FILES "files"
71 #define RAZOR_FILE_POOL "file_pool"
72 #define RAZOR_FILE_STRING_POOL "file_string_pool"
79 struct razor_package {
80 unsigned int name : 24;
81 unsigned int flags : 8;
88 struct list_head properties;
89 struct list_head files;
90 struct list_head install_prefixes;
91 struct razor_script preun;
92 struct razor_script postun;
96 struct razor_property {
100 struct list_head packages;
107 struct list_head packages;
110 #define RAZOR_ENTRY_LAST 0x80
113 uint32_t header_version;
114 struct array string_pool;
115 struct array packages;
116 struct array properties;
118 struct array package_pool;
119 struct array property_pool;
120 struct array file_pool;
121 struct array prefix_pool;
122 struct array file_string_pool;
123 struct array details_string_pool;
124 struct razor_mapped_file *mapped_files;
125 int lock_fd, ref_count;
128 struct import_entry {
133 struct import_directory {
134 uint32_t name, count;
136 struct array packages;
137 struct import_directory *last;
140 struct razor_importer {
141 struct razor_set *set;
142 struct hashtable table;
143 struct hashtable file_table;
144 struct hashtable details_table;
145 struct razor_package *package;
146 struct array properties;
148 struct array file_requires;
149 struct array install_prefixes;
152 struct razor_package_iterator {
153 struct razor_set *set;
154 struct razor_package *package, *end;
160 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
161 struct razor_set *set,
162 struct razor_property *property);
164 struct razor_property_iterator {
165 struct razor_set *set;
166 struct razor_property *property, *end;
170 struct razor_file_iterator {
171 struct razor_set *set;
178 razor_set_aquire_lock(struct razor_set *set, const char *path, int exclusive);
181 razor_set_find_entry(struct razor_set *set,
182 struct razor_entry *dir, const char *pattern);
184 struct razor_merger *
185 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
187 razor_merger_add_package(struct razor_merger *merger,
188 struct razor_package *package);
190 razor_merger_commit(struct razor_merger *merger);
192 razor_merger_package_add_script(struct razor_merger *merger,
193 struct razor_package *package,
194 enum razor_property_flags script,
195 const char *program, const char *body);
197 razor_merger_destroy(struct razor_merger *merger);
199 int run_lua_script(const char *root, const char *name, const char *body,
200 ssize_t len, int arg1);
202 int razor_run_script(const char *root, enum razor_property_flags script,
203 const char *program, const char *body, int arg1);
205 /* Utility functions */
208 razor_package_get_details_varg(struct razor_set *set,
209 struct razor_package *package,
211 void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
213 int razor_create_dir(const char *root, const char *path);
214 int razor_remove(const char *path);
215 int razor_write(int fd, const void *data, size_t size);
217 void *razor_file_get_contents(const char *filename, size_t *length);
218 int razor_file_free_contents(void *addr, size_t length);
221 typedef int (*razor_compare_with_data_func_t)(const void *p1,
225 razor_qsort_with_data(void *base, size_t nelem, size_t size,
226 razor_compare_with_data_func_t compare, void *data);
230 struct array vars, string_pool;
233 void environment_init(struct environment *env);
234 void environment_add_variable(struct environment *env,
235 const char *variable, const char *value);
236 void environment_set(struct environment *env);
237 void environment_unset(struct environment *env);
238 void environment_release(struct environment *env);
241 char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
242 wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
245 /* Error functions */
253 struct razor_error *razor_error_new_mswin(const wchar_t *path, DWORD error);
257 struct razor_error *razor_error_new_str(const wchar_t *path, const char *str);
259 struct razor_error *razor_error_new_str(const char *path, const char *str);
262 /* Atomic functions */
265 struct razor_atomic {
268 struct razor_atomic_file {
273 struct razor_error *error;
276 struct atomic_action {
277 struct atomic_action *next;
278 enum atomic_action_type {
279 /* Complex actions */
282 /* Primitive actions */
285 ACTION_CREATE_SYMLINK,
291 union atomic_action_args {
310 struct razor_atomic {
311 struct atomic_action *actions;
314 unsigned next_file_tag;
316 struct razor_error *error;
319 char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
320 struct atomic_action *
321 atomic_action_list_prepend(struct atomic_action *list,
322 struct atomic_action *action);
323 struct atomic_action *atomic_action_new(enum atomic_action_type type);
324 void atomic_action_free(struct atomic_action *action);
325 struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
326 struct atomic_action *
327 atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
329 atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
330 #else /* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
331 struct razor_atomic {
333 struct razor_error *error;
337 int razor_allow_all_root_names(void);
338 int razor_valid_root_name(const char *name);
340 #endif /* _RAZOR_INTERNAL_H_ */