aboutsummaryrefslogtreecommitdiffstats
path: root/dump_blob.c
blob: 1388ca9a78ec9b25a782b25543f53759eb78194d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>

#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);
}