diff options
author | Paul Yang <yang.yang@baishancloud.com> | 2017-06-21 23:02:12 +0800 |
---|---|---|
committer | Richard Levitte <levitte@openssl.org> | 2018-02-28 18:44:56 +0100 |
commit | 555c94a0db9661428da0a45cb32b9f002324eefd (patch) | |
tree | f6ad79c54850d421c9d8c6ae116352f9c1898118 /apps/apps.c | |
parent | 946ec58448d664c10ee05c1c8d3c2a3915c9d5f5 (diff) |
Check directory is able to create files for various -out option
This is to address issue #3404, only works in Unix-like platforms
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Richard Levitte <levitte@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/3709)
Diffstat (limited to 'apps/apps.c')
-rw-r--r-- | apps/apps.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/apps/apps.c b/apps/apps.c index 0438bdb9bf..3b713f4acc 100644 --- a/apps/apps.c +++ b/apps/apps.c @@ -2340,6 +2340,73 @@ int app_isdir(const char *name) } #endif +/* app_dirname section */ + +/* + * This exactly follows what POSIX's + * dirname does, but is implemented + * in a more platform independent way. + * + * path dirname + * /usr/lib /usr + * /usr/ / + * usr . + * / / + * . . + * .. . + * "" . + * + * Note: this function also keeps the + * possibility of modifying the 'path' + * string same as POSIX dirname. + */ +static char *posix_dirname(char *path) +{ + size_t l; + char *ret = "."; + + l = strlen(path); + if (l == 0) + goto out; + if (strcmp(path, ".") == 0) + goto out; + if (strcmp(path, "..") == 0) + goto out; + if (strcmp(path, "/") == 0) { + ret = "/"; + goto out; + } + if (path[l - 1] == '/') { + /* /usr/ */ + path[l - 1] = '\0'; + } + if ((ret = strrchr(path, '/')) == NULL) { + /* usr */ + ret = "."; + } else if (ret == path) { + /* /usr */ + *++ret = '\0'; + ret = path; + } else { + /* /usr/lib */ + *ret = '\0'; + ret = path; + } + out: + return ret; +} + +/* + * TODO: implement app_dirname for Windows + * and VMS. + */ +#if !defined(_WIN32) && !defined(__VMS) +char *app_dirname(char *path) +{ + return posix_dirname(path); +} +#endif + /* raw_read|write section */ #if defined(__VMS) # include "vms_term_sock.h" |