diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2008-09-17 14:11:12 +0200 |
---|---|---|
committer | Jelmer Vernooij <jelmer@samba.org> | 2008-09-17 14:11:12 +0200 |
commit | 94855cd69248f0f90b6c828588afa012adc8bd45 (patch) | |
tree | 6a164679824d29f5e825d78720cc905c8982d8be /lib/popt/findme.c | |
parent | 323346f7b01314bdec418d585fae236f736068fa (diff) | |
download | samba-94855cd69248f0f90b6c828588afa012adc8bd45.tar.gz samba-94855cd69248f0f90b6c828588afa012adc8bd45.tar.bz2 samba-94855cd69248f0f90b6c828588afa012adc8bd45.zip |
Move common libraries from root to lib/.
Diffstat (limited to 'lib/popt/findme.c')
-rw-r--r-- | lib/popt/findme.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/popt/findme.c b/lib/popt/findme.c new file mode 100644 index 0000000000..b28981ba1f --- /dev/null +++ b/lib/popt/findme.c @@ -0,0 +1,50 @@ +/** \ingroup popt + * \file popt/findme.c + */ + +/* (C) 1998-2002 Red Hat, Inc. -- Licensing details are in the COPYING + file accompanying popt source distributions, available from + ftp://ftp.rpm.org/pub/rpm/dist. */ + +#include "system.h" +#include "findme.h" + +const char * findProgramPath(const char * argv0) { + char * path = getenv("PATH"); + char * pathbuf; + char * start, * chptr; + char * buf; + + if (argv0 == NULL) return NULL; /* XXX can't happen */ + /* If there is a / in the argv[0], it has to be an absolute path */ + if (strchr(argv0, '/')) + return xstrdup(argv0); + + if (path == NULL) return NULL; + + start = pathbuf = (char *)alloca(strlen(path) + 1); + buf = (char *)malloc(strlen(path) + strlen(argv0) + sizeof("/")); + if (buf == NULL) return NULL; /* XXX can't happen */ + strcpy(pathbuf, path); + + chptr = NULL; + /*@-branchstate@*/ + do { + if ((chptr = strchr(start, ':'))) + *chptr = '\0'; + sprintf(buf, "%s/%s", start, argv0); + + if (!access(buf, X_OK)) + return buf; + + if (chptr) + start = chptr + 1; + else + start = NULL; + } while (start && *start); + /*@=branchstate@*/ + + free(buf); + + return NULL; +} |