--- /dev/null
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "razor.h"
+
+static const char *repo_filename = "system.repo";
+static const char rawhide_repo_filename[] = "rawhide.repo";
+
+static int
+command_list(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ razor_set_list(set);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_list_requires(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ razor_set_list_requires(set, argv[2]);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_list_provides(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ razor_set_list_provides(set, argv[2]);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_what_requires(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ razor_set_list_requires_packages(set, argv[2], argv[3]);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_what_provides(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ razor_set_list_provides_packages(set, argv[2], argv[3]);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_import_yum(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_create_from_yum_filelist(STDIN_FILENO);
+ if (set == NULL)
+ return 1;
+ razor_set_write(set, rawhide_repo_filename);
+ razor_set_destroy(set);
+ printf("wrote %s\n", rawhide_repo_filename);
+
+ return 0;
+}
+
+static int
+command_import_rpmdb(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_create_from_rpmdb();
+ if (set == NULL)
+ return 1;
+ razor_set_write(set, repo_filename);
+ razor_set_destroy(set);
+ printf("wrote %s\n", repo_filename);
+
+ return 0;
+}
+
+static int
+command_validate(int argc, const char *argv[])
+{
+ struct razor_set *set;
+
+ set = razor_set_open(repo_filename);
+ if (set == NULL)
+ return 1;
+ razor_set_list_unsatisfied(set);
+ razor_set_destroy(set);
+
+ return 0;
+}
+
+static int
+command_update(int argc, const char *argv[])
+{
+ struct razor_set *set, *upstream;
+
+ set = razor_set_open(repo_filename);
+ upstream = razor_set_open(rawhide_repo_filename);
+ if (set == NULL || upstream == NULL)
+ return 1;
+ set = razor_set_update(set, upstream, argc - 2, argv + 2);
+ razor_set_write(set, "system-updated.repo");
+ razor_set_destroy(set);
+ razor_set_destroy(upstream);
+ printf("wrote system-updated.repo\n");
+
+ return 0;
+}
+
+static struct {
+ const char *name;
+ const char *description;
+ int (*func)(int argc, const char *argv[]);
+} razor_commands[] = {
+ { "list", "list all packages", command_list },
+ { "list-requires", "list all requires or requires for the given package", command_list_requires },
+ { "list-provides", "list all provides or provides for the give package", command_list_provides },
+ { "what-requires", "list the packages that have the given requires", command_what_requires },
+ { "what-provides", "list the packages that have the given provides", command_what_provides },
+ { "import-yum", "import yum filelist.xml on stdin", command_import_yum },
+ { "import-rpmdb", "import the system rpm database", command_import_rpmdb },
+ { "validate", "validate a package set", command_validate },
+ { "update", "update all or specified packages", command_update }
+};
+
+static int
+usage(void)
+{
+ int i;
+
+ printf("usage:\n");
+ for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
+ printf(" %-20s%s\n",
+ razor_commands[i].name, razor_commands[i].description);
+
+ return 1;
+}
+
+int
+main(int argc, const char *argv[])
+{
+ char *repo;
+ int i;
+
+ repo = getenv("RAZOR_REPO");
+ if (repo != NULL)
+ repo_filename = repo;
+
+ if (argc < 2)
+ return usage();
+
+ for (i = 0; i < ARRAY_SIZE(razor_commands); i++)
+ if (strcmp(razor_commands[i].name, argv[1]) == 0)
+ return razor_commands[i].func(argc - 2, argv + 2);
+
+ return usage();
+}
#include "razor.h"
-#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
-
struct array {
void *data;
int size, alloc;
free(set);
}
-static int
+int
razor_set_write(struct razor_set *set, const char *filename)
{
char data[4096];
razor_set_list_all_properties(set, &set->provides);
}
-void
+static void
razor_set_list_property_packages(struct razor_set *set,
struct array *properties,
const char *name,
}
void
+razor_set_list_requires_packages(struct razor_set *set,
+ const char *name,
+ const char *version)
+{
+ razor_set_list_property_packages(set, &set->requires, name, version);
+}
+
+void
+razor_set_list_provides_packages(struct razor_set *set,
+ const char *name,
+ const char *version)
+{
+ razor_set_list_property_packages(set, &set->provides, name, version);
+}
+
+static void
razor_set_validate(struct razor_set *set, struct array *unsatisfied)
{
struct razor_property *r, *p, *rend, *pend;
int count, const char **packages)
{
struct razor_set *new;
- struct razor_package *p, *upackages;
+ struct razor_package *upackages;
struct array list, unsatisfied;
char *pool;
unsigned long *u, *end;
end = list.data + list.size;
upackages = upstream->packages.data;
pool = upstream->string_pool.data;
- for (u = list.data; u < end; u++) {
- p = upackages + *u;
- printf("package %s-%s set to be updated\n",
- &pool[p->name], &pool[p->version]);
- }
total += list.size / sizeof *u;
while (list.size > 0) {
- printf(" -- satisfying new requires\n");
-
new = razor_set_add(set, upstream, &list);
array_release(&list);
razor_set_destroy(set);
end = list.data + list.size;
upackages = upstream->packages.data;
pool = upstream->string_pool.data;
- for (u = list.data; u < end; u++) {
- p = upackages + *u;
- printf("package %s-%s set to be updated\n",
- &pool[p->name], &pool[p->version]);
- }
total += list.size / sizeof *u;
}
array_release(&list);
- printf("total of %d packages set to be updated\n", total);
-
return set;
}
-void
-razor_set_info(struct razor_set *set)
-{
- unsigned int offset, size;
- int i;
-
- for (i = 0; i < set->header->sections[i].type; i++) {
- offset = set->header->sections[i].offset;
- size = set->header->sections[i].size;
-
- switch (set->header->sections[i].type) {
- case RAZOR_PACKAGES:
- printf("package section:\t%dkb\n", size / 1024);
- break;
- case RAZOR_REQUIRES:
- printf("requires section:\t%dkb\n", size / 1024);
- break;
- case RAZOR_PROVIDES:
- printf("provides section:\t%dkb\n", size / 1024);
- break;
- case RAZOR_STRING_POOL:
- printf("string pool:\t\t%dkb\n", size / 1024);
- break;
- }
- }
-}
-
-static int
-usage(void)
-{
- printf("usage: razor [ import FILES | lookup <key> | "
- "list | list-requires | list-provides | eat-yum | info ]\n");
- exit(1);
-}
-
-static const char *repo_filename = "system.repo";
-static const char rawhide_repo_filename[] = "rawhide.repo";
-
-int
-main(int argc, const char *argv[])
-{
- struct razor_set *set, *upstream;
- struct stat statbuf;
- char *repo;
-
- repo = getenv("RAZOR_REPO");
- if (repo != NULL)
- repo_filename = repo;
-
- if (argc < 2) {
- usage();
- } else if (strcmp(argv[1], "import") == 0) {
- if (stat("set", &statbuf) && mkdir("set", 0777)) {
- fprintf(stderr, "could not create directory 'set'\n");
- exit(-1);
- }
-
- set = razor_import_rzr_files(argc - 2, argv + 2);
-
- printf("pool size: %d\n", set->string_pool.size);
- printf("pool allocation: %d\n", set->string_pool.alloc);
- printf("packages: %d\n",
- set->packages.size / sizeof(struct razor_package));
- printf("requires: %d\n",
- set->requires.size / sizeof(struct razor_property));
- printf("provides: %d\n",
- set->provides.size / sizeof(struct razor_property));
-
- razor_set_write(set, repo_filename);
-
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "list") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_list(set);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "list-requires") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_list_requires(set, argv[2]);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "list-provides") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_list_provides(set, argv[2]);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "what-requires") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_list_property_packages(set, &set->requires,
- argv[2], argv[3]);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "what-provides") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_list_property_packages(set, &set->provides,
- argv[2], argv[3]);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "info") == 0) {
- set = razor_set_open(repo_filename);
- razor_set_info(set);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "eat-yum") == 0) {
- set = razor_set_create_from_yum_filelist(STDIN_FILENO);
- if (set == NULL)
- return 1;
- razor_set_write(set, rawhide_repo_filename);
- razor_set_destroy(set);
- printf("wrote %s\n", rawhide_repo_filename);
- } else if (strcmp(argv[1], "import-rpmdb") == 0) {
- set = razor_set_create_from_rpmdb();
- if (set == NULL)
- return 1;
- razor_set_write(set, repo_filename);
- razor_set_destroy(set);
- printf("wrote %s\n", repo_filename);
- } else if (strcmp(argv[1], "validate") == 0) {
- set = razor_set_open(repo_filename);
- if (set == NULL)
- return 1;
- razor_set_list_unsatisfied(set);
- razor_set_destroy(set);
- } else if (strcmp(argv[1], "add") == 0) {
- struct array list;
-
- set = razor_set_open(repo_filename);
- upstream = razor_set_open(rawhide_repo_filename);
- if (set == NULL || upstream == NULL)
- return 1;
- array_init(&list);
- find_packages(upstream, argc - 2, argv + 2, &list);
- set = razor_set_add(set, upstream, &list);
- razor_set_write(set, "system-updated.repo");
- razor_set_destroy(set);
- printf("wrote system-updated.repo\n");
- } else if (strcmp(argv[1], "update") == 0) {
- set = razor_set_open(repo_filename);
- upstream = razor_set_open(rawhide_repo_filename);
- if (set == NULL || upstream == NULL)
- return 1;
- set = razor_set_update(set, upstream, argc - 2, argv + 2);
- razor_set_write(set, "system-updated.repo");
- razor_set_destroy(set);
- razor_set_destroy(upstream);
- printf("wrote system-updated.repo\n");
- } else {
- usage();
- }
-
- return 0;
-}