librazor/razor-internal.h
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Apr 24 19:27:29 2018 +0100 (2018-04-24)
changeset 496 203fa998c6df
parent 476 48e45439fd9a
child 498 5a49f274ab2d
permissions -rw-r--r--
Support expat v2.2
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@475
     4
 * Copyright (C) 2009, 2011-2012, 2014, 2016  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))
ali@475
    45
ali@475
    46
#define str_has_prefix(s, prefix)	(!strncmp(s, prefix, strlen(prefix)))
ali@475
    47
krh@248
    48
void *zalloc(size_t size);
krh@248
    49
krh@248
    50
struct razor_set_section {
jbowes@318
    51
	uint32_t name;
krh@248
    52
	uint32_t offset;
krh@248
    53
	uint32_t size;
krh@248
    54
};
krh@248
    55
krh@248
    56
struct razor_set_header {
krh@248
    57
	uint32_t magic;
krh@248
    58
	uint32_t version;
jbowes@318
    59
	uint32_t num_sections;
krh@248
    60
};
krh@248
    61
jbowes@318
    62
#define RAZOR_MAGIC 	0x525a4442
krh@248
    63
jbowes@318
    64
#define RAZOR_STRING_POOL		"string_pool"
jbowes@318
    65
#define RAZOR_PACKAGES			"packages"
jbowes@318
    66
#define RAZOR_PROPERTIES		"properties"
jbowes@318
    67
#define RAZOR_PACKAGE_POOL		"package_pool"
jbowes@318
    68
#define RAZOR_PROPERTY_POOL		"property_pool"
ali@372
    69
#define RAZOR_PREFIX_POOL		"prefix_pool"
jbowes@258
    70
jbowes@318
    71
#define RAZOR_DETAILS_STRING_POOL	"details_string_pool"
jbowes@258
    72
jbowes@318
    73
#define RAZOR_FILES			"files"
jbowes@318
    74
#define RAZOR_FILE_POOL			"file_pool"
jbowes@318
    75
#define RAZOR_FILE_STRING_POOL		"file_string_pool"
krh@248
    76
ali@369
    77
struct razor_script {
ali@369
    78
	uint32_t program;
ali@369
    79
	uint32_t body;
ali@369
    80
};
ali@369
    81
krh@248
    82
struct razor_package {
ali@324
    83
	unsigned int name  : 24;
ali@324
    84
	unsigned int flags : 8;
krh@248
    85
	uint32_t version;
krh@248
    86
	uint32_t arch;
jbowes@258
    87
	uint32_t summary;
jbowes@258
    88
	uint32_t description;
jbowes@258
    89
	uint32_t url;
jbowes@258
    90
	uint32_t license;
krh@248
    91
	struct list_head properties;
krh@248
    92
	struct list_head files;
ali@372
    93
	struct list_head install_prefixes;
ali@369
    94
	struct razor_script preun;
ali@369
    95
	struct razor_script postun;
krh@248
    96
};
krh@248
    97
jbowes@258
    98
krh@248
    99
struct razor_property {
krh@248
   100
	uint32_t name;
krh@248
   101
	uint32_t flags;
krh@248
   102
	uint32_t version;
krh@248
   103
	struct list_head packages;
krh@248
   104
};
krh@248
   105
krh@248
   106
struct razor_entry {
krh@248
   107
	uint32_t name  : 24;
krh@248
   108
	uint32_t flags : 8;
krh@248
   109
	uint32_t start;
krh@248
   110
	struct list_head packages;
krh@248
   111
};
krh@248
   112
krh@248
   113
#define RAZOR_ENTRY_LAST	0x80
krh@248
   114
krh@248
   115
struct razor_set {
ali@403
   116
	uint32_t header_version;
krh@248
   117
	struct array string_pool;
krh@248
   118
 	struct array packages;
krh@248
   119
 	struct array properties;
krh@248
   120
 	struct array files;
krh@248
   121
	struct array package_pool;
krh@248
   122
 	struct array property_pool;
krh@248
   123
 	struct array file_pool;
ali@372
   124
 	struct array prefix_pool;
jbowes@258
   125
	struct array file_string_pool;
jbowes@258
   126
	struct array details_string_pool;
krh@373
   127
	struct razor_mapped_file *mapped_files;
ali@403
   128
	int lock_fd, ref_count;
ali@424
   129
	enum razor_set_flags flags;
krh@248
   130
};
krh@248
   131
krh@248
   132
struct import_entry {
krh@248
   133
	uint32_t package;
krh@248
   134
	char *name;
krh@248
   135
};
krh@248
   136
krh@248
   137
struct import_directory {
krh@248
   138
	uint32_t name, count;
krh@248
   139
	struct array files;
krh@248
   140
	struct array packages;
krh@248
   141
	struct import_directory *last;
krh@248
   142
};
krh@248
   143
