aboutsummaryrefslogtreecommitdiff
path: root/src/proone-pack.c
diff options
context:
space:
mode:
authorDavid Timber <mieabby@gmail.com>2020-01-15 18:36:25 +1100
committerDavid Timber <mieabby@gmail.com>2020-01-15 18:45:50 +1100
commita9762b186c68797c19c61bf0284a80d9bc51a2ca (patch)
treee1aa87bac8d8605ec3c5f069e1bc83dc2048fbfe /src/proone-pack.c
parentf97fd125b9e2f8ff27da61a882c50ce66cc79d2d (diff)
unexpand
Diffstat (limited to 'src/proone-pack.c')
-rw-r--r--src/proone-pack.c254
1 files changed, 127 insertions, 127 deletions
diff --git a/src/proone-pack.c b/src/proone-pack.c
index 85a2beb..8384fb1 100644
--- a/src/proone-pack.c
+++ b/src/proone-pack.c
@@ -17,131 +17,131 @@
int main (const int argc, const char **args) {
- typedef struct {
- prne_arch_t arch;
- const char *path;
- } archive_tuple_t;
- size_t i;
- const archive_tuple_t *encounter_arr[NB_PRNE_ARCH];
- archive_tuple_t archive_arr[NB_PRNE_ARCH];
- archive_tuple_t *archive;
- size_t archive_arr_cnt = 0;
- const char *path, *ext;
- bool proc_result = true;
- prne_arch_t arch;
- int bin_fd = -1;
- struct stat st;
- uint8_t head[4];
-
- if (argc <= 1) {
- fprintf(stderr, "Usage: %s <path to binary 1> [path to binary 2 [path to binary ...]]\n", args[0]);
- return 1;
- }
- // refuse to run if stdout is terminal
- if (isatty(STDOUT_FILENO)) {
- fprintf(stderr, "** Refusing to print on terminal.\n");
- return 1;
- }
- // too many files
- if (argc - 1 > NB_PRNE_ARCH) {
- fprintf(stderr, "** Too many files given (%d > %d).\n", argc - 1, NB_PRNE_ARCH);
- return 1;
- }
-
- // init
- memzero(encounter_arr, sizeof(archive_tuple_t*) * NB_PRNE_ARCH);
- memzero(archive_arr, sizeof(archive_tuple_t) * NB_PRNE_ARCH);
-
- // Check the file names are valid
- for (i = 1; i < (size_t)argc; i += 1) {
- path = args[i];
-
- ext = strrchr(path, '.');
- if (ext == NULL) {
- fprintf(stderr, "** %s: file extension not found\n", path);
- proc_result = false;
- continue;
- }
- ext += 1;
-
- arch = prne_arch_fstr(ext);
- if (arch == PRNE_ARCH_NONE) {
- fprintf(stderr, "** %s: unknown arch \"%s\"\n", path, ext);
- proc_result = false;
- continue;
- }
-
- if (encounter_arr[arch] != NULL) {
- fprintf(stderr, "** Duplicate arch!\n%s\n%s\n", encounter_arr[arch]->path, path);
- proc_result = false;
- continue;
- }
-
- archive_arr[archive_arr_cnt].arch = arch;
- archive_arr[archive_arr_cnt].path = path;
- encounter_arr[arch] = &archive_arr[archive_arr_cnt];
- archive_arr_cnt += 1;
- }
- if (!proc_result) {
- return 1;
- }
-
- // do packing
- fprintf(stderr, archive_arr_cnt == NB_PRNE_ARCH ? "Packing %zu binaries.\n" : "* Warning: packing only %zu binaries\n", archive_arr_cnt);
- for (i = 0; i < archive_arr_cnt; i += 1) {
- archive = &archive_arr[i];
- fprintf(stderr, "Packing: %s ...\n", archive->path);
-
- bin_fd = open(archive->path, O_RDONLY);
- if (bin_fd < 0) {
- perror("** open()");
- proc_result = false;
- break;
- }
-
- // get size
- if (fstat(bin_fd, &st) != 0) {
- perror("** fstat()");
- proc_result = false;
- break;
- }
- if (st.st_size == 0) {
- fprintf(stderr, "** empty file!\n");
- proc_result = false;
- break;
- }
- if (st.st_size > 0x00FFFFFE) {
- fprintf(stderr, "** binary too large!\n");
- proc_result = false;
- break;
- }
-
- // write head
- head[0] = (uint8_t)archive->arch;
- // endian conversion as the file is big endian
- head[1] = (uint8_t)(((uint_fast32_t)st.st_size & 0x00FF0000) >> 16);
- head[2] = (uint8_t)(((uint_fast32_t)st.st_size & 0x0000FF00) >> 8);
- head[3] = (uint8_t)((uint_fast32_t)st.st_size & 0x000000FF);
- if (write(STDOUT_FILENO, head, 4) != 4) {
- perror("write()");
- proc_result = false;
- break;
- }
-
- // write binary
- if (sendfile(STDOUT_FILENO, bin_fd, NULL, st.st_size) < 0) {
- perror("** sendfile()");
- proc_result = false;
- break;
- }
-
- prne_close(bin_fd);
- bin_fd = -1;
- }
-
- prne_close(bin_fd);
- bin_fd = -1;
- errno = 0;
-
- return proc_result ? 0 : 2;
+ typedef struct {
+ prne_arch_t arch;
+ const char *path;
+ } archive_tuple_t;
+ size_t i;
+ const archive_tuple_t *encounter_arr[NB_PRNE_ARCH];
+ archive_tuple_t archive_arr[NB_PRNE_ARCH];
+ archive_tuple_t *archive;
+ size_t archive_arr_cnt = 0;
+ const char *path, *ext;
+ bool proc_result = true;
+ prne_arch_t arch;
+ int bin_fd = -1;
+ struct stat st;
+ uint8_t head[4];
+
+ if (argc <= 1) {
+ fprintf(stderr, "Usage: %s <path to binary 1> [path to binary 2 [path to binary ...]]\n", args[0]);
+ return 1;
+ }
+ // refuse to run if stdout is terminal
+ if (isatty(STDOUT_FILENO)) {
+ fprintf(stderr, "** Refusing to print on terminal.\n");
+ return 1;
+ }
+ // too many files
+ if (argc - 1 > NB_PRNE_ARCH) {
+ fprintf(stderr, "** Too many files given (%d > %d).\n", argc - 1, NB_PRNE_ARCH);
+ return 1;
+ }
+
+ // init
+ memzero(encounter_arr, sizeof(archive_tuple_t*) * NB_PRNE_ARCH);
+ memzero(archive_arr, sizeof(archive_tuple_t) * NB_PRNE_ARCH);
+
+ // Check the file names are valid
+ for (i = 1; i < (size_t)argc; i += 1) {
+ path = args[i];
+
+ ext = strrchr(path, '.');
+ if (ext == NULL) {
+ fprintf(stderr, "** %s: file extension not found\n", path);
+ proc_result = false;
+ continue;
+ }
+ ext += 1;
+
+ arch = prne_arch_fstr(ext);
+ if (arch == PRNE_ARCH_NONE) {
+ fprintf(stderr, "** %s: unknown arch \"%s\"\n", path, ext);
+ proc_result = false;
+ continue;
+ }
+
+ if (encounter_arr[arch] != NULL) {
+ fprintf(stderr, "** Duplicate arch!\n%s\n%s\n", encounter_arr[arch]->path, path);
+ proc_result = false;
+ continue;
+ }
+
+ archive_arr[archive_arr_cnt].arch = arch;
+ archive_arr[archive_arr_cnt].path = path;
+ encounter_arr[arch] = &archive_arr[archive_arr_cnt];
+ archive_arr_cnt += 1;
+ }
+ if (!proc_result) {
+ return 1;
+ }
+
+ // do packing
+ fprintf(stderr, archive_arr_cnt == NB_PRNE_ARCH ? "Packing %zu binaries.\n" : "* Warning: packing only %zu binaries\n", archive_arr_cnt);
+ for (i = 0; i < archive_arr_cnt; i += 1) {
+ archive = &archive_arr[i];
+ fprintf(stderr, "Packing: %s ...\n", archive->path);
+
+ bin_fd = open(archive->path, O_RDONLY);
+ if (bin_fd < 0) {
+ perror("** open()");
+ proc_result = false;
+ break;
+ }
+
+ // get size
+ if (fstat(bin_fd, &st) != 0) {
+ perror("** fstat()");
+ proc_result = false;
+ break;
+ }
+ if (st.st_size == 0) {
+ fprintf(stderr, "** empty file!\n");
+ proc_result = false;
+ break;
+ }
+ if (st.st_size > 0x00FFFFFE) {
+ fprintf(stderr, "** binary too large!\n");
+ proc_result = false;
+ break;
+ }
+
+ // write head
+ head[0] = (uint8_t)archive->arch;
+ // endian conversion as the file is big endian
+ head[1] = (uint8_t)(((uint_fast32_t)st.st_size & 0x00FF0000) >> 16);
+ head[2] = (uint8_t)(((uint_fast32_t)st.st_size & 0x0000FF00) >> 8);
+ head[3] = (uint8_t)((uint_fast32_t)st.st_size & 0x000000FF);
+ if (write(STDOUT_FILENO, head, 4) != 4) {
+ perror("write()");
+ proc_result = false;
+ break;
+ }
+
+ // write binary
+ if (sendfile(STDOUT_FILENO, bin_fd, NULL, st.st_size) < 0) {
+ perror("** sendfile()");
+ proc_result = false;
+ break;
+ }
+
+ prne_close(bin_fd);
+ bin_fd = -1;
+ }
+
+ prne_close(bin_fd);
+ bin_fd = -1;
+ errno = 0;
+
+ return proc_result ? 0 : 2;
}