~ chicken-core (chicken-5) 673019cfe7b747efee35b47f68e955824941966d
commit 673019cfe7b747efee35b47f68e955824941966d Author: felix <felix@frohike.homeunix.org> AuthorDate: Mon Feb 15 12:29:37 2010 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Feb 15 12:44:00 2010 +0100 private-repo fixes for generic path walking diff --git a/chicken.h b/chicken.h index 2f9d3273..1da8b5cb 100644 --- a/chicken.h +++ b/chicken.h @@ -664,6 +664,12 @@ typedef unsigned __int64 uint64_t; # define C_SOFTWARE_VERSION "unknown" #endif +#ifdef C_XXXBSD +# define C_MAX_PATH PATH_MAX +#else +# define C_MAX_PATH MAX_PATH +#endif + /* Types: */ @@ -895,6 +901,7 @@ DECL_C_PROC_p0 (128, 1,0,0,0,0,0,0,0) # define C_getcwd getcwd # define C_access access # define C_getpid getpid +# define C_getenv getenv # ifdef __linux__ extern double round(double); extern double trunc(double); @@ -1310,9 +1317,9 @@ extern double trunc(double); #define C_end_of_main #ifdef C_PRIVATE_REPOSITORY -# define C_private_repository C_use_private_repository(C_path_to_executable()) +# define C_private_repository(fname) C_use_private_repository(C_path_to_executable(fname)) #else -# define C_private_repository +# define C_private_repository(fname) #endif /* left for backwards-compatibility */ @@ -1330,7 +1337,7 @@ extern double trunc(double); int WINAPI WinMain(HINSTANCE me, HINSTANCE you, LPSTR cmdline, int show) \ { \ C_gui_mode = 1; \ - C_private_repository; \ + C_private_repository(NULL); \ return CHICKEN_main(0, NULL, (void *)C_toplevel); \ } C_end_of_main # else @@ -1338,7 +1345,7 @@ extern double trunc(double); int main(int argc, char *argv[]) \ { \ C_set_gui_mode; \ - C_private_repository; \ + C_private_repository(argv[ 0 ]); \ return CHICKEN_main(argc, argv, (void*)C_toplevel); \ } C_end_of_main # endif @@ -2128,9 +2135,9 @@ C_inline C_word C_i_safe_pointerp(C_word x) # include <CoreFoundation/CoreFoundation.h> # endif C_inline C_char * -C_path_to_executable() +C_path_to_executable(C_char *fname) { - C_char *buffer = (C_char *)C_malloc(MAX_PATH); + C_char *buffer = (C_char *)C_malloc(C_MAX_PATH); if(buffer == NULL) return NULL; @@ -2141,9 +2148,9 @@ C_path_to_executable() pid = C_getpid(); C_sprintf(linkname, "/proc/%i/exe", pid); - ret = C_readlink(linkname, buffer, MAX_PATH - 1); + ret = C_readlink(linkname, buffer, C_MAX_PATH - 1); - if(ret == -1 || ret >= MAX_PATH - 1) + if(ret == -1 || ret >= C_MAX_PATH - 1) return NULL; for(--ret; ret > 0 && buffer[ ret ] != '/'; --ret); @@ -2152,9 +2159,9 @@ C_path_to_executable() return buffer; # elif defined(_WIN32) && !defined(__CYGWIN__) int i; - int n = GetModuleFileName(NULL, buffer, MAX_PATH - 1); + int n = GetModuleFileName(NULL, buffer, C_MAX_PATH - 1); - if(n == 0 || n >= MAX_PATH - 1) + if(n == 0 || n >= C_MAX_PATH - 1) return NULL; for(i = n - 1; i >= 0 && buffer[ i ] != '\\'; --i); @@ -2166,7 +2173,7 @@ C_path_to_executable() CFURLRef url = CFBundleCopyExecutableURL(bundle); int i; - if(CFURLGetFileSystemRepresentation(url, true, buffer, MAX_PATH)) { + if(CFURLGetFileSystemRepresentation(url, true, buffer, C_MAX_PATH)) { for(i = C_strlen(buffer); i >= 0 && buffer[ i ] != '/') --i; buffer[ i ] = '\0'; @@ -2175,7 +2182,6 @@ C_path_to_executable() else return NULL; # elif defined(__unix__) || defined(C_XXXBSD) int i, j, k, l; - C_char *fname = C_main_argv[ 0 ]; C_char *path, *dname; /* found on stackoverflow.com: */ @@ -2191,18 +2197,20 @@ C_path_to_executable() if(*fname == '/') { fname[ i ] = '\0'; C_strcpy(buffer, fname); + return buffer; } else { /* try current dir */ - if(C_getcwd(buffer, MAX_PATH - 1) == NULL) + if(C_getcwd(buffer, C_MAX_PATH - 1) == NULL) return NULL; - j = C_strlen(buffer); C_strcat(buffer, "/"); C_strcat(buffer, fname); if(C_access(buffer, F_OK) == 0) { - buffer[ j ] = '\0'; + for(i = C_strlen(buffer); i >= 0 && buffer[ i ] != '/'; --i); + + buffer[ i ] = '\0'; return buffer; } @@ -2227,7 +2235,7 @@ C_path_to_executable() if(C_access(buffer, F_OK)) { dname = C_strdup(buffer); - l = C_readlink(dname, buffer, MAX_PATH - 1); + l = C_readlink(dname, buffer, C_MAX_PATH - 1); if(l == -1) { /* not a symlink (we ignore other errors here */Trap