krh@248
   144
struct razor_importer {
krh@248
   145
	struct razor_set *set;
krh@248
   146
	struct hashtable table;
jbowes@258
   147
	struct hashtable file_table;
jbowes@258
   148
	struct hashtable details_table;
krh@248
   149
	struct razor_package *package;
krh@248
   150
	struct array properties;
krh@248
   151
	struct array files;
krh@248
   152
	struct array file_requires;
ali@372
   153
	struct array install_prefixes;
krh@248
   154
};
krh@248
   155
krh@248
   156
struct razor_package_iterator {
krh@248
   157
	struct razor_set *set;
krh@248
   158
	struct razor_package *package, *end;
krh@248
   159
	struct list *index;
ali@458
   160
	void *alloced_index;
krh@248
   161
};
krh@248
   162
krh@248
   163
void
krh@248
   164
razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
krh@248
   165
					 struct razor_set *set,
krh@248
   166
					 struct razor_property *property);
krh@248
   167
krh@248
   168
struct razor_property_iterator {
krh@248
   169
	struct razor_set *set;
krh@248
   170
	struct razor_property *property, *end;
krh@248
   171
	struct list *index;
krh@248
   172
};
krh@248
   173
ali@351
   174
struct razor_file_iterator {
ali@351
   175
	struct razor_set *set;
ali@351
   176
	struct array path;
ali@351
   177
	struct list *index;
ali@377
   178
	int post_order;
ali@351
   179
};
ali@351
   180
ali@462
   181
struct razor_string_iterator {
ali@462
   182
	struct razor_set *set;
ali@462
   183
	struct list *index;
ali@462
   184
};
ali@462
   185
ali@388
   186
int
ali@475
   187
razor_set_acquire_lock(struct razor_set *set, const char *path, int exclusive);
ali@388
   188
krh@248
   189
struct razor_entry *
krh@248
   190
razor_set_find_entry(struct razor_set *set,
krh@248
   191
		     struct razor_entry *dir, const char *pattern);
krh@248
   192
krh@248
   193
struct razor_merger *
krh@248
   194
razor_merger_create(struct razor_set *set1, struct razor_set *set2);
krh@248
   195
void
krh@248
   196
razor_merger_add_package(struct razor_merger *merger,
krh@248
   197
			 struct razor_package *package);
krh@248
   198
struct razor_set *
ali@369
   199
razor_merger_commit(struct razor_merger *merger);
ali@369
   200
void
ali@369
   201
razor_merger_package_add_script(struct razor_merger *merger,
ali@369
   202
				struct razor_package *package,
ali@369
   203
				enum razor_property_flags script,
ali@369
   204
				const char *program, const char *body);
ali@369
   205
void
ali@369
   206
razor_merger_destroy(struct razor_merger *merger);
krh@248
   207
ali@352
   208
int run_lua_script(const char *root, const char *name, const char *body,
ali@376
   209
		   ssize_t len, int arg1);
ali@352
   210
ali@369
   211
int razor_run_script(const char *root, enum razor_property_flags script,
ali@475
   212
		     const char *program, const char *body, int arg1,
ali@475
   213
		     struct razor_error **error);
ali@475
   214
ali@475
   215
/* URI functions */
ali@475
   216
ali@475
   217
struct razor_uri {
ali@475
   218
	char *scheme;
ali@475
   219
	char *userinfo;
ali@475
   220
	char *host;
ali@475
   221
	char *port;
ali@475
   222
	char *path;
ali@475
   223
	char *query;
ali@475
   224
	char *fragment;
ali@475
   225
};
ali@475
   226
ali@475
   227
void razor_uri_destroy(struct razor_uri *ru);
ali@475
   228
int razor_uri_parse_uri(struct razor_uri *ru, const char *uri, int absolute,
ali@475
   229
			struct razor_error **error);
ali@475
   230
int razor_uri_parse_relative_ref(struct razor_uri *ru, const char *uri,
ali@475
   231
				 struct razor_error **error);
ali@475
   232
int razor_uri_parse(struct razor_uri *ru, const char *uri,
ali@475
   233
		    struct razor_error **error);
ali@475
   234
void razor_uri_normalize(struct razor_uri *ru);
ali@475
   235
char *razor_uri_get_authority(const struct razor_uri *ru) RAZOR_MALLOC;
ali@475
   236
char *razor_uri_recompose(const struct razor_uri *ru) RAZOR_MALLOC;
ali@475
   237
void razor_uri_resolve(struct razor_uri *T, const struct razor_uri *base,
ali@475
   238
		       const struct razor_uri *R);
ali@475
   239
ali@475
   240
