Annotation of embedaddon/rsync/popt/findme.c, revision 1.1.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>