librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Aug 23 11:13:48 2014 +0100 (2014-08-23)
changeset 440 48204dea0b9f
parent 424 8cbc438cc298
child 441 cf499fd51df7
permissions -rw-r--r--
Remove INTLLIBS from librazor_la_LIBADD.

This partially reverts 611c84a3f4b4538a65d186050608c17adbf17770.
It's not clear what motivated the initial inclusion of INTLLIBS
here since the net effect is only seen in librazor.la and not
in razor.pc and librazor.la is not normally packaged. Certainly
neither the static nor the dynamic versions of librazor currently
use libintl. At best this would cause the linker to search a
static libintl for undefined symbols without finding any; at worse
it causes a static build of plover using librazor.la to fail if
no static version of libintl is installed.
     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 	enum razor_set_flags flags;
   127 };
   128 
   129 struct import_entry {
   130 	uint32_t package;
   131 	char *name;
   132 };
   133 
   134 struct import_directory {
   135 	uint32_t name, count;
   136 	struct array files;
   137 	struct array packages;
   138 	struct import_directory *last;
   139 };
   140 
   141 struct razor_importer {
   142 	struct razor_set *set;
   143 	struct hashtable table;
   144 	struct hashtable file_table;
   145 	struct hashtable details_table;
   146 	struct razor_package *package;
   147 	struct array properties;
   148 	struct array files;
   149 	struct array file_requires;
   150 	struct array install_prefixes;
   151 };
   152 
   153 struct razor_package_iterator {
   154 	struct razor_set *set;
   155 	struct razor_package *package, *end;
   156 	struct list *index;
   157 	int free_index;
   158 };
   159 
   160 void
   161 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
   162 					 struct razor_set *set,
   163 					 struct razor_property *property);
   164 
   165 struct razor_property_iterator {
   166 	struct razor_set *set;
   167 	struct razor_property *property, *end;
   168 	struct list *index;
   169 };
   170 
   171 struct razor_file_iterator {
   172 	struct razor_set *set;
   173 	struct array path;
   174 	struct list *index;
   175 	int post_order;
   176 };
   177 
   178 int
   179 razor_set_aquire_lock(struct razor_set *set, const char *path, int exclusive);
   180 
   181 struct razor_entry *
   182 razor_set_find_entry(struct razor_set *set,
   183 		     struct razor_entry *dir, const char *pattern);
   184 
   185 struct razor_merger *
   186 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
   187 void
   188 razor_merger_add_package(struct razor_merger *merger,
   189 			 struct razor_package *package);
   190 struct razor_set *
   191 razor_merger_commit(struct razor_merger *merger);
   192 void
   193 razor_merger_package_add_script(struct razor_merger *merger,
   194 				struct razor_package *package,
   195 				enum razor_property_flags script,
   196 				const char *program, const char *body);
   197 void
   198 razor_merger_destroy(struct razor_merger *merger);
   199 
   200 int run_lua_script(const char *root, const char *name, const char *body,
   201 		   ssize_t len, int arg1);
   202 
   203 int razor_run_script(const char *root, enum razor_property_flags script,
   204 		     const char *program, const char *body, int arg1);
   205 
   206 /* Utility functions */
   207 
   208 void
   209 razor_package_get_details_varg(struct razor_set *set,
   210 			       struct razor_package *package,
   211 			       va_list args);
   212 void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
   213 
   214 int razor_create_dir(const char *root, const char *path);
   215 int razor_remove(const char *path);
   216 int razor_write(int fd, const void *data, size_t size);
   217 
   218 void *
   219 razor_file_get_contents(const char *filename, size_t *length, int private,
   220 			struct razor_error **error);
   221 int razor_file_free_contents(void *addr, size_t length);
   222 
   223 
   224 typedef int (*razor_compare_with_data_func_t)(const void *p1,
   225 					      const void *p,
   226 					      void *data);
   227 uint32_t *
   228 razor_qsort_with_data(void *base, size_t nelem, size_t size,
   229 		      razor_compare_with_data_func_t compare, void *data);
   230 
   231 struct environment {
   232 	int is_set;
   233 	struct array vars, string_pool;
   234 };
   235 
   236 void environment_init(struct environment *env);
   237 void environment_add_variable(struct environment *env,
   238 			      const char *variable, const char *value);
   239 void environment_set(struct environment *env);
   240 void environment_unset(struct environment *env);
   241 void environment_release(struct environment *env);
   242 
   243 #ifdef MSWIN_API
   244 char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
   245 wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
   246 #endif
   247 
   248 /* Error functions */
   249 struct razor_error {
   250 	char *path;
   251 	char *str;
   252 	char *path_str;
   253 	char *summary;
   254 	char *msg;
   255 };
   256 
   257 #ifdef MSWIN_API
   258 struct razor_error *razor_error_new_mswin(const wchar_t *path, DWORD error);
   259 struct razor_error *razor_error_new_str2(const wchar_t *path, const char *str);
   260 
   261 #define razor_set_error_mswin(error, path, err) \
   262 	if (error) \
   263 		*(error) = razor_error_new_mswin(path, err); \
   264 	else
   265 #define razor_set_error2(error, path, str) \
   266 	if (error) \
   267 		*(error) = razor_error_new_str2(path, str); \
   268 	else
   269 #endif	/* MSWIN_API */
   270 
   271 /* Atomic functions */
   272 
   273 #if HAVE_WINDOWS_KTM
   274 struct razor_atomic {
   275 	HANDLE transaction;
   276 	int n_files;
   277 	struct razor_atomic_file {
   278 		wchar_t *path;
   279 		HANDLE h;
   280 	} *files;
   281 	int in_undo;
   282 	struct razor_error *error;
   283 };
   284 #elif ENABLE_ATOMIC
   285 struct atomic_action {
   286 	struct atomic_action *next;
   287 	enum atomic_action_type {
   288 		/* Complex actions */
   289 		ACTION_MAKE_DIRS,
   290 		ACTION_REMOVE,
   291 		/* Primitive actions */
   292 		ACTION_CREATE_DIR,
   293 #if HAVE_SYMLINK
   294 		ACTION_CREATE_SYMLINK,
   295 #endif
   296 		ACTION_MOVE,
   297 	} type;
   298 	struct {
   299 		char *path;
   300 		union atomic_action_args {
   301 			struct {
   302 				char *root;
   303 			} make_dirs;
   304 			struct {
   305 				mode_t mode;
   306 			} create_dir;
   307 #if HAVE_SYMLINK
   308 			struct {
   309 				char *target;
   310 			} create_symlink;
   311 #endif
   312 			struct {
   313 				char *dest;
   314 			} move;
   315 		} u;
   316 	} args;
   317 };
   318 
   319 struct razor_atomic {
   320 	struct atomic_action *actions;
   321 	char *description;
   322 	char *toplevel;
   323 	unsigned next_file_tag;
   324 	int in_undo;
   325 	struct razor_error *error;
   326 };
   327 
   328 char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
   329 struct atomic_action *
   330 atomic_action_list_prepend(struct atomic_action *list,
   331 			   struct atomic_action *action);
   332 struct atomic_action *atomic_action_new(enum atomic_action_type type);
   333 void atomic_action_free(struct atomic_action *action);
   334 struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
   335 struct atomic_action *
   336 atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
   337 void
   338 atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
   339 #else	/* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
   340 struct razor_atomic {
   341 	int in_undo;
   342 	struct razor_error *error;
   343 };
   344 #endif
   345 
   346 int razor_allow_all_root_names(void);
   347 int razor_valid_root_name(const char *name);
   348 
   349 #endif /* _RAZOR_INTERNAL_H_ */