char *razor_resolve_uri_root(const char *root_uri, const char *relative_uri,
ali@475
   241
			     int is_relative, struct razor_error **error)
ali@475
   242
      RAZOR_MALLOC;
ali@475
   243
ali@475
   244
int razor_file_mkdir(const char *path, mode_t mode, struct razor_error **error);
ali@475
   245
int razor_file_unlink(const char *path, struct razor_error **error);
ali@475
   246
int razor_file_open(const char *path, int flags, mode_t mode,
ali@475
   247
		    struct razor_error **error);
ali@475
   248
int razor_file_move(const char *path, const char *dest,
ali@475
   249
		    struct razor_error **error);
ali@475
   250
void *razor_file_get_contents(const char *path, size_t *length, int _private,
ali@475
   251
			      struct razor_error **error);
ali@475
   252
int razor_file_free_contents(void *addr, size_t length);
ali@475
   253
int razor_file_is_directory(const char *path, struct razor_error **error);
ali@475
   254
char *razor_file_mkdtemp_near(const char *path, const char *_template,
ali@475
   255
			      struct razor_error **error);
ali@475
   256
void *razor_file_opendir(const char *path, struct razor_error **error);
ali@475
   257
char *razor_file_readdir(void *dir, struct razor_error **error);
ali@475
   258
int razor_file_closedir(void *dir, struct razor_error **error);
ali@475
   259
ali@475
   260
char *razor_path_from_parsed_uri(const struct razor_uri *ru,
ali@475
   261
  struct razor_error **error);
ali@369
   262
rhughes@241
   263
/* Utility functions */
rhughes@241
   264
richard@302
   265
void
richard@302
   266
razor_package_get_details_varg(struct razor_set *set,
richard@302
   267
			       struct razor_package *package,
richard@302
   268
			       va_list args);
ali@369
   269
void razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args);
richard@302
   270
rhughes@241
   271
typedef int (*razor_compare_with_data_func_t)(const void *p1,
rhughes@241
   272
					      const void *p,
rhughes@241
   273
					      void *data);
rhughes@241
   274
uint32_t *
rhughes@241
   275
razor_qsort_with_data(void *base, size_t nelem, size_t size,
rhughes@241
   276
		      razor_compare_with_data_func_t compare, void *data);
rhughes@241
   277
ali@372
   278
struct environment {
ali@372
   279
	int is_set;
ali@372
   280
	struct array vars, string_pool;
ali@372
   281
};
ali@372
   282
ali@372
   283
void environment_init(struct environment *env);
ali@372
   284
void environment_add_variable(struct environment *env,
ali@372
   285
			      const char *variable, const char *value);
ali@372
   286
void environment_set(struct environment *env);
ali@372
   287
void environment_unset(struct environment *env);
ali@372
   288
void environment_release(struct environment *env);
ali@372
   289
ali@416
   290
#ifdef MSWIN_API
ali@416
   291
char *razor_utf16_to_utf8(const wchar_t *utf16, int len);
ali@416
   292
wchar_t *razor_utf8_to_utf16(const char *utf8, int len);
ali@416
   293
#endif
ali@416
   294
ali@491
   295
char *razor_abspath(const char *path);
ali@491
   296
ali@423
   297
/* Error functions */
ali@423
   298
struct razor_error {
ali@447
   299
	int domain;
ali@447
   300
	int code;
ali@447
   301
	char *object;
ali@423
   302
	char *str;
ali@447
   303
	char *obj_str;
ali@439
   304
	char *summary;
ali@423
   305
	char *msg;
ali@423
   306
};
ali@423
   307
ali@447
   308
#define razor_error_new_posix(object) \
ali@447
   309
	razor_error_new_str(RAZOR_POSIX_ERROR, errno, object, strerror(errno))
ali@447
   310
#define razor_set_error_posix(error, object) \
ali@447
   311
	if (error) \
ali@447
   312
		*(error) = razor_error_new_posix(object); \
ali@447
   313
	else
ali@475
   314
#define razor_set_error(error, domain, code, object, str) \
ali@475
   315
	if (error) \
ali@475
   316
		*(error) = razor_error_new_str(domain, code, object, str); \
ali@475
   317
	else
ali@447
   318
ali@423
   319
#ifdef MSWIN_API
ali@447
   320
struct razor_error *razor_error_new_mswin(const wchar_t *object, DWORD error);
ali@447
   321
struct razor_error *razor_error_new_str2(int domain, int code,
ali@447
   322
					 const wchar_t *object,
ali@447
   323
					 const char *str);
ali@423
   324
ali@447
   325
#define razor_set_error_mswin(error, object, err) \
ali@424
   326
	if (error) \
ali@447
   327
		*(error) = razor_error_new_mswin(object, err); \
ali@424
   328
	else
ali@447
   329
