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.
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;
72 struct razor_set *system;
81 * The MSWIN default is an absolute-URI and thus unaffected by the root
83 char database_path[MAX_PATH];
84 if (!razor_database_uri) {
86 CSIDL_COMMON_APPDATA | CSIDL_FLAG_DONT_VERIFY, NULL, 0,
88 strcat(database_path, "\\Razor");
89 razor_database_uri = razor_path_to_uri(database_path);
90 razor_database_uri_alloced = TRUE;
95 RAZOR_EXPORT const char *razor_get_database_uri(void)
98 return razor_database_uri;
102 razor_set_database_uri(const char *database_uri)
104 if (razor_database_uri_alloced)
105 free(razor_database_uri);
108 razor_database_uri = strdup(database_uri);
109 razor_database_uri_alloced = TRUE;
111 razor_database_uri = RAZOR_DATABASE_URI;
112 razor_database_uri_alloced = FALSE;
116 char *razor_resolve_database_file(const char *root_uri, const char *filename,
117 struct razor_error **error)
123 s = razor_concat(razor_database_uri, "/", filename, NULL);
125 uri = razor_resolve_uri_root(root_uri, s, -1, error);
133 razor_root_create(const char *root_uri, struct razor_error **error)
135 int retval, is_within_root, is_directory;
136 struct razor_set *set;
137 struct razor_atomic *atomic;
138 struct razor_error *tmp_err = NULL;
141 uri = razor_resolve_database_file(root_uri, system_repo_filename,
147 if (razor_uri_is_directory(uri, NULL) >= 0) {
148 razor_set_error(error, RAZOR_GENERAL_ERROR,
149 RAZOR_GENERAL_ERROR_DATABASE_EXISTS, NULL,
150 "A razor install root is already initialized");
155 is_within_root = root_uri && strchr(root_uri, '/') &&
156 str_has_prefix(uri, root_uri);
158 atomic = razor_atomic_open("Create initial package set");
160 if (is_within_root) {
161 is_directory = razor_uri_is_directory(root_uri, NULL);
164 razor_set_error(error, RAZOR_POSIX_ERROR, ENOTDIR,
165 root_uri, "Not a directory");
167 } else if (is_directory < 0 &&
168 razor_uri_mkdir(root_uri, 0777, &tmp_err) < 0) {
169 razor_set_error(error,
170 razor_error_get_domain(tmp_err),
171 razor_error_get_code(tmp_err),
173 "Could not create install root");
177 razor_atomic_make_dirs(atomic, root_uri,
178 uri + strlen(root_uri));
180 razor_atomic_make_dirs(atomic, "", uri);
182 set = razor_set_create();
183 razor_set_write(set, atomic, uri, RAZOR_SECTION_ALL);
185 retval = razor_atomic_commit(atomic);
187 razor_propagate_error(error,
188 razor_atomic_get_error(atomic),
189 "Could not write initial package set");
190 razor_set_unref(set);
191 razor_atomic_destroy(atomic);
196 RAZOR_EXPORT struct razor_root *
197 razor_root_open(const char *root_uri, struct razor_error **error)
199 struct razor_root *image;
203 lock_uri = razor_resolve_database_file(root_uri, system_lock_filename,
209 image = malloc(sizeof *image);
212 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
213 "Not enough memory");
217 image->system = razor_set_create_without_root();
218 if (image->system == NULL) {
221 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
222 "Not enough memory");
226 r = razor_set_acquire_lock(image->system, lock_uri, 1);
231 razor_set_error(error, RAZOR_GENERAL_ERROR,
232 RAZOR_GENERAL_ERROR_DATABASE_LOCKED, NULL,
233 "Failed to acquire exclusive system lock");
234 razor_set_unref(image->system);
239 image->uri = razor_resolve_database_file(root_uri, system_repo_filename,
243 razor_set_unref(image->system);
248 if (razor_set_bind_sections(image->system, image->uri,
249 RAZOR_SET_PRIVATE, error)) {
251 razor_set_unref(image->system);
259 RAZOR_EXPORT struct razor_set *
260 razor_root_open_read_only(const char *root_uri, struct razor_error **error)
264 struct razor_set *set;
266 uri = razor_resolve_database_file(root_uri, system_lock_filename,
272 set = razor_set_create_without_root();
275 razor_set_error(error, RAZOR_POSIX_ERROR, ENOMEM, NULL,
276 "Not enough memory");
280 r = razor_set_acquire_lock(set, uri, 0);
285 razor_set_error(error, RAZOR_GENERAL_ERROR,
286 RAZOR_GENERAL_ERROR_DATABASE_LOCKED, NULL,
287 "Failed to acquire non-exclusive system lock");
288 razor_set_unref(set);
292 uri = razor_resolve_database_file(root_uri, system_repo_filename,
295 if (!uri || razor_set_bind_sections(set, uri, 0, error)) {
296 razor_set_unref(set);
305 RAZOR_EXPORT struct razor_set *
306 razor_root_get_system_set(struct razor_root *root)
308 assert (root != NULL);
314 razor_root_close(struct razor_root *root)
316 assert (root != NULL);
318 razor_set_unref(root->system);
326 razor_root_update(struct razor_root *root, struct razor_set *next,
327 struct razor_atomic *atomic)
331 assert (root != NULL);
332 assert (next != NULL);
334 handle = razor_atomic_create_file(atomic, root->uri,
335 S_IRWXU | S_IRWXG | S_IRWXO);
339 razor_set_write_to_handle(next, atomic, handle, RAZOR_SECTION_ALL);
341 retval = razor_atomic_close(atomic, handle);
344 razor_set_unref(root->system);
345 root->system = razor_set_ref(next);