1.1 --- a/main.c Sun Jun 15 11:21:24 2008 -0400
1.2 +++ b/main.c Sun Jun 15 18:16:20 2008 -0400
1.3 @@ -140,6 +140,7 @@
1.4 struct razor_set *set;
1.5
1.6 set = razor_set_open(repo_filename);
1.7 + razor_set_open_files(set, "system-files.repo");
1.8 if (set == NULL)
1.9 return 1;
1.10 razor_set_list_files(set, argv[0]);
1.11 @@ -157,6 +158,7 @@
1.12 const char *name, *version, *arch;
1.13
1.14 set = razor_set_open(repo_filename);
1.15 + razor_set_open_files(set, "system-files.repo");
1.16 if (set == NULL)
1.17 return 1;
1.18
1.19 @@ -177,6 +179,7 @@
1.20 struct razor_set *set;
1.21
1.22 set = razor_set_open(repo_filename);
1.23 + razor_set_open_files(set, "system-files.repo");
1.24 if (set == NULL)
1.25 return 1;
1.26 razor_set_list_package_files(set, argv[0]);
1.27 @@ -338,7 +341,9 @@
1.28 set = razor_set_create_from_yum();
1.29 if (set == NULL)
1.30 return 1;
1.31 - razor_set_write(set, rawhide_repo_filename);
1.32 + razor_set_write(set, rawhide_repo_filename, RAZOR_REPO_FILE_MAIN);
1.33 + razor_set_write(set, "rawhide-details.repo", RAZOR_REPO_FILE_DETAILS);
1.34 + razor_set_write(set, "rawhide-files.repo", RAZOR_REPO_FILE_FILES);
1.35 razor_set_destroy(set);
1.36 printf("wrote %s\n", rawhide_repo_filename);
1.37
1.38 @@ -353,7 +358,9 @@
1.39 set = razor_set_create_from_rpmdb();
1.40 if (set == NULL)
1.41 return 1;
1.42 - razor_set_write(set, repo_filename);
1.43 + razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN);
1.44 + razor_set_write(set, "system-details.repo", RAZOR_REPO_FILE_DETAILS);
1.45 + razor_set_write(set, "system-files.repo", RAZOR_REPO_FILE_FILES);
1.46 razor_set_destroy(set);
1.47 printf("wrote %s\n", repo_filename);
1.48
1.49 @@ -445,7 +452,7 @@
1.50 return 1;
1.51
1.52 set = razor_transaction_finish(trans);
1.53 - razor_set_write(set, updated_repo_filename);
1.54 + razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
1.55 razor_set_destroy(set);
1.56 razor_set_destroy(upstream);
1.57 printf("wrote system-updated.repo\n");
1.58 @@ -477,7 +484,7 @@
1.59 return 1;
1.60
1.61 set = razor_transaction_finish(trans);
1.62 - razor_set_write(set, updated_repo_filename);
1.63 + razor_set_write(set, updated_repo_filename, RAZOR_REPO_FILE_MAIN);
1.64 razor_set_destroy(set);
1.65 printf("wrote system-updated.repo\n");
1.66
1.67 @@ -564,7 +571,7 @@
1.68
1.69 set = razor_importer_finish(importer);
1.70
1.71 - razor_set_write(set, repo_filename);
1.72 + razor_set_write(set, repo_filename, RAZOR_REPO_FILE_MAIN);
1.73 razor_set_destroy(set);
1.74 printf("wrote %s\n", repo_filename);
1.75
1.76 @@ -695,7 +702,7 @@
1.77
1.78 next = razor_transaction_finish(trans);
1.79
1.80 - razor_set_write_to_fd(next, fd);
1.81 + razor_set_write_to_fd(next, fd, RAZOR_REPO_FILE_MAIN);
1.82 printf("wrote %s\n", new_path);
1.83
1.84 if (mkdir("rpms", 0777) && errno != EEXIST) {
1.85 @@ -758,7 +765,7 @@
1.86 set = razor_set_create();
1.87 snprintf(path, sizeof path, "%s%s/%s",
1.88 root, razor_root_path, system_repo_filename);
1.89 - if (razor_set_write(set, path) < 0) {
1.90 + if (razor_set_write(set, path, RAZOR_REPO_FILE_MAIN) < 0) {
1.91 fprintf(stderr, "could not write initial package set\n");
1.92 return -1;
1.93 }
1.94 @@ -820,6 +827,7 @@
1.95 const char *summary, *description, *url, *license;
1.96
1.97 set = razor_set_open(repo_filename);
1.98 + razor_set_open_details(set, "system-details.repo");
1.99 pi = razor_package_iterator_create(set);
1.100 while (razor_package_iterator_next(pi, &package,
1.101 &name, &version, &arch)) {
2.1 --- a/razor.c Sun Jun 15 11:21:24 2008 -0400
2.2 +++ b/razor.c Sun Jun 15 18:16:20 2008 -0400
2.3 @@ -49,18 +49,22 @@
2.4 struct razor_set_section sections[0];
2.5 };
2.6
2.7 -#define RAZOR_MAGIC 0x7a7a7a7a
2.8 +#define RAZOR_MAGIC 0x7a7a7a7a
2.9 +#define RAZOR_DETAILS_MAGIC 0x7a7a7a7b
2.10 +#define RAZOR_FILES_MAGIC 0x7a7a7a7c
2.11 #define RAZOR_VERSION 1
2.12
2.13 #define RAZOR_STRING_POOL 0
2.14 #define RAZOR_PACKAGES 1
2.15 #define RAZOR_PROPERTIES 2
2.16 -#define RAZOR_FILES 3
2.17 -#define RAZOR_PACKAGE_POOL 4
2.18 -#define RAZOR_PROPERTY_POOL 5
2.19 -#define RAZOR_FILE_POOL 6
2.20 -#define RAZOR_FILE_STRING_POOL 7
2.21 -#define RAZOR_DETAILS_STRING_POOL 8
2.22 +#define RAZOR_PACKAGE_POOL 3
2.23 +#define RAZOR_PROPERTY_POOL 4
2.24 +
2.25 +#define RAZOR_DETAILS_STRING_POOL 0
2.26 +
2.27 +#define RAZOR_FILES 0
2.28 +#define RAZOR_FILE_POOL 1
2.29 +#define RAZOR_FILE_STRING_POOL 2
2.30
2.31 struct razor_package {
2.32 uint name : 24;
2.33 @@ -104,6 +108,8 @@
2.34 struct array file_string_pool;
2.35 struct array details_string_pool;
2.36 struct razor_set_header *header;
2.37 + struct razor_set_header *details_header;
2.38 + struct razor_set_header *files_header;
2.39 };
2.40
2.41 struct import_entry {
2.42 @@ -144,11 +150,17 @@
2.43 { RAZOR_STRING_POOL, offsetof(struct razor_set, string_pool) },
2.44 { RAZOR_PACKAGES, offsetof(struct razor_set, packages) },
2.45 { RAZOR_PROPERTIES, offsetof(struct razor_set, properties) },
2.46 - { RAZOR_FILES, offsetof(struct razor_set, files) },
2.47 { RAZOR_PACKAGE_POOL, offsetof(struct razor_set, package_pool) },
2.48 { RAZOR_PROPERTY_POOL, offsetof(struct razor_set, property_pool) },
2.49 +};
2.50 +
2.51 +struct razor_set_section razor_files_sections[] = {
2.52 + { RAZOR_FILES, offsetof(struct razor_set, files) },
2.53 { RAZOR_FILE_POOL, offsetof(struct razor_set, file_pool) },
2.54 { RAZOR_FILE_STRING_POOL, offsetof(struct razor_set, file_string_pool) },
2.55 +};
2.56 +
2.57 +struct razor_set_section razor_details_sections[] = {
2.58 { RAZOR_DETAILS_STRING_POOL, offsetof(struct razor_set, details_string_pool) },
2.59 };
2.60
2.61 @@ -229,11 +241,93 @@
2.62 }
2.63 }
2.64
2.65 + if (set->details_header) {
2.66 + for (i = 0; set->details_header->sections[i].type; i++)
2.67 + ;
2.68 + size = set->details_header->sections[i].type;
2.69 + munmap(set->details_header, size);
2.70 + } else {
2.71 + for (i = 0; i < ARRAY_SIZE(razor_details_sections); i++) {
2.72 + a = (void *) set + razor_details_sections[i].offset;
2.73 + free(a->data);
2.74 + }
2.75 + }
2.76 +
2.77 + if (set->files_header) {
2.78 + for (i = 0; set->files_header->sections[i].type; i++)
2.79 + ;
2.80 + size = set->files_header->sections[i].type;
2.81 + munmap(set->files_header, size);
2.82 + } else {
2.83 + for (i = 0; i < ARRAY_SIZE(razor_files_sections); i++) {
2.84 + a = (void *) set + razor_files_sections[i].offset;
2.85 + free(a->data);
2.86 + }
2.87 + }
2.88 +
2.89 free(set);
2.90 }
2.91
2.92 -int
2.93 -razor_set_write_to_fd(struct razor_set *set, int fd)
2.94 +void
2.95 +razor_set_open_details(struct razor_set *set, const char *filename)
2.96 +{
2.97 + struct razor_set_section *s;
2.98 + struct stat stat;
2.99 + struct array *array;
2.100 + int fd;
2.101 +
2.102 + fd = open(filename, O_RDONLY);
2.103 + if (fstat(fd, &stat) < 0)
2.104 + return;
2.105 + set->details_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
2.106 + if (set->details_header == MAP_FAILED)
2.107 + return;
2.108 +
2.109 + for (s = set->details_header->sections; ~s->type; s++) {
2.110 + if (s->type >= ARRAY_SIZE(razor_details_sections))
2.111 + continue;
2.112 + if (s->type != razor_details_sections[s->type].type)
2.113 + continue;
2.114 + array = (void *) set + razor_details_sections[s->type].offset;
2.115 + array->data = (void *) set->details_header + s->offset;
2.116 + array->size = s->size;
2.117 + array->alloc = s->size;
2.118 + }
2.119 + close(fd);
2.120 +}
2.121 +
2.122 +void
2.123 +razor_set_open_files(struct razor_set *set, const char *filename)
2.124 +{
2.125 + struct razor_set_section *s;
2.126 + struct stat stat;
2.127 + struct array *array;
2.128 + int fd;
2.129 +
2.130 + fd = open(filename, O_RDONLY);
2.131 + if (fstat(fd, &stat) < 0)
2.132 + return;
2.133 + set->files_header = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
2.134 + if (set->files_header == MAP_FAILED)
2.135 + return;
2.136 +
2.137 + for (s = set->files_header->sections; ~s->type; s++) {
2.138 + if (s->type >= ARRAY_SIZE(razor_files_sections))
2.139 + continue;
2.140 + if (s->type != razor_files_sections[s->type].type)
2.141 + continue;
2.142 + array = (void *) set + razor_files_sections[s->type].offset;
2.143 + array->data = (void *) set->files_header + s->offset;
2.144 + array->size = s->size;
2.145 + array->alloc = s->size;
2.146 + }
2.147 + close(fd);
2.148 +}
2.149 +
2.150 +static int
2.151 +razor_set_write_sections_to_fd(struct razor_set *set, int fd, int magic,
2.152 + struct razor_set_section *sections,
2.153 + size_t array_size)
2.154 {
2.155 char data[4096];
2.156 struct razor_set_header *header = (struct razor_set_header *) data;
2.157 @@ -242,14 +336,14 @@
2.158 int i;
2.159
2.160 memset(data, 0, sizeof data);
2.161 - header->magic = RAZOR_MAGIC;
2.162 + header->magic = magic;
2.163 header->version = RAZOR_VERSION;
2.164 offset = sizeof data;
2.165
2.166 - for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
2.167 - if (razor_sections[i].type != i)
2.168 + for (i = 0; i < array_size; i++) {
2.169 + if (sections[i].type != i)
2.170 continue;
2.171 - a = (void *) set + razor_sections[i].offset;
2.172 + a = (void *) set + sections[i].offset;
2.173 header->sections[i].type = i;
2.174 header->sections[i].offset = offset;
2.175 header->sections[i].size = a->size;
2.176 @@ -262,10 +356,10 @@
2.177
2.178 razor_write(fd, data, sizeof data);
2.179 memset(data, 0, sizeof data);
2.180 - for (i = 0; i < ARRAY_SIZE(razor_sections); i++) {
2.181 - if (razor_sections[i].type != i)
2.182 + for (i = 0; i < array_size; i++) {
2.183 + if (sections[i].type != i)
2.184 continue;
2.185 - a = (void *) set + razor_sections[i].offset;
2.186 + a = (void *) set + sections[i].offset;
2.187 razor_write(fd, a->data, a->size);
2.188 razor_write(fd, data, ALIGN(a->size, 4096) - a->size);
2.189 }
2.190 @@ -274,7 +368,31 @@
2.191 }
2.192
2.193 int
2.194 -razor_set_write(struct razor_set *set, const char *filename)
2.195 +razor_set_write_to_fd(struct razor_set *set, int fd,
2.196 + enum razor_repo_file_type type)
2.197 +{
2.198 + switch (type) {
2.199 + case RAZOR_REPO_FILE_MAIN:
2.200 + return razor_set_write_sections_to_fd(set, fd, RAZOR_MAGIC,
2.201 + razor_sections,
2.202 + ARRAY_SIZE(razor_sections));
2.203 +
2.204 + case RAZOR_REPO_FILE_DETAILS:
2.205 + return razor_set_write_sections_to_fd(set, fd, RAZOR_DETAILS_MAGIC,
2.206 + razor_details_sections,
2.207 + ARRAY_SIZE(razor_details_sections));
2.208 + case RAZOR_REPO_FILE_FILES:
2.209 + return razor_set_write_sections_to_fd(set, fd, RAZOR_FILES_MAGIC,
2.210 + razor_files_sections,
2.211 + ARRAY_SIZE(razor_files_sections));
2.212 + default:
2.213 + return -1;
2.214 + }
2.215 +}
2.216 +
2.217 +int
2.218 +razor_set_write(struct razor_set *set, const char *filename,
2.219 + enum razor_repo_file_type type)
2.220 {
2.221 int fd, status;
2.222
2.223 @@ -282,7 +400,7 @@
2.224 if (fd < 0)
2.225 return -1;
2.226
2.227 - status = razor_set_write_to_fd(set, fd);
2.228 + status = razor_set_write_to_fd(set, fd, type);
2.229 if (status) {
2.230 close(fd);
2.231 return status;
3.1 --- a/razor.h Sun Jun 15 11:21:24 2008 -0400
3.2 +++ b/razor.h Sun Jun 15 18:16:20 2008 -0400
3.3 @@ -26,6 +26,12 @@
3.4 struct razor_package;
3.5 struct razor_property;
3.6
3.7 +enum razor_repo_file_type {
3.8 + RAZOR_REPO_FILE_MAIN,
3.9 + RAZOR_REPO_FILE_DETAILS,
3.10 + RAZOR_REPO_FILE_FILES
3.11 +};
3.12 +
3.13 enum razor_property_type {
3.14 RAZOR_PROPERTY_REQUIRES,
3.15 RAZOR_PROPERTY_PROVIDES,
3.16 @@ -45,8 +51,13 @@
3.17 struct razor_set *razor_set_create(void);
3.18 struct razor_set *razor_set_open(const char *filename);
3.19 void razor_set_destroy(struct razor_set *set);
3.20 -int razor_set_write_to_fd(struct razor_set *set, int fd);
3.21 -int razor_set_write(struct razor_set *set, const char *filename);
3.22 +int razor_set_write_to_fd(struct razor_set *set, int fd,
3.23 + enum razor_repo_file_type type);
3.24 +int razor_set_write(struct razor_set *set, const char *filename,
3.25 + enum razor_repo_file_type type);
3.26 +
3.27 +void razor_set_open_details(struct razor_set *set, const char *filename);
3.28 +void razor_set_open_files(struct razor_set *set, const char *filename);
3.29
3.30 struct razor_package *
3.31 razor_set_get_package(struct razor_set *set, const char *package);