Enlightenment CVS committal Author : raster Project : e17 Module : apps/e
Dir : e17/apps/e/src/bin Modified Files: e_prefix.c Log Message: e prefix black magic additions. this is really black magic now... =================================================================== RCS file: /cvs/e/e17/apps/e/src/bin/e_prefix.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- e_prefix.c 5 Mar 2006 06:23:14 -0000 1.12 +++ e_prefix.c 10 Jul 2006 16:37:52 -0000 1.13 @@ -4,6 +4,7 @@ #include "e.h" /* local subsystem functions */ +static int _e_prefix_share_hunt(void); static int _e_prefix_fallbacks(void); static int _e_prefix_try_proc(void); static int _e_prefix_try_argv(char *argv0); @@ -16,14 +17,56 @@ static char *_prefix_path_data = NULL; static char *_prefix_path_lib = NULL; +#define PREFIX_CACHE_FILE 1 +#define SHARE_D "share/enlightenment" +#define MAGIC_FILE "AUTHORS" +#define MAGIC_DAT SHARE_D"/"MAGIC_FILE +#define LOCALE_D "share/locale" + /* externally accessible functions */ EAPI int e_prefix_determine(char *argv0) { - char *p; + char *p, buf[4096]; e_prefix_shutdown(); - + + /* if user provides E_PREFIX - then use that or also more specific sub + * dirs for bin, lib, data and locale */ + if (getenv("E_PREFIX")) + { + _prefix_path = strdup(getenv("E_PREFIX")); + if (getenv("E_BIN_DIR")) + _prefix_path_bin = strdup(getenv("E_BIN_DIR")); + else + { + snprintf(buf, sizeof(buf), "%s/bin", _prefix_path); + _prefix_path_bin = strdup(buf); + } + if (getenv("E_LIB_DIR")) + _prefix_path_bin = strdup(getenv("E_LIB_DIR")); + else + { + snprintf(buf, sizeof(buf), "%s/lib", _prefix_path); + _prefix_path_lib = strdup(buf); + } + if (getenv("E_DATA_DIR")) + _prefix_path_data = strdup(getenv("E_DATA_DIR")); + else + { + snprintf(buf, sizeof(buf), "%s/"SHARE_D, _prefix_path); + _prefix_path_data = strdup(buf); + } + if (getenv("E_LOCALE_DIR")) + _prefix_path_locale = strdup(getenv("E_LOCALE_DIR")); + else + { + snprintf(buf, sizeof(buf), "%s/"LOCALE_D, _prefix_path); + _prefix_path_locale = strdup(buf); + } + return 1; + } + /* no env var - examine process and possible argv0 */ if (!_e_prefix_try_proc()) { if (!_e_prefix_try_argv(argv0)) @@ -55,44 +98,50 @@ { strncpy(_prefix_path, _exe_path, p - _exe_path); _prefix_path[p - _exe_path] = 0; - - _prefix_path_locale = malloc(strlen(_prefix_path) + 1 + - strlen("/share/locale")); - strcpy(_prefix_path_locale, _prefix_path); - strcat(_prefix_path_locale, "/share/locale"); - - _prefix_path_bin = malloc(strlen(_prefix_path) + 1 + - strlen("/bin")); - strcpy(_prefix_path_bin, _prefix_path); - strcat(_prefix_path_bin, "/bin"); - - _prefix_path_data = malloc(strlen(_prefix_path) + 1 + - strlen("/share/enlightenment")); - strcpy(_prefix_path_data, _prefix_path); - strcat(_prefix_path_data, "/share/enlightenment"); - - _prefix_path_lib = malloc(strlen(_prefix_path) + 1 + - strlen("/lib")); - strcpy(_prefix_path_lib, _prefix_path); - strcat(_prefix_path_lib, "/lib"); + + /* bin and lib always together */ + snprintf(buf, sizeof(buf), "%s/bin", _prefix_path); + _prefix_path_bin = strdup(buf); + snprintf(buf, sizeof(buf), "%s/lib", _prefix_path); + _prefix_path_lib = strdup(buf); printf("DYNAMIC DETERMINED PREFIX: %s\n", _prefix_path); + + /* check if AUTHORS file is there - then our guess is right */ + snprintf(buf, sizeof(buf), "%s/"MAGIC_DAT, _prefix_path); + if (ecore_file_exists(buf)) + { + snprintf(buf, sizeof(buf), "%s/"SHARE_D, _prefix_path); + _prefix_path_data = strdup(buf); + snprintf(buf, sizeof(buf), "%s/"LOCALE_D, _prefix_path); + _prefix_path_locale = strdup(buf); + } + /* AUTHORS file not there. time to start hunting! */ + else + { + if (_e_prefix_share_hunt()) + { + printf("DIFFERENT DYNAMIC DETERMINED DATA DIR: %s\n", _prefix_path_data); + printf("DIFFERENT DYNAMIC DETERMINED LOCALE DIR: %s\n", _prefix_path_locale); + } + else + { + e_prefix_fallback(); + return 0; + } + } return 1; } else { - free(_exe_path); - _exe_path = NULL; - _e_prefix_fallbacks(); + e_prefix_fallback(); return 0; } } p--; } } - free(_exe_path); - _exe_path = NULL; - _e_prefix_fallbacks(); + e_prefix_fallback(); return 0; } @@ -146,6 +195,145 @@ /* local subsystem functions */ static int +_e_prefix_share_hunt(void) +{ + char buf[4096], buf2[4096], *p; + FILE *f; +#ifdef PREFIX_CACHE_FILE + char *home; +#endif + + /* sometimes this isnt the case - so we need to do a more exhaustive search + * through more parent and subdirs. hre is an example i have seen: + * + * /blah/whatever/exec/bin/exe + * -> + * /blah/whatever/exec/bin + * /blah/whatever/common/share/enlightenment + * /blah/whatever/common/share/locale + * /blah/whatever/exec/lib + */ + + /* this is pure black magic to try and find data shares */ +#ifdef PREFIX_CACHE_FILE + /* 1. check cache file - as a first attempt. this will speed up subsequent + * hunts - if needed */ + home = e_user_homedir_get(); + if (!home) return 0; + + snprintf(buf, sizeof(buf), "%s/.e/e/prefix_share_cache.txt", home); + f = fopen(buf, "r"); + if (f) + { + if (fgets(buf2, sizeof(buf2), f)) + { + int len; + + len = strlen(buf2); + if (len > 1) buf2[len - 1] = 0; + snprintf(buf, sizeof(buf), "%s/"MAGIC_FILE, buf2); + if (ecore_file_exists(buf)) + { + /* path is ok - magic file found */ + _prefix_path_data = strdup(buf2); + snprintf(buf, sizeof(buf), "%s", buf2); + p = strrchr(buf, '/'); + if (p) *p = 0; + snprintf(buf2, sizeof(buf2), "%s/locale", buf); + _prefix_path_locale = strdup(buf2); + fclose(f); + free(home); + return 1; + } + } + fclose(f); + } +#endif + /* 2. cache file doesn't exist or is invalid - we need to search - this is + * where the real black magic begins */ + + /* BLACK MAGIC 1: + * /blah/whatever/dir1/bin + * /blah/whatever/dir2/share/enlightenment + */ + if (!_prefix_path_data) + { + Ecore_List *files; + + snprintf(buf, sizeof(buf), "%s", _prefix_path); + p = strrchr(buf, '/'); + if (p) *p = 0; + files = ecore_file_ls(buf); + if (files) + { + char *file; + + ecore_list_goto_first(files); + while ((file = ecore_list_current(files))) + { + snprintf(buf2, sizeof(buf2), "%s/%s/"MAGIC_DAT, buf, file); + if (ecore_file_exists(buf2)) + { + snprintf(buf2, sizeof(buf2), "%s/%s/"SHARE_D, buf, file); + _prefix_path_data = strdup(buf2); + snprintf(buf2, sizeof(buf2), "%s/%s/"LOCALE_D, buf, file); + _prefix_path_locale = strdup(buf2); + break; + } + ecore_list_next(files); + } + ecore_list_destroy(files); + } + } + + /* BLACK MAGIC 2: + * /blah/whatever/dir1/bin + * /blah/whatever/share/enlightenment + */ + if (!_prefix_path_data) + { + snprintf(buf, sizeof(buf), "%s", _prefix_path); + p = strrchr(buf, '/'); + if (p) *p = 0; + snprintf(buf2, sizeof(buf2), "%s/"MAGIC_DAT, buf); + if (ecore_file_exists(buf2)) + { + snprintf(buf2, sizeof(buf2), "%s/"SHARE_D, buf); + _prefix_path_data = strdup(buf2); + snprintf(buf2, sizeof(buf2), "%s/"LOCALE_D, buf); + _prefix_path_locale = strdup(buf2); + } + } + + /* add more black magic as required as we discover weridnesss - remember + * this is to save users having to set environment variables to tell + * e where it lives, so e auto-adapts. so these code snippets are just + * logic to figure that out for the user + */ + + /* done. we found it - write cache file */ + if (_prefix_path_data) + { +#ifdef PREFIX_CACHE_FILE + snprintf(buf, sizeof(buf), "%s/.e/e", home); + ecore_file_mkpath(buf); + snprintf(buf, sizeof(buf), "%s/.e/e/prefix_share_cache.txt", home); + f = fopen(buf, "w"); + if (f) + { + fprintf(f, "%s\n", _prefix_path_data); + fclose(f); + } + free(home); +#endif + return 1; + } + /* fail. everything failed */ + free(home); + return 0; +} + +static int _e_prefix_fallbacks(void) { char *p; @@ -154,12 +342,24 @@ p = strrchr(_prefix_path, '/'); if (p) *p = 0; _prefix_path_locale = strdup(LOCALE_DIR); - _prefix_path_bin = strdup(PACKAGE_BIN_DIR); - _prefix_path_data = strdup(PACKAGE_DATA_DIR); - _prefix_path_lib = strdup(PACKAGE_LIB_DIR); + _prefix_path_bin = strdup(PACKAGE_BIN_DIR); + _prefix_path_data = strdup(PACKAGE_DATA_DIR); + _prefix_path_lib = strdup(PACKAGE_LIB_DIR); printf("WARNING: Enlightenment could not determine its installed prefix\n" " and is falling back on the compiled in default:\n" - " %s\n", _prefix_path); + " %s\n", + " You might like to try setting the following environment variables:\n" + " E_PREFIX - points to the base prefix of install\n" + " E_BIN_DIR - optional in addition to E_PREFIX to provide\n" + " a more specific binary directory\n" + " E_LIB_DIR - optional in addition to E_PREFIX to provide\n" + " a more specific library dir\n" + " E_DATA_DIR - optional in addition to E_PREFIX to provide\n" + " a more specific location for shared data\n" + " E_LOCALE_DIR - optional in addition to E_PREFIX to provide\n" + " a more specific location for locale data\n" + , + _prefix_path); return 1; } ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs