]>
Commit | Line | Data |
---|---|---|
558d2836 A |
1 | #include <spawn.h> |
2 | #include <err.h> | |
3 | #include <unistd.h> | |
4 | #include <zlib.h> | |
5 | #include <fcntl.h> | |
6 | #include <stdlib.h> | |
7 | #include <stdbool.h> | |
8 | #include <stdio.h> | |
9 | #include <string.h> | |
10 | ||
11 | void *zalloc(__unused void *opaque, uInt items, uInt size) | |
12 | { | |
13 | return malloc(items * size); | |
14 | } | |
15 | ||
16 | void zfree(__unused void *opaque, void *ptr) | |
17 | { | |
18 | free(ptr); | |
19 | } | |
20 | ||
21 | int main(int argc, char *argv[]) | |
22 | { | |
23 | const int fixed_args = 4; | |
24 | char *args[argc + fixed_args]; | |
25 | ||
26 | char template[] = "/tmp/img-to-c.XXXXXXXX"; | |
27 | char *dir = mkdtemp(template); | |
28 | ||
29 | if (!dir) | |
30 | err(1, "mkdtemp failed"); | |
31 | ||
32 | char *path; | |
33 | asprintf(&path, "%s/img.sparseimage", dir); | |
34 | ||
35 | args[0] = "hdiutil"; | |
36 | args[1] = "create"; | |
37 | args[2] = path; | |
38 | args[3] = "-quiet"; | |
39 | ||
40 | int i; | |
41 | for (i = 1; i < argc; ++i) | |
42 | args[i + fixed_args - 1] = argv[i]; | |
43 | args[i + fixed_args - 1] = NULL; | |
44 | ||
45 | pid_t pid; | |
46 | posix_spawn(&pid, "/usr/bin/hdiutil", NULL, NULL, args, NULL); | |
47 | ||
48 | int status; | |
49 | waitpid(pid, &status, 0); | |
50 | ||
51 | if (!WIFEXITED(status) || WEXITSTATUS(status)) | |
52 | err(1, "hdiutil failed"); | |
53 | ||
54 | int fd = open(path, O_RDONLY); | |
55 | ||
56 | z_stream zs = { | |
57 | .zalloc = zalloc, | |
58 | .zfree = zfree, | |
59 | }; | |
60 | ||
61 | deflateInit(&zs, Z_DEFAULT_COMPRESSION); | |
62 | ||
63 | const size_t buf_size = 1024 * 1024; | |
64 | ||
65 | unsigned char *out_buf = malloc(buf_size); | |
66 | int flush = 0; | |
67 | ||
68 | unsigned char *in_buf = malloc(buf_size); | |
69 | ||
70 | printf("unsigned char data[] = {"); | |
71 | int offset = 0; | |
72 | ||
73 | zs.next_in = in_buf; | |
74 | ||
75 | do { | |
76 | if (!flush) { | |
77 | ssize_t amt = read(fd, zs.next_in, &in_buf[buf_size] - zs.next_in); | |
78 | ||
79 | if (!amt) | |
80 | flush = Z_FINISH; | |
81 | ||
82 | zs.avail_in += amt; | |
83 | } | |
84 | ||
85 | zs.next_out = out_buf; | |
86 | zs.avail_out = buf_size; | |
87 | ||
88 | deflate(&zs, flush); | |
89 | ||
90 | memmove(in_buf, zs.next_in, zs.avail_in); | |
91 | zs.next_in = in_buf; | |
92 | ||
93 | for (unsigned i = 0; i < buf_size - zs.avail_out; ++i) { | |
94 | if (!(offset & 15)) | |
95 | printf("\n "); | |
96 | printf("0x%02x, ", out_buf[i]); | |
97 | ++offset; | |
98 | } | |
99 | } while (!flush || zs.avail_in); | |
100 | ||
101 | printf("\n};\n"); | |
102 | ||
103 | // Clean up | |
104 | unlink(path); | |
105 | rmdir(dir); | |
106 | } |