/* .Some useful path tools. Written by Ray Donnelly in 2014. Licensed under CC0. No warranty. */ #include #include "pathtools.h" #include "msys2_relocate.h" void sanitise_path_debug(char const * path, char const * expected) { char * path_copy = (char *) alloca (strlen(path)+1); strcpy (path_copy, path); sanitise_path (path_copy); int ok = (strcmp(path_copy, expected) == 0) ? 1 : 0; if (ok) { printf ("PASS: %s cleans up to %s\n", path, path_copy); } else { printf ("FAIL: %s cleans up to %s, should be %s\n", path, path_copy, expected); _exit(1); } } void simplify_path_debug (const char * input, const char * expected) { char * input_copy = malloc_copy_string (input); if ( input_copy == NULL ) { _exit(1); } simplify_path (input_copy); int ok = (strcmp(input_copy, expected) == 0) ? 1 : 0; if (ok) { printf ("PASS: %s simplifies to %s\n", input, input_copy); } else { printf ("FAIL: %s simplifies to %s, should be %s\n", input, input_copy, expected); _exit(1); } free ((void *)input_copy); } void get_relative_path_debug (char const * from, char const * to, char const * expected) { char const * result = get_relative_path (from, to); if ( result == NULL ) { _exit(1); } else { int ok = (strcmp(result, expected) == 0) ? 1 : 0; if (ok) { printf ("PASS: %s to %s is %s\n", from, to, result); } else { printf ("FAIL: %s to %s is %s, should be %s\n", from, to, result, expected); _exit(1); } free ((void *)result); } } #define X509_PRIVATE_DIR "/mingw64/ssl/private" const char * X509_get_default_private_dir(void) { #if defined(__MINGW32__) static char stored_path[PATH_MAX]; static int stored = 0; if (stored == 0) { char const * relocated = msys2_get_relocated_single_path (X509_PRIVATE_DIR); strncpy (stored_path, relocated, PATH_MAX); stored_path[PATH_MAX-1] = '\0'; free ((void *)relocated); stored = 1; } return stored_path; #else return (X509_PRIVATE_DIR); #endif } #define TRUST_PATHS "/mingw64/etc/pki/ca-trust/source:/mingw64/share/pki/ca-trust-source" #define SINGLE_PATH_LIST "/mingw64" int main(int argc, char *argv[]) { #define BINDIR "/mingw64/bin" #define DATADIR "/mingw64/share" char exe_path[PATH_MAX]; get_executable_path (argv[0], &exe_path[0], sizeof (exe_path) / sizeof (exe_path[0])); printf ("executable path is %s\n", exe_path); char * rel_to_datadir = get_relative_path (BINDIR, DATADIR); if (strrchr (exe_path, '/') != NULL) { strrchr (exe_path, '/')[1] = '\0'; } strcat (exe_path, rel_to_datadir); simplify_path (&exe_path[0]); printf("real path of DATADIR is %s\n", exe_path); if (argc >= 2) { get_relative_path_debug (argv[argc-2], argv[argc-1], 0); } get_relative_path_debug (NULL, NULL, "./"); get_relative_path_debug ("/mingw64/bin", "/mingw64/etc/pkcs11/pkcs11.conf", "../etc/pkcs11/pkcs11.conf"); get_relative_path_debug ("/a/b/c/d", "/a/b/c", ".."); get_relative_path_debug ("/a/b/c/d/", "/a/b/c/", "../"); get_relative_path_debug ("/", "/", "/"); get_relative_path_debug ("/a/testone/c/d", "/a/testtwo/c", "../../../testtwo/c"); get_relative_path_debug ("/a/testone/c/d/", "/a/testtwo/c/", "../../../testtwo/c/"); get_relative_path_debug ("/home/part2/part3/part4", "/work/proj1/proj2", "../../../../work/proj1/proj2"); simplify_path_debug ("a/b/..", "a"); simplify_path_debug ("a/b/c/../../", "a/"); simplify_path_debug ("a/../a/..", ""); simplify_path_debug ("../a/../a/", "../a/"); simplify_path_debug ("./././", "./"); simplify_path_debug ("/test/", "/test/"); simplify_path_debug (".", "."); simplify_path_debug ("..", ".."); simplify_path_debug ("../", "../"); simplify_path_debug ("././.", "."); simplify_path_debug ("../..", "../.."); simplify_path_debug ("/", "/"); simplify_path_debug ("./test/", "./test/"); simplify_path_debug ("./test", "./test"); simplify_path_debug ("/test", "/test"); simplify_path_debug ("../test", "../test"); simplify_path_debug ("../../test", "../../test"); simplify_path_debug ("../test/..", ".."); simplify_path_debug (".././../", "../../"); sanitise_path_debug ("C:\\windows\\path", "C:/windows/path"); sanitise_path_debug ("", ""); sanitise_path_debug ("\\\\", "/"); char const * win_path = X509_get_default_private_dir (); printf ("%s -> %s\n", X509_PRIVATE_DIR, win_path); char * trusts = msys2_get_relocated_path_list (TRUST_PATHS); printf ("%s -> %s\n", TRUST_PATHS, trusts); free ((void*)trusts); char * single = msys2_get_relocated_path_list (SINGLE_PATH_LIST); printf ("%s -> %s\n", SINGLE_PATH_LIST, single); free ((void*)single); char *multi = get_relocated_path_list(BINDIR, TRUST_PATHS); printf ("Source pathlist: %s \n", TRUST_PATHS); printf ("Real pathlist: %s\n", multi); free ((void*)multi); return 0; }