librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Feb 09 20:45:27 2012 +0000 (2012-02-09)
changeset 418 33b825d3128d
parent 403 e63951c1d0f8
child 423 6112bcc5d1cf
permissions -rw-r--r--
Add transaction barriers
These allow packages to be installed and removed which have scripts
that depend on each other when atomic transactions are involved.
Note that yum supports pre, but not other requires flags. post will
need similar support to the post scripts themselves pulling in the
requires flags from the rpms. Likewise preun and postun will need
similar handling to those scrips since the requires flags will need
to be stored in the razor database.
     1 /*
     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>
     5  *
     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.
    10  *
    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.
    15  *
    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.
    19  */
    20 
    21 #ifndef _RAZOR_INTERNAL_H_
    22 #define _RAZOR_INTERNAL_H_
    23 
    24 #ifdef MSWIN_API
    25 #include <windows.h>
    26 #endif
    27 #include <stdlib.h>
    28 #include <stdint.h>
    29 #include <stdarg.h>
    30 #include <unistd.h>
    31 
    32 #include "razor.h"
    33 #include "types/types.h"
    34 
    35 /* GCC extensions */
    36 #if defined(__GNUC__) && __GNUC__ >= 4
    37 #define RAZOR_EXPORT __attribute__ ((visibility("default")))
    38 #else
    39 #define RAZOR_EXPORT
    40 #endif
    41 
    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);
    46 
    47 struct razor_set_section {
    48 	uint32_t name;
    49 	uint32_t offset;
    50 	uint32_t size;
    51 };
    52 
    53 struct razor_set_header {
    54 	uint32_t magic;
    55 	uint32_t version;
    56 	uint32_t num_sections;
    57 };
    58 
    59 #define RAZOR_MAGIC 	0x525a4442
    60 
    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"
    67 
    68 #define RAZOR_DETAILS_STRING_POOL	"details_string_pool"
    69 
    70 #define RAZOR_FILES			"files"
    71 #define RAZOR_FILE_POOL			"file_pool"
    72 #define RAZOR_FILE_STRING_POOL		"file_string_pool"
    73 
    74 struct razor_script {
    75 	uint32_t program;
    76 	uint32_t body;
    77 };
    78 
    79 struct razor_package {
    80 	unsigned int name  : 24;
    81 	unsigned int flags : 8;
    82 	uint32_t version;
    83 	uint32_t arch;
    84 	uint32_t summary;
    85 	uint32_t description;
    86 	uint32_t url;
    87 	uint32_t license;
    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;
    93 };
    94 
    95 
    96 struct razor_property {
    97 	uint32_t name;
    98 	uint32_t flags;
    99 	uint32_t version;
   100 	struct list_head packages;
   101 };
   102 
   103 struct razor_entry {
   104 	uint32_t name  : 24;
   105 	uint32_t flags : 8;
   106 	uint32_t start;
   107 	struct list_head packages;
   108 };
   109 
   110 #define RAZOR_ENTRY_LAST	0x80
   111 
   112 struct razor_set {
   113 	uint32_t header_version;
   114 	struct array string_pool;
   115  	struct array packages;
   116  	struct array properties;
   117  	struct array files;
   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;
   126 };
   127 
   128 struct import_entry {
   129 	uint32_t package;
   130 	char *name;
   131 };
   132 
   133 struct import_directory {
   134 	uint32_t name, count;
   135 	struct array files;
   136 	struct array packages;
   137 	struct import_directory *last;
   138 };
   139 
   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;
   147 	struct array files;
   148 	struct array file_requires;
   149 	struct array install_prefixes;
   150 };
   151 
   152 struct razor_package_iterator {
   153 	struct razor_set *set;
   154 	struct razor_package *package, *end;
   155 	struct list *index;
   156 	int free_index;
   157 };
   158 
   159 void
   160 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
   161 					 struct razor_set *set,
   162 					 struct razor_property *property);
   163 
   164 struct razor_property_iterator {
   165 	struct razor_set *set;
   166 	struct razor_property *property, *end;
   167 	struct list *index;
   168 };
   169 
   170 struct razor_file_iterator {
   171 	struct razor_set *set;
   172 	struct array path;
   173 	struct list *index;
   174 	int post_order;
   175 };
   176 
   177 int
   178 razor_set_aquire_lock(struct razor_set *set, const char *path, int exclusive);
   179 
   180 struct razor_entry *
   181 razor_set_find_entry(struct razor_set *set,
   182 		     struct razor_entry *dir, const char *pattern);
   183 
   184 struct razor_merger *
   185 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
   186 void
   187 razor_merger_add_package(struct razor_merger *merger,
   188 			 struct razor_package *package);
   189 struct razor_set *
   190 razor_merger_commit(struct razor_merger *merger);
   191 void
   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);
   196 void
   197 razor_merger_destroy(struct razor_merger *merger);
   198 
   199 int run_lua_script(const char *root, const char *name, const char *body,
   200 		   ssize_t len, int arg1);
   201 
   202 int razor_run_script(const char *root, enum razor_property_flags script,
   203 		     const char *program, const char *body, int arg1);
   204 
   205 /* Utility functions */
   206 
   207 void
   208 razor_package_get_details_varg(struct razor_set *set,
   209 			       struct razor_package *package,
   210 			       va_list args);
   211 void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
   212 
   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);
   216 
   217 void *razor_file_get_contents(const char *filename, size_t *length);
   218 int razor_file_free_contents(void *addr, size_t length);
   219 
   220 
   221 typedef int (*razor_compare_with_data_func_t)(const void *p1,
   222 					      const void *p,
   223 					      void *data);
   224 uint32_t *
   225 razor_qsort_with_data(void *base, size_t nelem, size_t size,
   226 		      razor_compare_with_data_func_t compare, void *data);
   227 
   228 struct environment {
   229 	int is_set;
   230 	struct array vars, string_pool;
   231 };
   232 
   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);
   239 
   240 #ifdef MSWIN_API
   241 char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
   242 wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
   243 #endif
   244 
   245 /* Atomic functions */
   246 
   247 #if HAVE_WINDOWS_KTM
   248 struct razor_atomic {
   249 	HANDLE transaction;
   250 	int n_files;
   251 	struct razor_atomic_file {
   252 		wchar_t *path;
   253 		HANDLE h;
   254 	} *files;
   255 	int in_undo;
   256 	char *error_path;
   257 	char *error_str;
   258 	char *error_msg;
   259 };
   260 #elif ENABLE_ATOMIC
   261 struct atomic_action {
   262 	struct atomic_action *next;
   263 	enum atomic_action_type {
   264 		/* Complex actions */
   265 		ACTION_MAKE_DIRS,
   266 		ACTION_REMOVE,
   267 		/* Primitive actions */
   268 		ACTION_CREATE_DIR,
   269 #if HAVE_SYMLINK
   270 		ACTION_CREATE_SYMLINK,
   271 #endif
   272 		ACTION_MOVE,
   273 	} type;
   274 	struct {
   275 		char *path;
   276 		union atomic_action_args {
   277 			struct {
   278 				char *root;
   279 			} make_dirs;
   280 			struct {
   281 				mode_t mode;
   282 			} create_dir;
   283 #if HAVE_SYMLINK
   284 			struct {
   285 				char *target;
   286 			} create_symlink;
   287 #endif
   288 			struct {
   289 				char *dest;
   290 			} move;
   291 		} u;
   292 	} args;
   293 };
   294 
   295 struct razor_atomic {
   296 	struct atomic_action *actions;
   297 	char *description;
   298 	char *toplevel;
   299 	unsigned next_file_tag;
   300 	int in_undo;
   301 	char *error_path;
   302 	char *error_str;
   303 	char *error_msg;
   304 };
   305 
   306 char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
   307 struct atomic_action *
   308 atomic_action_list_prepend(struct atomic_action *list,
   309 			   struct atomic_action *action);
   310 struct atomic_action *atomic_action_new(enum atomic_action_type type);
   311 void atomic_action_free(struct atomic_action *action);
   312 struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
   313 struct atomic_action *
   314 atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
   315 void
   316 atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
   317 #else	/* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
   318 struct razor_atomic {
   319 	int in_undo;
   320 	char *error_path;
   321 	char *error_str;
   322 	char *error_msg;
   323 };
   324 #endif
   325 
   326 int razor_allow_all_root_names(void);
   327 int razor_valid_root_name(const char *name);
   328 
   329 #ifdef MSWIN_API
   330 void
   331 razor_atomic_set_error_mswin(struct razor_atomic *atomic, const wchar_t *path,
   332 			     DWORD error);
   333 #endif
   334 
   335 #if HAVE_WINDOWS_KTM
   336 void
   337 razor_atomic_set_error_str(struct razor_atomic *atomic, const wchar_t *path,
   338 			   const char *str);
   339 #else
   340 void
   341 razor_atomic_set_error_str(struct razor_atomic *atomic, const char *path,
   342 			   const char *str);
   343 #endif
   344 
   345 #endif /* _RAZOR_INTERNAL_H_ */