Annotation of embedaddon/rsync/popt/findme.c, revision 1.1
1.1 ! misho 1: /** \ingroup popt
! 2: * \file popt/findme.c
! 3: */
! 4:
! 5: /* (C) 1998-2002 Red Hat, Inc. -- Licensing details are in the COPYING
! 6: file accompanying popt source distributions, available from
! 7: ftp://ftp.rpm.org/pub/rpm/dist. */
! 8:
! 9: #include "system.h"
! 10: #include "findme.h"
! 11:
! 12: const char * findProgramPath(const char * argv0)
! 13: {
! 14: char * path = getenv("PATH");
! 15: char * pathbuf;
! 16: char * start, * chptr;
! 17: char * buf;
! 18: size_t bufsize;
! 19:
! 20: if (argv0 == NULL) return NULL; /* XXX can't happen */
! 21: /* If there is a / in the argv[0], it has to be an absolute path */
! 22: if (strchr(argv0, '/'))
! 23: return xstrdup(argv0);
! 24:
! 25: if (path == NULL) return NULL;
! 26:
! 27: bufsize = strlen(path) + 1;
! 28: start = pathbuf = alloca(bufsize);
! 29: if (pathbuf == NULL) return NULL; /* XXX can't happen */
! 30: strlcpy(pathbuf, path, bufsize);
! 31: bufsize += sizeof "/" - 1 + strlen(argv0);
! 32: buf = malloc(bufsize);
! 33: if (buf == NULL) return NULL; /* XXX can't happen */
! 34:
! 35: chptr = NULL;
! 36: /*@-branchstate@*/
! 37: do {
! 38: if ((chptr = strchr(start, ':')))
! 39: *chptr = '\0';
! 40: snprintf(buf, bufsize, "%s/%s", start, argv0);
! 41:
! 42: if (!access(buf, X_OK))
! 43: return buf;
! 44:
! 45: if (chptr)
! 46: start = chptr + 1;
! 47: else
! 48: start = NULL;
! 49: } while (start && *start);
! 50: /*@=branchstate@*/
! 51:
! 52: free(buf);
! 53:
! 54: return NULL;
! 55: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>