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