char* pmix_dirname(const char* filename) { #if defined(HAVE_DIRNAME) || PMIX_HAVE_DIRNAME char* safe_tmp = strdup(filename), *result; result = strdup(dirname(safe_tmp)); free(safe_tmp); return result; #else const char* p = pmix_find_last_path_separator(filename, strlen(filename)); /* NOTE: p will be NULL if no path separator was in the filename - i.e., * if filename is just a local file */ for( ; NULL != p && p != filename; p-- ) { if( (*p == '\\') || (*p == '/') ) { /* If there are several delimiters remove them all */ for( --p; p != filename; p-- ) { if( (*p != '\\') && (*p != '/') ) { p++; break; } } if( p != filename ) { char* ret = (char*)malloc( p - filename + 1 ); pmix_strncpy(ret, filename, p - filename); ret[p - filename] = '\0'; return pmix_make_filename_os_friendly(ret); } break; /* return the duplicate of "." */ } } return strdup("."); #endif /* defined(HAVE_DIRNAME) || PMIX_HAVE_DIRNAME */ }
/** * Locates a file with certain permissions */ char *pmix_path_find(char *fname, char **pathv, int mode, char **envv) { char *fullpath; char *delimit; char *env; char *pfix; int i; /* If absolute path is given, return it without searching. */ if( pmix_path_is_absolute(fname) ) { return pmix_path_access(fname, NULL, mode); } /* Initialize. */ fullpath = NULL; i = 0; /* Consider each directory until the file is found. Thus, the order of directories is important. */ while (pathv[i] && NULL == fullpath) { /* Replace environment variable at the head of the string. */ if ('$' == *pathv[i]) { delimit = strchr(pathv[i], PMIX_PATH_SEP[0]); if (delimit) { *delimit = '\0'; } env = list_env_get(pathv[i]+1, envv); if (delimit) { *delimit = PMIX_PATH_SEP[0]; } if (NULL != env) { if (!delimit) { fullpath = pmix_path_access(fname, env, mode); } else { pfix = (char*) malloc(strlen(env) + strlen(delimit) + 1); if (NULL == pfix) { return NULL; } strcpy(pfix, env); strcat(pfix, delimit); fullpath = pmix_path_access(fname, pfix, mode); free(pfix); } } } else { fullpath = pmix_path_access(fname, pathv[i], mode); } i++; } return pmix_make_filename_os_friendly(fullpath); }