diff --git a/binr/rabin2/rabin2.c b/binr/rabin2/rabin2.c index 2ea2330452..2137495a8d 100644 --- a/binr/rabin2/rabin2.c +++ b/binr/rabin2/rabin2.c @@ -39,7 +39,7 @@ static int rw = R_FALSE; static int va = R_FALSE; static ut64 gbaddr = 0LL; static char* file = NULL; -static char* output = "a.out"; +static char* output = "out"; static ut64 at = 0LL; static char *name = NULL; @@ -60,7 +60,7 @@ static int rabin_show_help() { " -l Linked libraries\n" " -R Relocations\n" " -O [str] Write/Extract operations (str=help for help)\n" - " -o [file] Output file for write operations (a.out by default)\n" + " -o [str] Output file/folder for write operations (out by default)\n" " -r radare output\n" " -v Use vaddr in radare output\n" " -m [addr] Show source line at addr\n" @@ -120,39 +120,49 @@ static int rabin_show_main() { } static int rabin_extract(int all) { - char out[512], *ptr; + char outfile[512], outpath[512], *path, *ptr; int i = 0; + // XXX: Wrong for w32 (/) if (all) { for (i=0; inarch; i++) { r_bin_set_archidx (bin, i); if (bin->curarch.info == NULL) { eprintf ("No extract info found.\n"); } else { - if ((ptr = strrchr (bin->curarch.file, '/'))) + path = strdup (bin->curarch.file); + if ((ptr = strrchr (path, '/'))) { + *ptr = '\0'; ptr = ptr+1; + } else ptr = bin->curarch.file; - snprintf (out, sizeof (out), "%s.%s_%i", ptr, - bin->curarch.info->arch, bin->curarch.info->bits); - if (!r_file_dump (out, bin->curarch.buf->buf, bin->curarch.size)) { - eprintf ("Error extracting %s\n", out); + snprintf (outpath, sizeof (outpath), "%s/%s", output, path); + if (!r_sys_rmkdir (outpath)) { + eprintf ("Error creating dir structure\n"); return R_FALSE; - } else printf ("%s created (%i)\n", out, bin->curarch.size); + } + snprintf (outfile, sizeof (outfile), "%s/%s.%s_%i", + outpath, ptr, bin->curarch.info->arch, + bin->curarch.info->bits); + if (!r_file_dump (outfile, bin->curarch.buf->buf, bin->curarch.size)) { + eprintf ("Error extracting %s\n", outfile); + return R_FALSE; + } else printf ("%s created (%i)\n", outfile, bin->curarch.size); } } - } else { + } else { /* XXX: Use 'output' for filename? */ if (bin->curarch.info == NULL) { eprintf ("No extract info found.\n"); } else { if ((ptr = strrchr (bin->curarch.file, '/'))) ptr = ptr+1; else ptr = bin->curarch.file; - snprintf (out, sizeof (out), "%s.%s_%i", ptr, + snprintf (outfile, sizeof (outfile), "%s.%s_%i", ptr, bin->curarch.info->arch, bin->curarch.info->bits); - if (!r_file_dump (out, bin->curarch.buf->buf, bin->curarch.size)) { - eprintf ("Error extracting %s\n", out); + if (!r_file_dump (outfile, bin->curarch.buf->buf, bin->curarch.size)) { + eprintf ("Error extracting %s\n", outfile); return R_FALSE; - } else printf ("%s created (%i)\n", out, bin->curarch.size); + } else printf ("%s created (%i)\n", outfile, bin->curarch.size); } } return R_TRUE; diff --git a/libr/include/r_util.h b/libr/include/r_util.h index a7ccf44c23..cdc29b2290 100644 --- a/libr/include/r_util.h +++ b/libr/include/r_util.h @@ -271,6 +271,7 @@ R_API void r_sys_perror(const char *fun); #else #define r_sys_mkdir(x) (mkdir(x,0755)!=-1) #endif +R_API int r_sys_rmkdir(const char *dir); R_API int r_sys_sleep(int secs); R_API int r_sys_usleep(int usecs); R_API const char *r_sys_getenv(const char *key); diff --git a/libr/util/sys.c b/libr/util/sys.c index c6867cc364..437c2a8bdf 100644 --- a/libr/util/sys.c +++ b/libr/util/sys.c @@ -240,15 +240,15 @@ R_API char *r_sys_cmd_str(const char *cmd, const char *input, int *len) { } R_API int r_sys_rmkdir(const char *dir) { - char *ptr, *path = strdup (dir); - // XXX: Wrong for w32 - while ((ptr = strrchr (dir, '/'))) { - if (!r_sys_mkdir (ptr+1)) { - free (path); - return R_FALSE; - } + char *path = strdup (dir), *ptr = path; + // XXX: Wrong for w32 (/) + while ((ptr = strchr (ptr, '/'))) { *ptr = 0; + r_sys_mkdir (path); + *ptr = '/'; + ptr = ptr+1; } + r_sys_mkdir (path); free (path); return R_TRUE; }