#define razor_set_error2(error, domain, code, object, str) \
ali@424
   330
	if (error) \
ali@447
   331
		*(error) = razor_error_new_str2(domain, code, object, str); \
ali@424
   332
	else
ali@424
   333
#endif	/* MSWIN_API */
ali@423
   334
ali@416
   335
/* Atomic functions */
ali@416
   336
ali@416
   337
#if HAVE_WINDOWS_KTM
ali@416
   338
struct razor_atomic {
ali@416
   339
	HANDLE transaction;
ali@416
   340
	int n_files;
ali@416
   341
	struct razor_atomic_file {
ali@416
   342
		wchar_t *path;
ali@416
   343
		HANDLE h;
ali@416
   344
	} *files;
ali@416
   345
	int in_undo;
ali@423
   346
	struct razor_error *error;
ali@416
   347
};
ali@416
   348
#elif ENABLE_ATOMIC
ali@416
   349
struct atomic_action {
ali@416
   350
	struct atomic_action *next;
ali@416
   351
	enum atomic_action_type {
ali@416
   352
		/* Complex actions */
ali@416
   353
		ACTION_MAKE_DIRS,
ali@416
   354
		ACTION_REMOVE,
ali@416
   355
		/* Primitive actions */
ali@416
   356
		ACTION_CREATE_DIR,
ali@416
   357
#if HAVE_SYMLINK
ali@416
   358
		ACTION_CREATE_SYMLINK,
ali@416
   359
#endif
ali@416
   360
		ACTION_MOVE,
ali@416
   361
	} type;
ali@416
   362
	struct {
ali@475
   363
		char *uri;
ali@416
   364
		union atomic_action_args {
ali@416
   365
			struct {
ali@416
   366
				char *root;
ali@416
   367
			} make_dirs;
ali@416
   368
			struct {
ali@416
   369
				mode_t mode;
ali@416
   370
			} create_dir;
ali@416
   371
#if HAVE_SYMLINK
ali@416
   372
			struct {
ali@416
   373
				char *target;
ali@416
   374
			} create_symlink;
ali@416
   375
#endif
ali@416
   376
			struct {
ali@416
   377
				char *dest;
ali@416
   378
			} move;
ali@416
   379
		} u;
ali@416
   380
	} args;
ali@416
   381
};
ali@416
   382
ali@416
   383
struct razor_atomic {
ali@416
   384
	struct atomic_action *actions;
ali@416
   385
	char *description;
ali@416
   386
	char *toplevel;
ali@416
   387
	unsigned next_file_tag;
ali@416
   388
	int in_undo;
ali@423
   389
	struct razor_error *error;
ali@416
   390
};
ali@416
   391
ali@416
   392
char *atomic_action_attic_tmpnam(struct razor_atomic *atomic);
ali@416
   393
struct atomic_action *
ali@416
   394
atomic_action_list_prepend(struct atomic_action *list,
ali@416
   395
			   struct atomic_action *action);
ali@416
   396
struct atomic_action *atomic_action_new(enum atomic_action_type type);
ali@416
   397
void atomic_action_free(struct atomic_action *action);
ali@416
   398
struct atomic_action *atomic_action_list_reverse(struct atomic_action *list);
ali@416
   399
struct atomic_action *
ali@416
   400
atomic_action_do(struct razor_atomic *atomic, struct atomic_action *action);
ali@416
   401
void
ali@416
   402
atomic_action_undo(struct razor_atomic *atomic, struct atomic_action *action);
ali@416
   403
#else	/* !HAVE_WINDOWS_KTM && !ENABLE_ATOMIC */
ali@416
   404
struct razor_atomic {
ali@416
   405
	int in_undo;
ali@423
   406
	struct razor_error *error;
ali@416
   407
};
ali@416
   408
#endif
ali@416
   409
ali@475
   410
char *razor_resolve_database_file(const char *root_uri, const char *filename,
ali@475
   411
				  struct razor_error **error);
ali@475
   412
ali@416
   413
int razor_allow_all_root_names(void);
ali@416
   414
int razor_valid_root_name(const char *name);
ali@416
   415
ali@441
   416
#define RAZOR_ASCII_ISALPHA(c) \
ali@441
   417
	((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z')
ali@441
   418
ali@441
   419
#ifdef MSWIN_API
ali@441
   420
#define SKIP_DRIVE_LETTER(path) \
ali@441
   421
	((RAZOR_ASCII_ISALPHA(path[0]) && (path)[1] == ':') ? \
ali@441
   422
	   (path) + 2 : (path))
ali@441
   423
#else
ali@441
   424
#define SKIP_DRIVE_LETTER(path) (path)
ali@441
   425
#endif /* MSWIN_API */
ali@441
   426
rhughes@241
   427
#endif /* _RAZOR_INTERNAL_H_ */