~ 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