aboutsummaryrefslogtreecommitdiff
path: root/src/proone-pack.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/proone-pack.c')
-rw-r--r--src/proone-pack.c137
1 files changed, 91 insertions, 46 deletions
diff --git a/src/proone-pack.c b/src/proone-pack.c
index 81699c1..ad2a75c 100644
--- a/src/proone-pack.c
+++ b/src/proone-pack.c
@@ -9,6 +9,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <regex.h>
#include <zlib.h>
@@ -24,14 +25,14 @@
typedef struct {
- prne_arch_t arch;
+ prne_bin_host_t host;
const char *path;
struct stat st;
uint8_t *m_exec;
} archive_tuple_t;
-const archive_tuple_t *encounter_arr[NB_PRNE_ARCH];
-archive_tuple_t archive_arr[NB_PRNE_ARCH];
+const archive_tuple_t *encounter_arr[NB_PRNE_OS][NB_PRNE_ARCH];
+archive_tuple_t archive_arr[NB_PRNE_OS * NB_PRNE_ARCH];
size_t archive_arr_cnt;
uint8_t *m_dv;
size_t dv_len;
@@ -138,17 +139,17 @@ static void do_test (
len - ofs_ba,
&ba) == PRNE_PACK_RC_OK);
- fprintf(stderr, "%s\t\t", prne_arch_tostr(t->arch));
+ fprintf(stderr, "%s\t\t", prne_arch_tostr(t->host.arch));
for (size_t i = 0; i < ba.nb_bin; i += 1) {
- fprintf(stderr, "%s\t", prne_arch_tostr(ba.bin[i].arch));
+ fprintf(stderr, "%s\t", prne_arch_tostr(ba.bin[i].host.arch));
}
fprintf(stderr, "\n");
for (size_t i = 0; i < archive_arr_cnt; i += 1) {
prne_assert(prne_start_bin_rcb(
&ctx,
- archive_arr[i].arch,
- t->arch,
+ archive_arr[i].host,
+ &t->host,
m,
len,
t->st.st_size,
@@ -157,7 +158,7 @@ static void do_test (
&ba) == PRNE_PACK_RC_OK);
out_len = do_read(&m_out, &out_size, &ctx);
- if (archive_arr[i].arch == t->arch) {
+ if (prne_eq_bin_host(&archive_arr[i].host, &t->host)) {
prne_assert(out_len == len && memcmp(m_out, m, len) == 0);
}
else {
@@ -179,11 +180,10 @@ static bool do_nybin (const char *path, int *fd) {
prne_memzero(head, sizeof(head));
head[0] = prne_getmsb16(dv_len, 0);
head[1] = prne_getmsb16(dv_len, 1);
- head[2] = 'n';
- head[3] = 'y';
- head[4] = 'b';
- head[5] = 'i';
- head[6] = 'n';
+ memcpy(
+ head + 2,
+ PRNE_PACK_NYBIN_IDEN_DATA,
+ sizeof(PRNE_PACK_NYBIN_IDEN_DATA));
head[7] = 0;
*fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0755);
@@ -220,7 +220,7 @@ static bool do_rcb (const char *prefix) {
int fd = -1;
char *out_path = NULL;
const size_t prefix_len = strlen(prefix);
- const char *arch_str;
+ const char *arch_str, *os_str;
prne_init_bin_rcb_ctx(&ctx);
prne_init_bin_archive(&ba);
@@ -242,13 +242,14 @@ static bool do_rcb (const char *prefix) {
fd = -1;
for (size_t i = 0; i < archive_arr_cnt; i += 1) {
- arch_str = prne_arch_tostr(archive_arr[i].arch);
- prne_assert(arch_str != NULL);
+ os_str = prne_os_tostr(archive_arr[i].host.os);
+ arch_str = prne_arch_tostr(archive_arr[i].host.arch);
+ prne_assert(arch_str != NULL && os_str != NULL);
prc = prne_start_bin_rcb(
&ctx,
- archive_arr[i].arch,
- PRNE_ARCH_NONE,
+ archive_arr[i].host,
+ NULL,
NULL,
0,
0,
@@ -288,17 +289,31 @@ END:
return ret;
}
+static char *extmatch (char *ostr, const char *haystack, const regmatch_t *rm) {
+ const size_t l = rm->rm_eo - rm->rm_so;
+ char *ret = prne_realloc(ostr, 1, l + 1);
+
+ strncpy(ret, haystack + rm->rm_so, l);
+ ret[l] = 0;
+
+ return ret;
+}
+
int main (const int argc, const char **args) {
size_t i;
archive_tuple_t *archive;
- const char *path, *ext;
+ const char *path;
const char *o_prefix;
+ char *str_os = NULL, *str_arch = NULL;
bool proc_result = true;
prne_arch_t arch;
+ prne_os_t os;
int bin_fd = -1;
- int z_ret, ret = 0;
+ int z_ret, f_ret, ret = 0;
z_stream zs;
size_t out_len;
+ regex_t re;
+ regmatch_t rm[3];
PAGESIZE = prne_getpagesize();
@@ -308,6 +323,16 @@ int main (const int argc, const char **args) {
abort();
}
+ // .*\.([a-z0-9_\-]+)\.([a-z0-9_\-]+)$
+ f_ret = regcomp(
+ &re,
+ ".*\\.([a-z0-9_\\-]+)\\.([a-z0-9_\\-]+)$",
+ REG_EXTENDED | REG_ICASE);
+ if (f_ret != 0) {
+ fprintf(stderr, "*** regcomp() returned %d\n", f_ret);
+ abort();
+ }
+
if (argc < 3) {
fprintf(
stderr,
@@ -328,37 +353,49 @@ int main (const int argc, const char **args) {
for (i = 3; i < (size_t)argc; i += 1) {
struct stat st;
- if (archive_arr_cnt >= NB_PRNE_ARCH) {
+ if (archive_arr_cnt >= NB_PRNE_OS * NB_PRNE_ARCH) {
fprintf(
stderr,
"** Too many files given (%d > %d).\n",
argc - 1,
- NB_PRNE_ARCH);
+ NB_PRNE_OS * NB_PRNE_ARCH);
ret = 2;
goto END;
}
path = args[i];
- ext = strrchr(path, '.');
- if (ext == NULL) {
- fprintf(stderr, "** %s: file extension not found\n", path);
+ f_ret = regexec(&re, path, 3, rm, 0);
+ switch (f_ret) {
+ case 0: break;
+ case REG_NOMATCH:
+ fprintf(stderr, "** %s: invalid suffix\n", path);
proc_result = false;
continue;
+ default:
+ fprintf(stderr, "*** regexec() returned %d\n", f_ret);
+ abort();
}
- ext += 1;
+ str_os = extmatch(str_os, path, rm + 1);
+ str_arch = extmatch(str_arch, path, rm + 2);
- arch = prne_arch_fstr(ext);
+ os = prne_os_fstr(str_os);
+ if (os == PRNE_OS_NONE) {
+ fprintf(stderr, "** %s: unknown os \"%s\"\n", path, str_os);
+ proc_result = false;
+ continue;
+ }
+ arch = prne_arch_fstr(str_arch);
if (arch == PRNE_ARCH_NONE) {
- fprintf(stderr, "** %s: unknown arch \"%s\"\n", path, ext);
+ fprintf(stderr, "** %s: unknown arch \"%s\"\n", path, str_arch);
proc_result = false;
continue;
}
- if (encounter_arr[arch] != NULL) {
+ if (encounter_arr[os][arch] != NULL) {
fprintf(
stderr,
- "** Duplicate arch!\n%s\n%s\n",
- encounter_arr[arch]->path,
+ "** Duplicate bin:\n%s\n%s\n",
+ encounter_arr[os][arch]->path,
path);
proc_result = false;
continue;
@@ -380,10 +417,11 @@ int main (const int argc, const char **args) {
continue;
}
- archive_arr[archive_arr_cnt].arch = arch;
+ archive_arr[archive_arr_cnt].host.os = os;
+ archive_arr[archive_arr_cnt].host.arch = arch;
archive_arr[archive_arr_cnt].path = path;
archive_arr[archive_arr_cnt].st = st;
- encounter_arr[arch] = &archive_arr[archive_arr_cnt];
+ encounter_arr[os][arch] = &archive_arr[archive_arr_cnt];
archive_arr_cnt += 1;
}
if (!proc_result) {
@@ -391,24 +429,29 @@ int main (const int argc, const char **args) {
goto END;
}
- ba_len = ba_size = 4 + archive_arr_cnt * 4;
- m_ba = (uint8_t*)prne_malloc(1, ba_size);
+ ba_size = 8 + archive_arr_cnt * 8;
+ m_ba = (uint8_t*)prne_calloc(1, ba_size);
prne_assert(m_ba != NULL);
// write head
- m_ba[0] = (uint8_t)(archive_arr_cnt & 0xFF);
- m_ba[1] = 0;
- m_ba[2] = 0;
- m_ba[3] = 0;
- ba_len = 4;
+ m_ba[0] = 'p';
+ m_ba[1] = 'r';
+ m_ba[2] = '-';
+ m_ba[3] = 'b';
+ m_ba[4] = 'a';
+ m_ba[5] = 0;
+ m_ba[6] = prne_getmsb16(archive_arr_cnt, 0);
+ m_ba[7] = prne_getmsb16(archive_arr_cnt, 1);
+ ba_len = 8;
for (i = 0; i < archive_arr_cnt; i += 1) {
archive = archive_arr + i;
- m_ba[ba_len + 0] = (uint8_t)archive->arch;
- m_ba[ba_len + 1] = prne_getmsb32(archive->st.st_size, 1);
- m_ba[ba_len + 2] = prne_getmsb32(archive->st.st_size, 2);
- m_ba[ba_len + 3] = prne_getmsb32(archive->st.st_size, 3);
- ba_len += 4;
+ m_ba[ba_len + 2] = (uint8_t)archive->host.os;
+ m_ba[ba_len + 3] = (uint8_t)archive->host.arch;
+ m_ba[ba_len + 5] = prne_getmsb32(archive->st.st_size, 1);
+ m_ba[ba_len + 6] = prne_getmsb32(archive->st.st_size, 2);
+ m_ba[ba_len + 7] = prne_getmsb32(archive->st.st_size, 3);
+ ba_len += 8;
}
// compress executables
@@ -416,7 +459,7 @@ int main (const int argc, const char **args) {
archive = archive_arr + i;
/* FIXME
- * Zero size arhive allowed?
+ * Zero size bin allowed?
*/
archive->m_exec = prne_malloc(1, archive->st.st_size);
prne_assert(archive->m_exec != NULL);
@@ -496,6 +539,8 @@ int main (const int argc, const char **args) {
ret = do_rcb(o_prefix) ? 0 : 1;
END:
+ prne_free(str_os);
+ prne_free(str_arch);
prne_free(m_dv);
prne_free(m_ba);
for (size_t i = 0; i < archive_arr_cnt; i += 1) {