Refactor the import interface and make it opaque.
1.1 --- a/import.c Wed Sep 19 14:34:11 2007 -0400
1.2 +++ b/import.c Wed Sep 19 15:26:25 2007 -0400
1.3 @@ -15,7 +15,7 @@
1.4 #include "razor.h"
1.5
1.6 static void
1.7 -parse_package(struct import_context *ctx, const char **atts, void *data)
1.8 +parse_package(struct razor_importer *importer, const char **atts, void *data)
1.9 {
1.10 const char *name = NULL, *version = NULL;
1.11 int i;
1.12 @@ -33,11 +33,15 @@
1.13 return;
1.14 }
1.15
1.16 - import_context_add_package(ctx, name, version);
1.17 + razor_importer_begin_package(importer, name, version);
1.18 }
1.19
1.20 +enum {
1.21 + RZR_REQUIRES, RZR_PROVIDES
1.22 +};
1.23 +
1.24 static void
1.25 -parse_property(struct import_context *ctx, const char **atts, void *data)
1.26 +parse_property(struct razor_importer *importer, const char **atts, void *data)
1.27 {
1.28 const char *name = NULL, *version = NULL;
1.29 int i;
1.30 @@ -54,33 +58,40 @@
1.31 return;
1.32 }
1.33
1.34 - import_context_add_property(ctx, data, name, version);
1.35 + switch ((int) data) {
1.36 + case RZR_REQUIRES:
1.37 + razor_importer_add_requires(importer, name, version);
1.38 + break;
1.39 + case RZR_PROVIDES:
1.40 + razor_importer_add_provides(importer, name, version);
1.41 + break;
1.42 + }
1.43 }
1.44
1.45 static void
1.46 start_element(void *data, const char *name, const char **atts)
1.47 {
1.48 - struct import_context *ctx = data;
1.49 + struct razor_importer *importer = data;
1.50
1.51 if (strcmp(name, "package") == 0)
1.52 - parse_package(ctx, atts, NULL);
1.53 + parse_package(importer, atts, NULL);
1.54 else if (strcmp(name, "requires") == 0)
1.55 - parse_property(ctx, atts, &ctx->requires);
1.56 + parse_property(importer, atts, (void *) RZR_REQUIRES);
1.57 else if (strcmp(name, "provides") == 0)
1.58 - parse_property(ctx, atts, &ctx->provides);
1.59 + parse_property(importer, atts, (void*) RZR_PROVIDES);
1.60 }
1.61
1.62 static void
1.63 end_element (void *data, const char *name)
1.64 {
1.65 - struct import_context *ctx = data;
1.66 + struct razor_importer *importer = data;
1.67
1.68 if (strcmp(name, "package") == 0)
1.69 - import_context_finish_package(ctx);
1.70 + razor_importer_finish_package(importer);
1.71 }
1.72
1.73 static int
1.74 -import_rzr_file(struct import_context *ctx, const char *filename)
1.75 +import_rzr_file(struct razor_importer *importer, const char *filename)
1.76 {
1.77 SHA_CTX sha1;
1.78 XML_Parser parser;
1.79 @@ -97,7 +108,7 @@
1.80 return -1;
1.81
1.82 parser = XML_ParserCreate(NULL);
1.83 - XML_SetUserData(parser, ctx);
1.84 + XML_SetUserData(parser, importer);
1.85 XML_SetElementHandler(parser, start_element, end_element);
1.86 if (XML_Parse(parser, p, stat.st_size, 1) == XML_STATUS_ERROR) {
1.87 fprintf(stderr,
1.88 @@ -124,30 +135,32 @@
1.89 struct razor_set *
1.90 razor_import_rzr_files(int count, const char *files[])
1.91 {
1.92 - struct import_context ctx;
1.93 + struct razor_importer *importer;
1.94 int i;
1.95
1.96 - razor_prepare_import(&ctx);
1.97 + importer = razor_importer_new();
1.98
1.99 for (i = 0; i < count; i++) {
1.100 - if (import_rzr_file(&ctx, files[i]) < 0) {
1.101 + if (import_rzr_file(importer, files[i]) < 0) {
1.102 fprintf(stderr, "failed to import %s\n", files[i]);
1.103 exit(-1);
1.104 }
1.105 }
1.106
1.107 - return razor_finish_import(&ctx);
1.108 + return razor_importer_finish(importer);
1.109 }
1.110
1.111 /* Import a yum filelist as a razor package set. */
1.112
1.113 enum {
1.114 YUM_STATE_BEGIN,
1.115 - YUM_STATE_PACKAGE_NAME
1.116 + YUM_STATE_PACKAGE_NAME,
1.117 + YUM_STATE_REQUIRES,
1.118 + YUM_STATE_PROVIDES
1.119 };
1.120
1.121 struct yum_context {
1.122 - struct import_context ctx;
1.123 + struct razor_importer *importer;
1.124 struct import_property_context *current_property_context;
1.125 char *name;
1.126 int state;
1.127 @@ -168,13 +181,13 @@
1.128 if (strcmp(atts[i], "ver") == 0)
1.129 version = atts[i + 1];
1.130 }
1.131 - import_context_add_package(&ctx->ctx, ctx->name, version);
1.132 + razor_importer_begin_package(ctx->importer, ctx->name, version);
1.133 } else if (strcmp(name, "rpm:requires") == 0) {
1.134 - ctx->current_property_context = &ctx->ctx.requires;
1.135 + ctx->state = YUM_STATE_REQUIRES;
1.136 } else if (strcmp(name, "rpm:provides") == 0) {
1.137 - ctx->current_property_context = &ctx->ctx.provides;
1.138 + ctx->state = YUM_STATE_PROVIDES;
1.139 } else if (strcmp(name, "rpm:entry") == 0 &&
1.140 - ctx->current_property_context != NULL) {
1.141 + ctx->state != YUM_STATE_BEGIN) {
1.142 n = NULL;
1.143 version = NULL;
1.144 for (i = 0; atts[i]; i += 2) {
1.145 @@ -190,9 +203,15 @@
1.146 return;
1.147 }
1.148
1.149 - import_context_add_property(&ctx->ctx,
1.150 - ctx->current_property_context,
1.151 - n, version);
1.152 + switch (ctx->state) {
1.153 + case YUM_STATE_REQUIRES:
1.154 + razor_importer_add_requires(ctx->importer, n, version);
1.155 + break;
1.156 + case YUM_STATE_PROVIDES:
1.157 + razor_importer_add_provides(ctx->importer, n, version);
1.158 + break;
1.159 + }
1.160 +
1.161 }
1.162 }
1.163
1.164 @@ -203,13 +222,13 @@
1.165
1.166 if (strcmp(name, "package") == 0) {
1.167 free(ctx->name);
1.168 - import_context_finish_package(&ctx->ctx);
1.169 + razor_importer_finish_package(ctx->importer);
1.170 } else if (strcmp(name, "name") == 0) {
1.171 - ctx->state = 0;
1.172 + ctx->state = YUM_STATE_BEGIN;
1.173 } else if (strcmp(name, "rpm:requires") == 0) {
1.174 - ctx->current_property_context = NULL;
1.175 + ctx->state = YUM_STATE_BEGIN;
1.176 } else if (strcmp(name, "rpm:provides") == 0) {
1.177 - ctx->current_property_context = NULL;
1.178 + ctx->state = YUM_STATE_BEGIN;
1.179 }
1.180 }
1.181
1.182 @@ -230,7 +249,7 @@
1.183 char buf[4096];
1.184 int len;
1.185
1.186 - razor_prepare_import(&ctx.ctx);
1.187 + ctx.importer = razor_importer_new();
1.188
1.189 parser = XML_ParserCreate(NULL);
1.190 XML_SetUserData(parser, &ctx);
1.191 @@ -257,13 +276,13 @@
1.192
1.193 XML_ParserFree(parser);
1.194
1.195 - return razor_finish_import(&ctx.ctx);
1.196 + return razor_importer_finish(ctx.importer);
1.197 }
1.198
1.199 struct razor_set *
1.200 razor_set_create_from_rpmdb(void)
1.201 {
1.202 - struct import_context ctx;
1.203 + struct razor_importer *importer;
1.204 rpmdbMatchIterator iter;
1.205 Header h;
1.206 int_32 type, count, i;
1.207 @@ -278,7 +297,7 @@
1.208 exit(1);
1.209 }
1.210
1.211 - razor_prepare_import(&ctx);
1.212 + importer = razor_importer_new();
1.213
1.214 iter = rpmdbInitIterator(db, 0, NULL, 0);
1.215 while (h = rpmdbNextIterator(iter), h != NULL) {
1.216 @@ -288,16 +307,14 @@
1.217 (void **) &version, &count);
1.218 headerGetEntry(h, RPMTAG_RELEASE, &type,
1.219 (void **) &release, &count);
1.220 - import_context_add_package(&ctx, name, version);
1.221 -
1.222 + razor_importer_begin_package(importer, name, version);
1.223
1.224 headerGetEntry(h, RPMTAG_REQUIRES, &type,
1.225 (void **) &properties, &count);
1.226 headerGetEntry(h, RPMTAG_REQUIREVERSION, &type,
1.227 (void **) &property_versions, &count);
1.228 for (i = 0; i < count; i++)
1.229 - import_context_add_property(&ctx,
1.230 - &ctx.requires,
1.231 + razor_importer_add_requires(importer,
1.232 properties[i],
1.233 property_versions[i]);
1.234
1.235 @@ -306,15 +323,14 @@
1.236 headerGetEntry(h, RPMTAG_PROVIDEVERSION, &type,
1.237 (void **) &property_versions, &count);
1.238 for (i = 0; i < count; i++)
1.239 - import_context_add_property(&ctx,
1.240 - &ctx.provides,
1.241 + razor_importer_add_provides(importer,
1.242 properties[i],
1.243 property_versions[i]);
1.244
1.245 - import_context_finish_package(&ctx);
1.246 + razor_importer_finish_package(importer);
1.247 }
1.248
1.249 rpmdbClose(db);
1.250
1.251 - return razor_finish_import(&ctx);
1.252 + return razor_importer_finish(importer);
1.253 }
2.1 --- a/razor.c Wed Sep 19 14:34:11 2007 -0400
2.2 +++ b/razor.c Wed Sep 19 15:26:25 2007 -0400
2.3 @@ -13,6 +13,71 @@
2.4
2.5 #include "razor.h"
2.6
2.7 +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
2.8 +
2.9 +struct array {
2.10 + void *data;
2.11 + int size, alloc;
2.12 +};
2.13 +
2.14 +struct razor_set_section {
2.15 + unsigned int type;
2.16 + unsigned int offset;
2.17 + unsigned int size;
2.18 +};
2.19 +
2.20 +struct razor_set_header {
2.21 + unsigned int magic;
2.22 + unsigned int version;
2.23 + struct razor_set_section sections[0];
2.24 +};
2.25 +
2.26 +#define RAZOR_MAGIC 0x7a7a7a7a
2.27 +#define RAZOR_VERSION 1
2.28 +
2.29 +#define RAZOR_PACKAGES 0
2.30 +#define RAZOR_REQUIRES 1
2.31 +#define RAZOR_PROVIDES 2
2.32 +#define RAZOR_STRING_POOL 3
2.33 +#define RAZOR_PROPERTY_POOL 4
2.34 +
2.35 +struct razor_package {
2.36 + unsigned long name;
2.37 + unsigned long version;
2.38 + unsigned long requires;
2.39 + unsigned long provides;
2.40 +};
2.41 +
2.42 +struct razor_property {
2.43 + unsigned long name;
2.44 + unsigned long version;
2.45 + unsigned long packages;
2.46 +};
2.47 +
2.48 +struct razor_set {
2.49 + struct array buckets;
2.50 + struct array string_pool;
2.51 + struct array property_pool;
2.52 + struct array packages;
2.53 + struct array requires;
2.54 + struct array provides;
2.55 + struct razor_set_header *header;
2.56 +};
2.57 +
2.58 +struct import_property_context {
2.59 + struct array *all;
2.60 + struct array package;
2.61 +};
2.62 +
2.63 +struct razor_importer {
2.64 + struct razor_set *set;
2.65 + struct import_property_context requires;
2.66 + struct import_property_context provides;
2.67 + struct razor_package *package;
2.68 + unsigned long *requires_map;
2.69 + unsigned long *provides_map;
2.70 +};
2.71 +
2.72 static void
2.73 array_init(struct array *array)
2.74 {
2.75 @@ -305,7 +370,7 @@
2.76 return value;
2.77 }
2.78
2.79 -unsigned long
2.80 +static unsigned long
2.81 razor_set_tokenize(struct razor_set *set, const char *string)
2.82 {
2.83 unsigned long token;
2.84 @@ -321,35 +386,37 @@
2.85 }
2.86
2.87 void
2.88 -import_context_add_package(struct import_context *ctx,
2.89 - const char *name, const char *version)
2.90 +razor_importer_begin_package(struct razor_importer *importer,
2.91 + const char *name, const char *version)
2.92 {
2.93 struct razor_package *p;
2.94
2.95 - p = array_add(&ctx->set->packages, sizeof *p);
2.96 - p->name = razor_set_tokenize(ctx->set, name);
2.97 - p->version = razor_set_tokenize(ctx->set, version);
2.98 + p = array_add(&importer->set->packages, sizeof *p);
2.99 + p->name = razor_set_tokenize(importer->set, name);
2.100 + p->version = razor_set_tokenize(importer->set, version);
2.101
2.102 - ctx->package = p;
2.103 - array_init(&ctx->requires.package);
2.104 - array_init(&ctx->provides.package);
2.105 + importer->package = p;
2.106 + array_init(&importer->requires.package);
2.107 + array_init(&importer->provides.package);
2.108 }
2.109
2.110 void
2.111 -import_context_finish_package(struct import_context *ctx)
2.112 +razor_importer_finish_package(struct razor_importer *importer)
2.113 {
2.114 struct razor_package *p;
2.115
2.116 - p = ctx->package;
2.117 - p->requires = add_to_property_pool(ctx->set, &ctx->requires.package);
2.118 - p->provides = add_to_property_pool(ctx->set, &ctx->provides.package);
2.119 + p = importer->package;
2.120 + p->requires = add_to_property_pool(importer->set,
2.121 + &importer->requires.package);
2.122 + p->provides = add_to_property_pool(importer->set,
2.123 + &importer->provides.package);
2.124
2.125 - array_release(&ctx->requires.package);
2.126 - array_release(&ctx->provides.package);
2.127 + array_release(&importer->requires.package);
2.128 + array_release(&importer->provides.package);
2.129 }
2.130
2.131 -void
2.132 -import_context_add_property(struct import_context *ctx,
2.133 +static void
2.134 +razor_importer_add_property(struct razor_importer *importer,
2.135 struct import_property_context *pctx,
2.136 const char *name, const char *version)
2.137 {
2.138 @@ -357,22 +424,42 @@
2.139 unsigned long *r;
2.140
2.141 p = array_add(pctx->all, sizeof *p);
2.142 - p->name = razor_set_tokenize(ctx->set, name);
2.143 - p->version = razor_set_tokenize(ctx->set, version);
2.144 - p->packages = ctx->package -
2.145 - (struct razor_package *) ctx->set->packages.data;
2.146 + p->name = razor_set_tokenize(importer->set, name);
2.147 + p->version = razor_set_tokenize(importer->set, version);
2.148 + p->packages = importer->package -
2.149 + (struct razor_package *) importer->set->packages.data;
2.150
2.151 r = array_add(&pctx->package, sizeof *r);
2.152 *r = p - (struct razor_property *) pctx->all->data;
2.153 }
2.154
2.155 void
2.156 -razor_prepare_import(struct import_context *ctx)
2.157 +razor_importer_add_requires(struct razor_importer *importer,
2.158 + const char *name, const char *version)
2.159 {
2.160 - memset(ctx, 0, sizeof *ctx);
2.161 - ctx->set = razor_set_create();
2.162 - ctx->requires.all = &ctx->set->requires;
2.163 - ctx->provides.all = &ctx->set->provides;
2.164 + razor_importer_add_property(importer,
2.165 + &importer->requires, name, version);
2.166 +}
2.167 +
2.168 +void
2.169 +razor_importer_add_provides(struct razor_importer *importer,
2.170 + const char *name, const char *version)
2.171 +{
2.172 + razor_importer_add_property(importer,
2.173 + &importer->provides, name, version);
2.174 +}
2.175 +
2.176 +struct razor_importer *
2.177 +razor_importer_new(void)
2.178 +{
2.179 + struct razor_importer *importer;
2.180 +
2.181 + importer = zalloc(sizeof *importer);
2.182 + importer->set = razor_set_create();
2.183 + importer->requires.all = &importer->set->requires;
2.184 + importer->provides.all = &importer->set->provides;
2.185 +
2.186 + return importer;
2.187 }
2.188
2.189 typedef int (*compare_with_data_func_t)(const void *p1,
2.190 @@ -541,33 +628,33 @@
2.191 }
2.192
2.193 static void
2.194 -remap_package_links(struct import_context *ctx)
2.195 +remap_package_links(struct razor_importer *importer)
2.196 {
2.197 struct razor_package *p, *end;
2.198 unsigned long *pool, *r;
2.199
2.200 - pool = ctx->set->property_pool.data;
2.201 - end = ctx->set->packages.data + ctx->set->packages.size;
2.202 - for (p = ctx->set->packages.data; p < end; p++) {
2.203 + pool = importer->set->property_pool.data;
2.204 + end = importer->set->packages.data + importer->set->packages.size;
2.205 + for (p = importer->set->packages.data; p < end; p++) {
2.206 for (r = &pool[p->requires]; ~*r; r++)
2.207 - *r = ctx->requires_map[*r];
2.208 + *r = importer->requires_map[*r];
2.209 for (r = &pool[p->provides]; ~*r; r++)
2.210 - *r = ctx->provides_map[*r];
2.211 + *r = importer->provides_map[*r];
2.212 }
2.213 }
2.214
2.215 static void
2.216 -remap_property_links(struct import_context *ctx, unsigned long *map)
2.217 +remap_property_links(struct razor_importer *importer, unsigned long *map)
2.218 {
2.219 struct razor_property *p, *end;
2.220 struct razor_package *rp;
2.221 unsigned long *pool, *r, *rmap;
2.222 int i, count;
2.223
2.224 - pool = ctx->set->property_pool.data;
2.225 - count = ctx->set->packages.size / sizeof(struct razor_package);
2.226 + pool = importer->set->property_pool.data;
2.227 + count = importer->set->packages.size / sizeof(struct razor_package);
2.228 rmap = malloc(count * sizeof *map);
2.229 - rp = ctx->set->packages.data;
2.230 + rp = importer->set->packages.data;
2.231 for (i = 0; i < count; i++)
2.232 rmap[map[i]] = i;
2.233
2.234 @@ -578,13 +665,13 @@
2.235 * a flat pool. Right now, as property lists and package
2.236 * lists are mixed, we can't do that. */
2.237
2.238 - end = ctx->set->requires.data + ctx->set->requires.size;
2.239 - for (p = ctx->set->requires.data; p < end; p++)
2.240 + end = importer->set->requires.data + importer->set->requires.size;
2.241 + for (p = importer->set->requires.data; p < end; p++)
2.242 for (r = &pool[p->packages]; ~*r; r++)
2.243 *r = rmap[*r];
2.244
2.245 - end = ctx->set->provides.data + ctx->set->provides.size;
2.246 - for (p = ctx->set->provides.data; p < end; p++)
2.247 + end = importer->set->provides.data + importer->set->provides.size;
2.248 + for (p = importer->set->provides.data; p < end; p++)
2.249 for (r = &pool[p->packages]; ~*r; r++)
2.250 *r = rmap[*r];
2.251
2.252 @@ -592,27 +679,33 @@
2.253 }
2.254
2.255 struct razor_set *
2.256 -razor_finish_import(struct import_context *ctx)
2.257 +razor_importer_finish(struct razor_importer *importer)
2.258 {
2.259 + struct razor_set *set;
2.260 unsigned long *map;
2.261 int count;
2.262
2.263 - ctx->requires_map = uniqueify_properties(ctx->set, ctx->requires.all);
2.264 - ctx->provides_map = uniqueify_properties(ctx->set, ctx->provides.all);
2.265 - remap_package_links(ctx);
2.266 - free(ctx->requires_map);
2.267 - free(ctx->provides_map);
2.268 + importer->requires_map = uniqueify_properties(importer->set,
2.269 + importer->requires.all);
2.270 + importer->provides_map = uniqueify_properties(importer->set,
2.271 + importer->provides.all);
2.272 + remap_package_links(importer);
2.273 + free(importer->requires_map);
2.274 + free(importer->provides_map);
2.275
2.276 - count = ctx->set->packages.size / sizeof(struct razor_package);
2.277 - map = qsort_with_data(ctx->set->packages.data,
2.278 + count = importer->set->packages.size / sizeof(struct razor_package);
2.279 + map = qsort_with_data(importer->set->packages.data,
2.280 count,
2.281 sizeof(struct razor_package),
2.282 compare_packages,
2.283 - ctx->set);
2.284 - remap_property_links(ctx, map);
2.285 + importer->set);
2.286 + remap_property_links(importer, map);
2.287 free(map);
2.288
2.289 - return ctx->set;
2.290 + set = importer->set;
2.291 + free(importer);
2.292 +
2.293 + return set;
2.294 }
2.295
2.296 void
3.1 --- a/razor.h Wed Sep 19 14:34:11 2007 -0400
3.2 +++ b/razor.h Wed Sep 19 15:26:25 2007 -0400
3.3 @@ -1,81 +1,17 @@
3.4 #ifndef _RAZOR_H_
3.5 #define _RAZOR_H_
3.6
3.7 -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
3.8 +struct razor_importer;
3.9
3.10 -struct array {
3.11 - void *data;
3.12 - int size, alloc;
3.13 -};
3.14 -
3.15 -struct razor_set_section {
3.16 - unsigned int type;
3.17 - unsigned int offset;
3.18 - unsigned int size;
3.19 -};
3.20 -
3.21 -struct razor_set_header {
3.22 - unsigned int magic;
3.23 - unsigned int version;
3.24 - struct razor_set_section sections[0];
3.25 -};
3.26 -
3.27 -#define RAZOR_MAGIC 0x7a7a7a7a
3.28 -#define RAZOR_VERSION 1
3.29 -
3.30 -#define RAZOR_PACKAGES 0
3.31 -#define RAZOR_REQUIRES 1
3.32 -#define RAZOR_PROVIDES 2
3.33 -#define RAZOR_STRING_POOL 3
3.34 -#define RAZOR_PROPERTY_POOL 4
3.35 -
3.36 -struct razor_package {
3.37 - unsigned long name;
3.38 - unsigned long version;
3.39 - unsigned long requires;
3.40 - unsigned long provides;
3.41 -};
3.42 -
3.43 -struct razor_property {
3.44 - unsigned long name;
3.45 - unsigned long version;
3.46 - unsigned long packages;
3.47 -};
3.48 -
3.49 -struct razor_set {
3.50 - struct array buckets;
3.51 - struct array string_pool;
3.52 - struct array property_pool;
3.53 - struct array packages;
3.54 - struct array requires;
3.55 - struct array provides;
3.56 - struct razor_set_header *header;
3.57 -};
3.58 -
3.59 -struct import_property_context {
3.60 - struct array *all;
3.61 - struct array package;
3.62 -};
3.63 -
3.64 -struct import_context {
3.65 - struct razor_set *set;
3.66 - struct import_property_context requires;
3.67 - struct import_property_context provides;
3.68 - struct razor_package *package;
3.69 - unsigned long *requires_map;
3.70 - unsigned long *provides_map;
3.71 -};
3.72 -
3.73 -void import_context_add_package(struct import_context *ctx,
3.74 +struct razor_importer *razor_importer_new(void);
3.75 +void razor_importer_begin_package(struct razor_importer *importer,
3.76 const char *name, const char *version);
3.77 -void import_context_add_property(struct import_context *ctx,
3.78 - struct import_property_context *pctx,
3.79 +void razor_importer_add_requires(struct razor_importer *importer,
3.80 const char *name, const char *version);
3.81 -void import_context_finish_package(struct import_context *ctx);
3.82 -
3.83 -unsigned long razor_set_tokenize(struct razor_set *set, const char *string);
3.84 -void razor_prepare_import(struct import_context *ctx);
3.85 -struct razor_set *razor_finish_import(struct import_context *ctx);
3.86 +void razor_importer_add_provides(struct razor_importer *importer,
3.87 + const char *name, const char *version);
3.88 +void razor_importer_finish_package(struct razor_importer *importer);
3.89 +struct razor_set *razor_importer_finish(struct razor_importer *importer);
3.90
3.91 struct razor_set *razor_import_rzr_files(int count, const char **files);
3.92 struct razor_set *razor_set_create_from_yum_filelist(int fd);