File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / popt / findme.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:09:30 2012 UTC (12 years, 4 months ago) by misho
Branches: rsync, MAIN
CVS tags: v3_2_3, v3_1_2p5, rsync3_0_9p0, RSYNC3_1_0, RSYNC3_0_9, HEAD
rsync

    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>