From 53cf7e9bf812fdd29a285df3ae86dc6d92614e71 Mon Sep 17 00:00:00 2001 From: Sergey Kvachonok Date: Tue, 10 Aug 2010 00:58:39 +0300 Subject: [PATCH] Create extract destination directory on demand. --- fjfix.c | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/fjfix.c b/fjfix.c index 3e95e6d..49ec681 100644 --- a/fjfix.c +++ b/fjfix.c @@ -4,10 +4,17 @@ #include #include #include +#include #ifdef _WIN32 #include #define strcasecmp lstrcmpiA + +#ifndef __WINE__ +#include +#define mkdir(n, p) mkdir(n) +#endif + #endif #define FJHDR_SZ 0x54 @@ -341,7 +348,7 @@ err: static void usage() { fprintf(stderr, - "Usage: fjfix [-fhltv] FILE\n" + "Usage: fjfix [-fhltv] FILE [DESTDIR]\n" "-b - NO backup, -f - fix, -h - help, -l - list, -t test, -x - extract, -v - verbose\n" ); } @@ -368,11 +375,38 @@ static void list(fjfile_t fjf, int verbose) static void extract(fjfile_t fjf, const char* path) { char fname[PATH_MAX]; - char* dname = (char*)path; + char* dname; + + if (!(path && *path)) { + const char* bfname = strrchr(fjfile_name(fjf), '/'); + if (!bfname) + bfname = fjfile_name(fjf); + else + bfname++; + + dname = malloc(strlen(bfname) + sizeof(EXTRACT_SUFFIX)); + sprintf(dname, "%s" EXTRACT_SUFFIX, bfname); + } else { + int pl = strlen(path); + dname = malloc(pl + 1); + strcpy(dname, path); + while (--pl && dname[pl] == '/') + dname[pl] = '\0'; + } - if (!dname) { - dname = malloc(strlen(fjfile_name(fjf)) + sizeof(EXTRACT_SUFFIX)); - sprintf(dname, "%s" EXTRACT_SUFFIX, fjfile_name(fjf)); + struct stat dstat; + if (stat(dname, &dstat) < 0) { + if (mkdir(dname, 0777) < 0) { + fprintf(stderr, "Can't create destination directory '%s': %s\n", + dname, strerror(errno)); + goto direrr; + } + } else { + if (!S_ISDIR(dstat.st_mode)) { + fprintf(stderr, "Not a directory: '%s'\n", + dname); + goto direrr; + } } fjentry_t ent; @@ -409,8 +443,8 @@ static void extract(fjfile_t fjf, const char* path) fclose(f); } - if (dname != path) - free(dname); +direrr: + free(dname); } enum { -- 2.11.4.GIT