[brlcad-commits] CVS: brlcad/src/libbu brlcad_path.c,14.46,14.47
Open Source Solid Modeling CAD
Brought to you by:
brlcad
From: Sean M. <br...@us...> - 2007-05-20 20:20:44
|
Update of /cvsroot/brlcad/brlcad/src/libbu In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18090/src/libbu Modified Files: brlcad_path.c Log Message: revamp the implementation of most path-finding routines, and add a new bu_argv0_full_path() routine for determining the full-path to the current executing binary. remove the atexit memory handler, instead using static buffers. give bu_ipwd() one more means to determine the current path (via invoking pwd). Index: brlcad_path.c =================================================================== RCS file: /cvsroot/brlcad/brlcad/src/libbu/brlcad_path.c,v retrieving revision 14.46 retrieving revision 14.47 diff -w -u -r14.46 -r14.47 --- brlcad_path.c 15 May 2007 07:26:50 -0000 14.46 +++ brlcad_path.c 20 May 2007 20:20:44 -0000 14.47 @@ -60,6 +60,11 @@ # define BRLCAD_ROOT "/usr/brlcad" #endif + +/* internal storage for bu_getprogname/bu_setprogname */ +static char bu_progname[MAXPATHLEN] = {0}; + + static const char * brlcad_data() { @@ -75,7 +80,7 @@ /** * b u _ i p w d - * @brief + * * set/return the path to the initial working directory. * bu_setprogname() must be called on app startup for the correct pwd to * be acquired/set. @@ -85,14 +90,27 @@ { /* private stash */ static const char *ipwd = NULL; + static char buffer[MAXPATHLEN] = {0}; if (ipwd) { return ipwd; } -#ifdef HAVE_GETENV ipwd = getenv("PWD"); /* not our memory to free */ -#endif + + if (!ipwd) { + FILE *fp; + fp = popen("pwd", "r"); + if (fp) { + if (bu_fgets(buffer, MAXPATHLEN, fp)) { + ipwd = buffer; + } else { + ipwd = "."; + } + } else { + ipwd = "."; + } + } return ipwd; } @@ -107,44 +125,71 @@ * set early on by bu_setprogname(). */ const char * -bu_argv0(const char *path) +bu_argv0(void) { /* private stash */ static const char *argv0 = NULL; - /* set our initial pwd if we have not already */ + /* set initial pwd if we have not already */ (void)bu_ipwd(); - if (path) { - argv0 = path; + if (bu_progname[0] != '\0') { + argv0 = bu_progname; } #ifdef HAVE_GETPROGNAME - /* fallback to getprogname() before returning NULL. */ if (!argv0) { + /* do not call bu_getgrogname() */ argv0 = getprogname(); /* not malloc'd memory */ } -#else -#warning "Do not know how to get the name of a running executable on this sytem" - if (!argv0) { - argv0 = "unknown"; /* not malloc'd memory */ - } #endif return argv0; } -/* internal storage for bu_getprogname */ -static const char *progname = NULL; +/** + * b u _ a r g v 0 _ f u l l _ p a t h + * + * returns the full path to argv0, regardless of how the application + * was invoked. + */ +const char * +bu_argv0_full_path(void) +{ + static char buffer[MAXPATHLEN] = {0}; -/* release memory for progname on application exit */ -static void -_free_progname(void) { - if (progname) { - free((char *)progname); - progname = NULL; + const char *argv0 = bu_argv0(); + const char *ipwd = bu_ipwd(); + + const char *which = bu_which(argv0); + + if (argv0[0] == BU_DIR_SEPARATOR) { + /* seems to be a full path */ + snprintf(buffer, MAXPATHLEN, "%s", argv0); + return buffer; + } + + if (argv0[0] == '.' && argv0[1] == BU_DIR_SEPARATOR) { + /* remove a ./ if present */ + argv0 += 2; } + + /* running from installed */ + if (which) { + snprintf(buffer, MAXPATHLEN, "%s", which); + return buffer; + } + + /* running from source dir */ + snprintf(buffer, MAXPATHLEN, "%s%c%s", ipwd, BU_DIR_SEPARATOR, argv0); + if (bu_file_exists(buffer)) { + return buffer; + } + + /* give up */ + snprintf(buffer, MAXPATHLEN, "%s", argv0); + return buffer; } @@ -156,22 +201,24 @@ */ const char * bu_getprogname(void) { - const char *name; + const char *name = NULL; - if (progname) { - return progname; + if (bu_progname[0] != '\0') { + return bu_basename(bu_progname); } - name = bu_basename(bu_argv0(NULL)); - /* string returned by basename is not ours, get a copy */ - if (name) { - progname = bu_strdup(name); - } else { - progname = bu_strdup("unknown"); +#ifdef HAVE_GETPROGNAME + name = getprogname(); /* not malloc'd memory */ +#endif + + if (!name) { + name = bu_argv0(); } - atexit(_free_progname); - return progname; + snprintf(bu_progname, MAXPATHLEN, name ? name : "unknown"); + + + return bu_basename(bu_progname); } @@ -182,17 +229,19 @@ * before main() for you, but necessary otherwise for portability. */ void -bu_setprogname(const char *prog) { +bu_setprogname(const char *argv0) { + const char *base = bu_basename(argv0); + #ifdef HAVE_SETPROGNAME - const char *base = bu_basename(prog); - if (base) { - setprogname(base); - } else { - setprogname("unknown"); - } + setprogname(argv0); #endif - (void)bu_argv0(prog); + if (argv0) { + snprintf(bu_progname, MAXPATHLEN, argv0); + } + + (void)bu_ipwd(); + return; } |