librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Fri Jun 10 17:54:20 2016 +0100 (2016-06-10)
changeset 472 219c7ea94a42
parent 458 3f841a46eab5
child 475 008c75a5e08d
permissions -rw-r--r--
Add an implementation for razor_importer_destroy()
richard@300
     1
/*
richard@300
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
richard@300
     3
 * Copyright (C) 2008  Red Hat, Inc
ali@447
     4
 * Copyright (C) 2009, 2011-2012, 2014  J. Ali Harlow <ali@juiblex.co.uk>
richard@300
     5
 *
richard@300
     6
 * This program is free software; you can redistribute it and/or modify
richard@300
     7
 * it under the terms of the GNU General Public License as published by
richard@300
     8
 * the Free Software Foundation; either version 2 of the License, or
richard@300
     9
 * (at your option) any later version.
richard@300
    10
 *
richard@300
    11
 * This program is distributed in the hope that it will be useful,
richard@300
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
richard@300
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
richard@300
    14
 * GNU General Public License for more details.
richard@300
    15
 *
richard@300
    16
 * You should have received a copy of the GNU General Public License along
richard@300
    17
 * with this program; if not, write to the Free Software Foundation, Inc.,
richard@300
    18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
richard@300
    19
 */
richard@300
    20
rhughes@241
    21
#ifndef _RAZOR_INTERNAL_H_
rhughes@241
    22
#define _RAZOR_INTERNAL_H_
rhughes@241
    23
ali@416
    24
#ifdef MSWIN_API
ali@416
    25
#include <windows.h>
ali@416
    26
#endif
krh@248
    27
#include <stdlib.h>
krh@248
    28
#include <stdint.h>
richard@302
    29
#include <stdarg.h>
ali@360
    30
#include <unistd.h>
richard@302
    31
richard@302
    32
#include "razor.h"
ali@364
    33
#include "types/types.h"
krh@248
    34
ali@403
    35
/* GCC extensions */
krh@269
    36
#if defined(__GNUC__) && __GNUC__ >= 4
krh@269
    37
#define RAZOR_EXPORT __attribute__ ((visibility("default")))
krh@269
    38
#else
krh@269
    39
#define RAZOR_EXPORT
krh@269
    40
#endif
krh@269
    41
krh@271
    42
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
krh@373
    43
#define PADDING(value, base) (-(value) & (base - 1))
krh@373
    44
#define ALIGN(value, base) ((value) + PADDING(value, base))
krh@248
    45
void *zalloc(size_t size);
krh@248
    46
krh@248
    47
struct razor_set_section {
jbowes@318
    48
	uint32_t name;
krh@248
    49
	uint32_t offset;
krh@248
    50
	uint32_t size;
krh@248
    51
};
krh@248
    52
krh@248
    53
struct razor_set_header {
krh@248
    54
	uint32_t magic;
krh@248
    55
	uint32_t version;
jbowes@318
    56
	uint32_t num_sections;
krh@248
    57
};
krh@248
    58
jbowes@318
    59
#define RAZOR_MAGIC 	0x525a4442
krh@248
    60
jbowes@318
    61
#define RAZOR_STRING_POOL		"string_pool"
jbowes@318
    62
#define RAZOR_PACKAGES			"packages"
jbowes@318
    63
#define RAZOR_PROPERTIES		"properties"
jbowes@318
    64
#define RAZOR_PACKAGE_POOL		"package_pool"
jbowes@318
    65
#define RAZOR_PROPERTY_POOL		"property_pool"
ali@372
    66
#define RAZOR_PREFIX_POOL		"prefix_pool"
jbowes@258
    67
jbowes@318
    68
#define RAZOR_DETAILS_STRING_POOL	"details_string_pool"
jbowes@258
    69
jbowes@318
    70
#define RAZOR_FILES			"files"
jbowes@318
    71
#define RAZOR_FILE_POOL			"file_pool"
jbowes@318
    72
#define RAZOR_FILE_STRING_POOL		"file_string_pool"
krh@248
    73
ali@369
    74
struct razor_script {
ali@369
    75
	uint32_t program;
ali@369
    76
	uint32_t body;
ali@369
    77
};
ali@369
    78
krh@248
    79
struct razor_package {
ali@324
    80
	unsigned int name  : 24;
ali@324
    81
	unsigned int flags : 8;
krh@248
    82
	uint32_t version;
krh@248
    83
	uint32_t arch;
jbowes@258
    84
	uint32_t summary;
jbowes@258
    85
	uint32_t description;
jbowes@258
    86
	uint32_t url;
jbowes@258
    87
	uint32_t license;
krh@248
    88
	struct list_head properties;
krh@248
    89
	struct list_head files;
ali@372
    90
	struct list_head install_prefixes;
ali@369
    91
	struct razor_script preun;
ali@369
    92
	struct razor_script postun;
krh@248
    93
};
krh@248
    94
jbowes@258
    95
krh@248
    96
struct razor_property {
krh@248
    97
	uint32_t name;
krh@248
    98
	uint32_t flags;
krh@248
    99
	uint32_t version;
krh@248
   100
	struct list_head packages;
krh@248
   101
};
krh@248
   102
krh@248
   103
struct razor_entry {
krh@248
   104
	uint32_t name  : 24;
krh@248
   105
	uint32_t flags : 8;
krh@248
   106
	uint32_t start;
krh@248
   107
	struct list_head packages;
krh@248
   108
};
krh@248
   109
krh@248
   110
#define RAZOR_ENTRY_LAST	0x80
krh@248
   111
krh@248
   112
struct razor_set {
ali@403
   113
	uint32_t header_version;
krh@248
   114
	struct array string_pool;
krh@248
   115
 	struct array packages;
krh@248
   116
 	struct array properties;
krh@248
   117
 	struct array files;
krh@248
   118
	struct array package_pool;
krh@248
   119
 	struct array property_pool;
krh@248
   120
 	struct array file_pool;
ali@372
   121
 	struct array prefix_pool;
jbowes@258
   122
	struct array file_string_pool;
jbowes@258
   123
	struct array details_string_pool;
krh@373
   124
	struct razor_mapped_file *mapped_files;
ali@403
   125
	int lock_fd, ref_count;
ali@424
   126
	enum razor_set_flags flags;
krh@248
   127
};
krh@248
   128
krh@248
   129
struct import_entry {
krh@248
   130
	uint32_t package;
krh@248
   131
	char *name;
krh@248
   132
};
krh@248
   133
krh@248
   134
struct import_directory {
krh@248
   135
	uint32_t name, count;
krh@248
   136
	struct array files;
krh@248
   137
	struct array packages;
krh@248
   138
	struct import_directory *last;
krh@248
   139
};
krh@248
   140
krh@248
   141
struct razor_importer {
krh@248
   142
	struct razor_set *set;
krh@248
   143
	struct hashtable table;
jbowes@258
   144
	struct hashtable file_table;
jbowes@258
   145
	struct hashtable details_table;
krh@248
   146
	struct razor_package *package;
krh@248
   147
	struct array properties;
krh@248
   148
	struct array files;
krh@248
   149
	struct array file_requires;
ali@372
   150
	struct array install_prefixes;
krh@248
   151
};
krh@248
   152
krh@248
   153
struct razor_package_iterator {
krh@248
   154
	struct razor_set *set;
krh@248
   155
	struct razor_package *package, *end;
krh@248
   156
	struct list *index;
ali@458
   157
	void *alloced_index;
krh@248
   158
};
krh@248
   159
krh@248
   160
void
krh@248
   161
razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
krh@248
   162
					 struct razor_set *set,
krh@248
   163
					 struct razor_property *property);
krh@248
   164
krh@248
   165
struct razor_property_iterator {
krh@248
   166
	struct razor_set *set;
krh@248
   167
	struct razor_property *property, *end;
krh@248
   168
	struct list *index;
krh@248
   169
};
krh@248
   170
ali@351
   171
struct razor_file_iterator {
ali@351
   172
	struct razor_set *set;
ali@351
   173
	struct array path;
ali@351
   174
	struct list *index;
ali@377
   175
	int post_order;
ali@351
   176
};
ali@351
   177
ali@462
   178
struct razor_string_iterator {
ali@462
   179
	struct razor_set *set;
ali@462
   180
	struct list *index;
ali@462
   181
};
ali@462
   182
ali@388
   183
int
ali@388
   184
razor_set_aquire_lock(struct razor_set *set, const char *path, int exclusive);
ali@388
   185
krh@248
   186
struct razor_entry *
krh@248
   187
razor_set_find_entry(struct razor_set *set,
krh@248
   188
		     struct razor_entry *dir, const char *pattern);
