X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fapps.c;h=3b713f4acc91985a1b9146d718a03005c046d5df;hp=0438bdb9bf783eec718cb490706c0ecb0387a345;hb=555c94a0db9661428da0a45cb32b9f002324eefd;hpb=946ec58448d664c10ee05c1c8d3c2a3915c9d5f5 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"