blob: f2b3f7170b59b57792e4a5c467540224c86d62ba [file] [log] [blame]
#include <initrd/initrd.h>
#include <stdio.h>
#include <string.h>
int file_size(FILE *file)
{
fseek(file, 0, SEEK_END);
int size = ftell(file);
fseek(file, 0, SEEK_SET);
return size;
}
int main(int argc, char **argv)
{
if (argc == 1 || (argc > 1 && !strcmp(argv[1], "-h")))
{
fprintf(stderr, "%s <output> [input...]\n", argv[0]);
return argc == 1;
}
FILE *out; /* output file */
if (!strcmp(argv[1], "-"))
out = stdin;
else
out = fopen(argv[1], "w");
if (!out)
{
fprintf(stderr, "Failed to open %s\n", argv[1]);
return 1;
}
/* Header */
int num_files = argc - 2;
struct initrd_global_header header = {
.magic = INITRD_MAGIC,
.num_files = num_files,
};
fwrite(&header, sizeof(header), 1, out);
for (int i = 0; i < num_files; i++)
{
FILE *in = fopen(argv[i + 2], "rb");
if (!in)
{
fprintf(stderr, "Failed to open %s\n", argv[i + 2]);
return 2;
}
struct initrd_file_header file = {
.size = file_size(in),
};
strcpy(file.name, argv[i + 2]);
char c;
while ((c = getc(in)) != EOF)
{
putc(c, out);
}
fclose(in);
}
fclose(out);
}