krh@248
   189
krh@248
   190
struct razor_merger *
krh@248
   191
razor_merger_create(struct razor_set *set1, struct razor_set *set2);
krh@248
   192
void
krh@248
   193
razor_merger_add_package(struct razor_merger *merger,
krh@248
   194
			 struct razor_package *package);
krh@248
   195
struct razor_set *
ali@369
   196
razor_merger_commit(struct razor_merger *merger);
ali@369
   197
void
ali@369
   198
razor_merger_package_add_script(struct razor_merger *merger,
ali@369
   199
				struct razor_package *package,
ali@369
   200
				enum razor_property_flags script,
ali@369
   201
				const char *program, const char *body);
ali@369
   202
void
ali@369
   203
razor_merger_destroy(struct razor_merger *merger);
krh@248
   204
ali@352
   205
int run_lua_script(const char *root, const char *name, const char *body,
ali@376
   206
		   ssize_t len, int arg1);
ali@352
   207
ali@369
   208
int razor_run_script(const char *root, enum razor_property_flags script,
ali@376
   209
		     const char *program, const char *body, int arg1);
ali@369
   210
rhughes@241
   211
/* Utility functions */
rhughes@241
   212
richard@302
   213
void
richard@302
   214
razor_package_get_details_varg(struct razor_set *set,
richard@302
   215
			       struct razor_package *package,
richard@302
   216
			       va_list args);
ali@369
   217
void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
richard@302
   218
rhughes@241
   219
int razor_create_dir(const char *root, const char *path);
ali@377
   220
int razor_remove(const char *path);
rhughes@241
   221
int razor_write(int fd, const void *data, size_t size);
rhughes@241
   222
ali@424
   223
void *
ali@424
   224
razor_file_get_contents(const char *filename, size_t *length, int private,
ali@424
   225
			struct razor_error **error);
ali@322
   226
int razor_file_free_contents(void *addr, size_t length);
ali@322
   227
rhughes@241
   228
rhughes@241
   229
typedef int (*razor_compare_with_data_func_t)(const void *p1,
rhughes@241
   230
					      const void *p,
rhughes@241
   231
					      void *data);
rhughes@241
   232
uint32_t *
rhughes@241
   233
razor_qsort_with_data(void *base, size_t nelem, size_t size,
rhughes@241
   234
		      razor_compare_with_data_func_t compare, void *data);
rhughes@241
   235
ali@372
   236
struct environment {
ali@372
   237
	int is_set;
ali@372
   238
	struct array vars, string_pool;
ali@372
   239
};
ali@372
   240
ali@372
   241
void environment_init(struct environment *env);
ali@372
   242
void environment_add_variable(struct environment *env,
ali@372
   243
			      const char *variable, const char *value);
ali@372
   244
void environment_set(struct environment *env);
ali@372
   245
void environment_unset(struct environment *env);
ali@372
   246
void environment_release(struct environment *env);
ali@372
   247
ali@416
   248
#ifdef MSWIN_API
ali@416
   249
char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
ali@416
   250
wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
ali@416
   251
#endif
ali@416
   252
ali@423
   253
/* Error functions */
ali@423
   254
struct razor_error {
ali@447
   255
	int domain;
ali@447
   256
	int code;
ali@447
   257
	char *object;
ali@423
   258
	char *str;
ali@447
   259
	char *obj_str;
ali@439
   260
	char *summary;
ali@423
   261
	char *msg;
ali@423
   262
};
ali@423
   263
ali@447
   264
#define razor_error_new_posix(object) \
ali@447
   265
	razor_error_new_str(RAZOR_POSIX_ERROR, errno, object, strerror(errno))
ali@447
   266
#define razor_set_error_posix(error, object) \
ali@447
   267
	if (error) \
ali@447
   268
		*(error) = razor_error_new_posix(object); \
ali@447
   269
	else
ali@447
   270
ali@423
   271
#ifdef MSWIN_API
ali@447
   272
struct razor_error *razor_error_new_mswin(const wchar_t *object, DWORD error);
ali@447
   273
struct razor_error *razor_error_new_str2(int domain, int code,
ali@447
   274
					 const wchar_t *object,
ali@447
   275
					 const char *str);
ali@423
   276
ali@447
   277
#define razor_set_error_mswin(error, object, err) \
ali@424
   278
	if (error) \
ali@447
   279
		*(error) = razor_error_new_mswin(object, err); \
ali@424
   280
	else
ali@447
   281
#define razor_set_error2(error, domain, code, object, str) \
ali@424
   282
	if (error) \
ali@447
   283
		*(error) = razor_error_new_str2(domain, code, object, str); \
ali@424
   284
	else
ali@424
   285
#endif	/* MSWIN_API */
ali@423
   286
ali@416
   287
/* Atomic functions */
ali@416
   288
ali@416
   289
#if HAVE_WINDOWS_KTM
ali@416
   290
struct razor_atomic {
ali@416
   291
	HANDLE transaction;
ali@416
   292
	int n_files;
ali@416
   293
	struct razor_atomic_file {
ali@416
   294
		wchar_t *path;
ali@416
   295
		HANDLE h;
ali@416
   296
	} *files;
ali@416
   297
	int in_undo;
ali@423
   298
	struct razor_error *error;
ali@416
   299
};
ali@416
   300
#elif ENABLE_ATOMIC
ali@416
   301
struct atomic_action {
ali@416
   302
	struct atomic_action *next;
ali@416
   303
	enum atomic_action_type {
ali@416
   304
		/* Complex actions */
ali@416
   305
		ACTION_MAKE_DIRS,
ali@416
   306
		ACTION_REMOVE,
ali@416
   307
		/* Primitive actions */
ali@416
   308
		ACTION_CREATE_DIR,
ali@416
   309
#if HAVE_SYMLINK
ali@416
   310
		ACTION_CREATE_SYMLINK,
ali@416
   311
#endif
ali@416
   312
		ACTION_MOVE,
ali@416
   313
	} type;
ali@416
   314
	struct {
ali@416
   315
		char *path;
ali@416
   316
		union atomic_action_args {
ali@416
   317
			struct {
ali@416
   318
				char *root;
ali@416
   319
			} make_dirs;
ali@416
   320
			struct {
ali@416
   321
				mode_t mode;
ali@416
   322
			} create_dir;
ali@416
   323
#if HAVE_SYMLINK
ali@416
   324
			struct {
ali@416
   325
				char *target;
ali@416
   326
			} create_symlink;
ali@416
   327
#endif
ali@416
   328
			struct {
ali@416
   329
				char *dest;
ali@416
   330
			} move;
ali@416
   331
		} u;
ali@416
   332
	} args;
ali@416
   333
};
ali@416
   334
ali@416
   335
struct razor_atomic {
ali@416
   336
	struct atomic_action *actions;
ali@416
   337
	char *description;
ali@416
   338
	char *toplevel;
ali@416
   339
	unsigned next_file_tag;
ali@416
   340
	int in_undo;
ali@423
   341
	struct razor_error *error;
ali@416
   342
};
ali@416
   343
ali@416
   344
char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
ali@416
   345
struct atomic_action *
ali@416
   346
atomic_action_list_prepend(struct atomic_action *list,
ali@416
   347
			   struct atomic_action *action);
ali@416
   348
struct atomic_action *atomic_action_new(enum atomic_action_type type);
ali@416
   349
void atomic_action_free(struct atomic_action *action);
ali@416
   350
struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
ali@416
   351
struct atomic_action *
ali@416
   352
atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
ali@416
   353
void
ali@416
   354
atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
ali@416
   355
#else	/* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
ali@416
   356
struct razor_atomic {
ali@416
   357
	int in_undo;
ali@423
   358
	struct razor_error *error;
ali@416
   359
};
ali@416
   360
#endif
ali@416
   361
ali@416
   362
int razor_allow_all_root_names(void);
ali@416
   363
int razor_valid_root_name(const char *name);
ali@416
   364
ali@441
   365
#define RAZOR_ASCII_ISALPHA(c) \
ali@441
   366
	((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z')
ali@441
   367
ali@441
   368
#ifdef MSWIN_API
ali@441
   369
#define SKIP_DRIVE_LETTER(path) \
ali@441
   370
	((RAZOR_ASCII_ISALPHA(path[0]) && (path)[1] == ':') ? \
ali@441
   371
	   (path) + 2 : (path))
ali@441
   372
#else
ali@441
   373
#define SKIP_DRIVE_LETTER(path) (path)
ali@441
   374
#endif /* MSWIN_API */
ali@441
   375
rhughes@241
   376
#endif /* _RAZOR_INTERNAL_H_ */