librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Sat Oct 04 18:12:58 2014 +0100 (2014-10-04)
changeset 454 56ff755c268c
parent 441 cf499fd51df7
child 458 3f841a46eab5
permissions -rw-r--r--
Only export symbols starting with razor_ in dynamic library.

Apart from being good practice to avoid clashes with higher-level
libraries and the application, this also fixes an obscure bug: The
gnulib library is used both by librazor (the dynamic library) and
by razor (the executable). In doing so, we want to have two separate
copies of the library despite the code duplication this involves.
Without the explicit limit to export only razor_ symbols, the razor
executable under mingw64 was picking up the getopt_long function
from librazor and the optind variable from libgnu which meant that
it did not see optind changing. Hiding librazor's copy of getopt
causes the linker to find libgnu's copy and everything works.

Note that under mingw librazor-#.dll still contains undocumented
(private) razor_ symbols but these will do no harm as long as nobody
tries to use them.
     1 /*
     2  * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     3  * Copyright (C) 2008  Red Hat, Inc
     4  * Copyright (C) 2009, 2011-2012, 2014  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 	int domain;
   251 	int code;
   252 	char *object;
   253 	char *str;
   254 	char *obj_str;
   255 	char *summary;
   256 	char *msg;
   257 };
   258 
   259 #define razor_error_new_posix(object) \
   260 	razor_error_new_str(RAZOR_POSIX_ERROR, errno, object, strerror(errno))
   261 #define razor_set_error_posix(error, object) \
   262 	if (error) \
   263 		*(error) = razor_error_new_posix(object); \
   264 	else
   265 
   266 #ifdef MSWIN_API
   267 struct razor_error *razor_error_new_mswin(const wchar_t *object, DWORD error);
   268 struct razor_error *razor_error_new_str2(int domain, int code,
   269 					 const wchar_t *object,
   270 					 const char *str);
   271 
   272 #define razor_set_error_mswin(error, object, err) \
   273 	if (error) \
   274 		*(error) = razor_error_new_mswin(object, err); \
   275 	else
   276 #define razor_set_error2(error, domain, code, object, str) \
   277 	if (error) \
   278 		*(error) = razor_error_new_str2(domain, code, object, str); \
   279 	else
   280 #endif	/* MSWIN_API */
   281 
   282 /* Atomic functions */
   283 
   284 #if HAVE_WINDOWS_KTM
   285 struct razor_atomic {
   286 	HANDLE transaction;
   287 	int n_files;
   288 	struct razor_atomic_file {
   289 		wchar_t *path;
   290 		HANDLE h;
   291 	} *files;
   292 	int in_undo;
   293 	struct razor_error *error;
   294 };
   295 #elif ENABLE_ATOMIC
   296 struct atomic_action {
   297 	struct atomic_action *next;
   298 	enum atomic_action_type {
   299 		/* Complex actions */
   300 		ACTION_MAKE_DIRS,
   301 		ACTION_REMOVE,
   302 		/* Primitive actions */
   303 		ACTION_CREATE_DIR,
   304 #if HAVE_SYMLINK
   305 		ACTION_CREATE_SYMLINK,
   306 #endif
   307 		ACTION_MOVE,
   308 	} type;
   309 	struct {
   310 		char *path;
   311 		union atomic_action_args {
   312 			struct {
   313 				char *root;
   314 			} make_dirs;
   315 			struct {
   316 				mode_t mode;
   317 			} create_dir;
   318 #if HAVE_SYMLINK
   319 			struct {
   320 				char *target;
   321 			} create_symlink;
   322 #endif
   323 			struct {
   324 				char *dest;
   325 			} move;
   326 		} u;
   327 	} args;
   328 };
   329 
   330 struct razor_atomic {
   331 	struct atomic_action *actions;
   332 	char *description;
   333 	char *toplevel;
   334 	unsigned next_file_tag;
   335 	int in_undo;
   336 	struct razor_error *error;
   337 };
   338 
   339 char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
   340 struct atomic_action *
   341 atomic_action_list_prepend(struct atomic_action *list,
   342 			   struct atomic_action *action);
   343 struct atomic_action *atomic_action_new(enum atomic_action_type type);
   344 void atomic_action_free(struct atomic_action *action);
   345 struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
   346 struct atomic_action *
   347 atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
   348 void
   349 atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
   350 #else	/* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
   351 struct razor_atomic {
   352 	int in_undo;
   353 	struct razor_error *error;
   354 };
   355 #endif
   356 
   357 int razor_allow_all_root_names(void);
   358 int razor_valid_root_name(const char *name);
   359 
   360 #define RAZOR_ASCII_ISALPHA(c) \
   361 	((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z')
   362 
   363 #ifdef MSWIN_API
   364 #define SKIP_DRIVE_LETTER(path) \
   365 	((RAZOR_ASCII_ISALPHA(path[0]) && (path)[1] == ':') ? \
   366 	   (path) + 2 : (path))
   367 #else
   368 #define SKIP_DRIVE_LETTER(path) (path)
   369 #endif /* MSWIN_API */
   370 
   371 #endif /* _RAZOR_INTERNAL_H_ */