librazor/razor-internal.h
author James Bowes <jbowes@redhat.com>
Wed Jul 09 10:11:13 2008 -0400 (2008-07-09)
changeset 318 829d6711b316
parent 302 9b71b537d175
child 322 66c281524c98
permissions -rw-r--r--
Use strings to identify section types in the on-disk repo format.

Previously, a given razor file type had a fixed number of sections in a
fixed order, identified by an integer type. Now, sections are identified
by a named string (stored in a string pool after the section lists).

This will allow for razor files to contain arbitrary sections.

For bonus points, also drop the 4k section alignment and change the
magic byte string to "RZDB".

committer: Kristian H?gsberg <krh@redhat.com>
     1 /*
     2  * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
     3  * Copyright (C) 2008  Red Hat, Inc
     4  *
     5  * This program is free software; you can redistribute it and/or modify
     6  * it under the terms of the GNU General Public License as published by
     7  * the Free Software Foundation; either version 2 of the License, or
     8  * (at your option) any later version.
     9  *
    10  * This program is distributed in the hope that it will be useful,
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  * GNU General Public License for more details.
    14  *
    15  * You should have received a copy of the GNU General Public License along
    16  * with this program; if not, write to the Free Software Foundation, Inc.,
    17  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
    18  */
    19 
    20 #ifndef _RAZOR_INTERNAL_H_
    21 #define _RAZOR_INTERNAL_H_
    22 
    23 #include <stdlib.h>
    24 #include <stdint.h>
    25 #include <stdarg.h>
    26 
    27 #include "razor.h"
    28 
    29 /* GCC visibility */
    30 #if defined(__GNUC__) && __GNUC__ >= 4
    31 #define RAZOR_EXPORT __attribute__ ((visibility("default")))
    32 #else
    33 #define RAZOR_EXPORT
    34 #endif
    35 
    36 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
    37 #define ALIGN(value, base) (((value) + (base - 1)) & ~((base) - 1))
    38 
    39 void *zalloc(size_t size);
    40 
    41 struct array {
    42 	void *data;
    43 	int size, alloc;
    44 };
    45 
    46 void array_init(struct array *array);
    47 void array_release(struct array *array);
    48 void *array_add(struct array *array, int size);
    49 
    50 
    51 struct list_head {
    52 	uint32_t list_ptr : 24;
    53 	uint32_t flags    : 8;
    54 };
    55 
    56 struct list {
    57 	uint32_t data  : 24;
    58 	uint32_t flags : 8;
    59 };
    60 
    61 void list_set_empty(struct list_head *head);
    62 void list_set_ptr(struct list_head *head, uint32_t ptr);
    63 void list_set_array(struct list_head *head, struct array *pool, struct array *items, int force_indirect);
    64 
    65 struct list *list_first(struct list_head *head, struct array *pool);
    66 struct list *list_next(struct list *list);
    67 
    68 void list_remap_pool(struct array *pool, uint32_t *map);
    69 void list_remap_head(struct list_head *list, uint32_t *map);
    70 
    71 
    72 struct hashtable {
    73 	struct array buckets;
    74 	struct array *pool;
    75 };
    76 
    77 void hashtable_init(struct hashtable *table, struct array *pool);
    78 void hashtable_release(struct hashtable *table);
    79 uint32_t hashtable_insert(struct hashtable *table, const char *key);
    80 uint32_t hashtable_lookup(struct hashtable *table, const char *key);
    81 uint32_t hashtable_tokenize(struct hashtable *table, const char *string);
    82 
    83 
    84 struct razor_set_section {
    85 	uint32_t name;
    86 	uint32_t offset;
    87 	uint32_t size;
    88 };
    89 
    90 struct razor_set_header {
    91 	uint32_t magic;
    92 	uint32_t version;
    93 	uint32_t num_sections;
    94 };
    95 
    96 #define RAZOR_MAGIC 	0x525a4442
    97 #define RAZOR_VERSION	1
    98 
    99 #define RAZOR_STRING_POOL		"string_pool"
   100 #define RAZOR_PACKAGES			"packages"
   101 #define RAZOR_PROPERTIES		"properties"
   102 #define RAZOR_PACKAGE_POOL		"package_pool"
   103 #define RAZOR_PROPERTY_POOL		"property_pool"
   104 
   105 #define RAZOR_DETAILS_STRING_POOL	"details_string_pool"
   106 
   107 #define RAZOR_FILES			"files"
   108 #define RAZOR_FILE_POOL			"file_pool"
   109 #define RAZOR_FILE_STRING_POOL		"file_string_pool"
   110 
   111 struct razor_package {
   112 	uint name  : 24;
   113 	uint flags : 8;
   114 	uint32_t version;
   115 	uint32_t arch;
   116 	uint32_t summary;
   117 	uint32_t description;
   118 	uint32_t url;
   119 	uint32_t license;
   120 	struct list_head properties;
   121 	struct list_head files;
   122 };
   123 
   124 
   125 struct razor_property {
   126 	uint32_t name;
   127 	uint32_t flags;
   128 	uint32_t version;
   129 	struct list_head packages;
   130 };
   131 
   132 struct razor_entry {
   133 	uint32_t name  : 24;
   134 	uint32_t flags : 8;
   135 	uint32_t start;
   136 	struct list_head packages;
   137 };
   138 
   139 #define RAZOR_ENTRY_LAST	0x80
   140 
   141 struct razor_set {
   142 	struct array string_pool;
   143  	struct array packages;
   144  	struct array properties;
   145  	struct array files;
   146 	struct array package_pool;
   147  	struct array property_pool;
   148  	struct array file_pool;
   149 	struct array file_string_pool;
   150 	struct array details_string_pool;
   151 
   152 	struct razor_set_header *header;
   153 	size_t header_size;
   154 
   155 	struct razor_set_header *details_header;
   156 	size_t details_header_size;
   157 
   158 	struct razor_set_header *files_header;
   159 	size_t files_header_size;
   160 };
   161 
   162 struct import_entry {
   163 	uint32_t package;
   164 	char *name;
   165 };
   166 
   167 struct import_directory {
   168 	uint32_t name, count;
   169 	struct array files;
   170 	struct array packages;
   171 	struct import_directory *last;
   172 };
   173 
   174 struct razor_importer {
   175 	struct razor_set *set;
   176 	struct hashtable table;
   177 	struct hashtable file_table;
   178 	struct hashtable details_table;
   179 	struct razor_package *package;
   180 	struct array properties;
   181 	struct array files;
   182 	struct array file_requires;
   183 };
   184 
   185 struct razor_package_iterator {
   186 	struct razor_set *set;
   187 	struct razor_package *package, *end;
   188 	struct list *index;
   189 	int free_index;
   190 };
   191 
   192 void
   193 razor_package_iterator_init_for_property(struct razor_package_iterator *pi,
   194 					 struct razor_set *set,
   195 					 struct razor_property *property);
   196 
   197 struct razor_property_iterator {
   198 	struct razor_set *set;
   199 	struct razor_property *property, *end;
   200 	struct list *index;
   201 };
   202 
   203 struct razor_entry *
   204 razor_set_find_entry(struct razor_set *set,
   205 		     struct razor_entry *dir, const char *pattern);
   206 
   207 struct razor_merger *
   208 razor_merger_create(struct razor_set *set1, struct razor_set *set2);
   209 void
   210 razor_merger_add_package(struct razor_merger *merger,
   211 			 struct razor_package *package);
   212 struct razor_set *
   213 razor_merger_finish(struct razor_merger *merger);
   214 
   215 /* Utility functions */
   216 
   217 void
   218 razor_package_get_details_varg(struct razor_set *set,
   219 			       struct razor_package *package,
   220 			       va_list args);
   221 
   222 int razor_create_dir(const char *root, const char *path);
   223 int razor_write(int fd, const void *data, size_t size);
   224 
   225 
   226 typedef int (*razor_compare_with_data_func_t)(const void *p1,
   227 					      const void *p,
   228 					      void *data);
   229 uint32_t *
   230 razor_qsort_with_data(void *base, size_t nelem, size_t size,
   231 		      razor_compare_with_data_func_t compare, void *data);
   232 
   233 #endif /* _RAZOR_INTERNAL_H_ */