diff -r -u ../src/chmview.c ./chmview.c --- ../src/chmview.c Fri Mar 28 20:59:31 2003 +++ ./chmview.c Fri Mar 28 19:01:39 2003 @@ -3,9 +3,7 @@ #include #include #include -#include #include "chmlib.h" -#define PATH_MAX 512 static char *pointtoname(char *path) { @@ -15,6 +13,7 @@ return p; } +#if 0 static int makedir(char *path) { char *end; @@ -47,6 +46,38 @@ } return 1; } +#else +static int makedir(char *path) +{ + char *slash; + int was_error, done, err; + + slash = path; + done = 0; + was_error = 0; + + do { + slash = index(slash + 1, '/'); + if (slash) + { + *slash = 0; + if (mkdir(path, MODE) == -1 && EEXIST != errno) + was_error = 1; + *slash = '/'; + } + else + done = 1; + } while (! done && ! was_error); + + if (was_error) + { + perror("mkdir"); + return 0; + } + + return 1; +} +#endif static int savetofile(chmfile *c, char *target, int extractwithoutpath) { @@ -55,18 +86,25 @@ char *rtarget; char *p; FILE *f; - char path[PATH_MAX]; - char fullpath[PATH_MAX]; + char fullpath[PATH_MAX + 1]; + size_t pathlen; if (chm_getfile(c, target, &length, &outbuf) != 0) return 1; - getcurdir(0,path); - fullpath[0]=getdisk()+'A'; fullpath[1]=':'; fullpath[2]='/'; fullpath[3]='\0'; - strcat(fullpath,path); - while ((p = strstr(fullpath,"\\")) != NULL) - *p = '/'; - if (fullpath[strlen(fullpath)-1] != '/') - strcat(fullpath,"/"); + + getcwd(fullpath,PATH_MAX-1); + pathlen = strlen(fullpath); + if (pathlen == 0) + return -1; /* impossible but... defensive programming */ + if (fullpath[pathlen - 1] != '/') + { + if (pathlen == PATH_MAX) + return -1; + else + fullpath[pathlen] = '/'; + fullpath[pathlen+1] = 0; + } + strcat(fullpath,extractwithoutpath?pointtoname(target):target+1); if (!extractwithoutpath) if (!makedir(fullpath))