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, 2018 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.
38 #include "razor-internal.h"
52 static const char system_repo_filename[] = "system.rzdb";
54 * system_lock_filename is chosen to be the same as the pre v0.3
55 * next_repo_filename. This means that once a system has been
56 * updated by a v0.3+ copy of razor all pre v0.3 versions of razor
57 * will see the system as permenantly locked.
59 static const char system_lock_filename[] = "system-next.rzdb";
61 #define RAZOR_DATABASE_URI NULL
64 * The non-MSWIN default is a relative-ref and thus affected by the root
66 #define RAZOR_DATABASE_URI "var/lib/razor"
68 static char *razor_database_uri = RAZOR_DATABASE_URI;
69 static int razor_database_uri_alloced = FALSE;
70 static int razor_database_uri_default = TRUE;
73 struct razor_set *system;
82 * The MSWIN default is an absolute-URI and thus unaffected by the root
84 char database_path[MAX_PATH];
85 if (!razor_database_uri) {
87 CSIDL_COMMON_APPDATA | CSIDL_FLAG_DONT_VERIFY, NULL, 0,
89 strcat(database_path, "\\Razor");
90 razor_database_uri = razor_path_to_uri(database_path);
91 razor_database_uri_alloced = TRUE;
96 RAZOR_EXPORT const char *razor_get_database_uri(void)
99 return razor_database_uri;
103 razor_set_database_uri(const char *database_uri)
105 if (razor_database_uri_alloced)
106 free(razor_database_uri);
109 razor_database_uri = strdup(database_uri);
110 razor_database_uri_alloced = TRUE;
111 razor_database_uri_default = FALSE;
113 razor_database_uri = RAZOR_DATABASE_URI;
114 razor_database_uri_alloced = FALSE;
115 razor_database_uri_default = TRUE;
119 char *razor_resolve_database_file(const char *root_uri, const char *filename,
120 struct razor_error **error)
126 s = razor_concat(razor_database_uri, "/", filename, NULL);
128 uri = razor_resolve_uri_root(root_uri, s, -1, error);
136 razor_root_create(const char *root_uri, struct razor_error **error)
138 int retval, is_within_root, is_directory;
139 struct razor_set *set;
140 struct razor_atomic *atomic;
141 struct razor_error *tmp_err = NULL;
144 uri = razor_resolve_database_file(root_uri, system_repo_filename,
150 if (razor_uri_is_directory(uri, NULL) >= 0) {
151 razor_set_error(error, RAZOR_GENERAL_ERROR,
152 RAZOR_GENERAL_ERROR_DATABASE_EXISTS, NULL,
153 "A razor install root is already initialized");
158 is_within_root = root_uri && strchr(root_uri, '/') &&
159 str_has_prefix(uri, root_uri);
161 atomic = razor_atomic_open("Create initial package set");
163 if (is_within_root) {
164 is_directory = razor_uri_is_directory(root_uri, NULL);
167 razor_set_error(error, RAZOR_POSIX_ERROR, ENOTDIR,
168 root_uri, "Not a directory");
170 } else if (is_directory < 0 &&
171 razor_uri_mkdir(root_uri, 0777, &tmp_err) < 0) {
172 razor_set_error(error,
173 razor_error_get_domain(tmp_err),
174 razor_error_get_code(tmp_err),
176 "Could not create install root");
180 razor_atomic_make_dirs(atomic, root_uri,
181 uri + strlen(root_uri));
183 razor_atomic_make_dirs(atomic, "", uri);
185 set = razor_set_create();
186 razor_set_write(set, atomic, uri, RAZOR_SECTION_ALL);
188 retval = razor_atomic_commit(atomic);
190 razor_propagate_error(error,
191 razor_atomic_get_error(atomic),
192 "Could not write initial package set");
193 razor_set_unref(set);
194 razor_atomic_destroy(atomic);
199 RAZOR_EXPORT struct razor_root *
200 razor_root_open(const char *root_uri, struct razor_error **error)
202 struct razor_root *image;
206 lock_uri = razor_resolve_database_file(root_uri, system_lock_filename,
212 image = malloc(sizeof *image);
215 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
216 "Not enough memory");
220 image->system = razor_set_create_without_root();
221 if (image->system == NULL) {
224 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
225 "Not enough memory");
229 r = razor_set_acquire_lock(image->system, lock_uri, 1, error);
234 if (error && razor_database_uri_default)
235 razor_error_set_object(*error, root_uri);
236 razor_set_unref(image->system);
241 image->uri = razor_resolve_database_file(root_uri, system_repo_filename,
245 razor_set_unref(image->system);
250 if (razor_set_bind_sections(image->system, image->uri,
251 RAZOR_SET_PRIVATE, error)) {
253 razor_set_unref(image->system);
261 RAZOR_EXPORT struct razor_set *
262 razor_root_open_read_only(const char *root_uri, struct razor_error **error)
266 struct razor_set *set;
268 uri = razor_resolve_database_file(root_uri, system_lock_filename,
274 set = razor_set_create_without_root();
277 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
278 "Not enough memory");
282 r = razor_set_acquire_lock(set, uri, 0, error);
287 if (error && razor_database_uri_default)
288 razor_error_set_object(*error, root_uri);
289 razor_set_unref(set);
293 uri = razor_resolve_database_file(root_uri, system_repo_filename,
296 if (!uri || razor_set_bind_sections(set, uri, 0, error)) {
297 razor_set_unref(set);
306 RAZOR_EXPORT struct razor_set *
307 razor_root_get_system_set(struct razor_root *root)
309 assert (root != NULL);
315 razor_root_close(struct razor_root *root)
317 assert (root != NULL);
319 razor_set_unref(root->system);
327 razor_root_update(struct razor_root *root, struct razor_set *next,
328 struct razor_atomic *atomic)
332 assert (root != NULL);
333 assert (next != NULL);
335 handle = razor_atomic_create_file(atomic, root->uri,
336 S_IRWXU | S_IRWXG | S_IRWXO);
340 razor_set_write_to_handle(next, atomic, handle, RAZOR_SECTION_ALL);
342 retval = razor_atomic_close(atomic, handle);
345 razor_set_unref(root->system);
346 root->system = razor_set_ref(next);