extractor: Implement cum extractor

Signed-off-by: Chloe M. <chloe@mensia.org>
This commit is contained in:
Chloe M.
2026-06-28 02:25:47 +00:00
parent 664a39852b
commit 848b52f0a4
+67 -1
View File
@@ -6,12 +6,14 @@
* Author: Chloe M. * Author: Chloe M.
*/ */
#include <sys/stat.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h> #include <fcntl.h>
#include <stddef.h> #include <stddef.h>
#include <libgen.h>
#define REF_MAGIC "CUMHOLE" #define REF_MAGIC "CUMHOLE"
#define REF_MAGIC_LEN 8 #define REF_MAGIC_LEN 8
@@ -36,6 +38,32 @@ struct hole_ref {
/* Globals */ /* Globals */
static char *input_path = NULL; static char *input_path = NULL;
static void
mkdir_recurse(const char *path)
{
char buf[256];
char *p = NULL;
size_t len;
snprintf(buf, sizeof(buf), "%s", path);
len = strlen(buf);
/* Strip trailing slash */
if (buf[len - 1] == '/')
buf[len - 1] = '\0';
/* Make directory of each component */
for (p = buf; *p != '\0'; ++p) {
if (*p == '/') {
*p = '\0';
mkdir(buf, S_IRWXU);
*p = '/';
}
}
mkdir(buf, S_IRWXU);
}
static void static void
help(void) help(void)
{ {
@@ -44,9 +72,35 @@ help(void)
printf("[-i] Input CUMHOLE bundle\n"); printf("[-i] Input CUMHOLE bundle\n");
} }
static int
push_file(const char *path, void *data, size_t size)
{
int fd;
if (path == NULL || data == NULL) {
return -1;
}
fd = open(path, O_RDWR | O_CREAT, 0777);
if (fd < 0) {
printf("fatal: failed to open '%s'\n", path);
perror("open");
return -1;
}
write(fd, data, size);
close(fd);
return 0;
}
static void static void
do_parse(struct hole_ref *ref) do_parse(struct hole_ref *ref)
{ {
const char *directory_name;
struct hole_ref *ref_base = ref;
char *path;
void *data;
if (ref == NULL) { if (ref == NULL) {
return; return;
} }
@@ -56,7 +110,19 @@ do_parse(struct hole_ref *ref)
break; break;
} }
printf("found '%s' with size %ld\n", ref->path, ref->size); path = strdup(ref->path);
directory_name = dirname(path);
mkdir_recurse(directory_name);
printf("creating %s\n", ref->path);
data = (void *)((char *)ref_base + ref->data_off);
if (push_file(ref->path, data, ref->size) < 0) {
free(path);
return;
}
free(path);
++ref; ++ref;
} }
} }