diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 16:14:31 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 16:14:31 +0000 |
commit | 2d5707c7479eacb3b1ad98e01b53f56a88f8fb78 (patch) | |
tree | d9c334e83692851c02e3e1b8e65570c97bc82481 /popt/findme.c | |
parent | Initial commit. (diff) | |
download | rsync-2d5707c7479eacb3b1ad98e01b53f56a88f8fb78.tar.xz rsync-2d5707c7479eacb3b1ad98e01b53f56a88f8fb78.zip |
Adding upstream version 3.2.7.upstream/3.2.7
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'popt/findme.c')
-rw-r--r-- | popt/findme.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/popt/findme.c b/popt/findme.c new file mode 100644 index 0000000..ac4cbae --- /dev/null +++ b/popt/findme.c @@ -0,0 +1,55 @@ +/** \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; + size_t bufsize; + + 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; + + bufsize = strlen(path) + 1; + start = pathbuf = alloca(bufsize); + if (pathbuf == NULL) return NULL; /* XXX can't happen */ + strlcpy(pathbuf, path, bufsize); + bufsize += sizeof "/" - 1 + strlen(argv0); + buf = malloc(bufsize); + if (buf == NULL) return NULL; /* XXX can't happen */ + + chptr = NULL; + /*@-branchstate@*/ + do { + if ((chptr = strchr(start, ':'))) + *chptr = '\0'; + snprintf(buf, bufsize, "%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; +} |