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>