#include #include #include #include #include #include #include "packages.h" static struct package_record * packages; static int max_packages = 0; static struct package_file_record * package_files; static int max_files = 0; static char distro_name[DISTRO_NAME_LENGTH]; static int load_distro(const char * list_dir, FILE * f) { char filename[1024]; int fd; unsigned int total = 0; int ret; unsigned int rest; /* Open the packages file */ snprintf(filename, 1024, "%s/distro.blob", list_dir); fd = open(filename, O_RDONLY); read(fd, &distro_name, sizeof(distro_name)); read(fd, &max_packages, sizeof(max_packages)); read(fd, &max_files, sizeof(max_files)); packages = malloc(max_packages*sizeof(struct package_record)); package_files = malloc(max_files* sizeof(struct package_file_record)); rest = max_packages*sizeof(struct package_record); while (rest > 0) { ret = read(fd, packages+total, rest); if (ret < 0) { return -1; } total += ret; rest -= ret; } rest = max_files*sizeof(struct package_file_record); total = 0; while (rest > 0) { ret = read(fd, package_files+total, rest); if (ret < 0) { fprintf(f, "Error loading files of distro blob\n"); return -1; } total += ret; rest -= ret; } fprintf(f, "Done loading\n"); total = 0; close(fd); return 0; } static void dump_distro() { struct package_record * pr; struct package_file_record * fr; int i; printf("Distro: [%s]\n", distro_name); printf("max_packages: %d\n", max_packages); printf("max_files: %d\n", max_files); for (i = 0; i < max_packages; i++) { pr = &packages[i]; printf("%s %s %s %d\n", pr->package_name, pr->package_version, pr->package_arch, pr->used); } for (i = 0; i < max_files; i++) { fr = &package_files[i]; printf("%s %d\n", fr->filename, fr->package_num); } } int main(int argc, char *argv[]) { if (argc != 2) errx(1, "Usage: dump_blob blob_dir\n"); load_distro(argv[1], stdout); dump_distro(); exit(0); }