Re: [PATCH 2/2] git: continue alias lookup on EACCES errors

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 28, 2012 at 11:57 PM, Jeff King <peff@xxxxxxxx> wrote:

> +static int exists_in_PATH(const char *file)
> +{
> +       const char *p = getenv("PATH");
> +       struct strbuf buf = STRBUF_INIT;
> +
> +       if (!p || !*p)
> +               return 0;
> +
> +       while (1) {
> +               const char *end = strchrnul(p, ':');
> +
> +               strbuf_reset(&buf);
> +
> +               /* POSIX specifies an empty entry as the current directory. */
> +               if (end != p) {
> +                       strbuf_add(&buf, p, end - p);
> +                       strbuf_addch(&buf, '/');
> +               }
> +               strbuf_addstr(&buf, file);
> +
> +               if (!access(buf.buf, F_OK)) {
> +                       strbuf_release(&buf);
> +                       return 1;
> +               }
> +
> +               if (!*end)
> +                       break;
> +               p = end + 1;
> +       }
> +
> +       strbuf_release(&buf);
> +       return 0;
> +}

I expect that if more post-mortem checking is done, this function is
going to need a sibling that provides you with the first found entry
in PATH, so you can do more checks on it.


> +
> +int sane_execvp(const char *file, char * const argv[])
> +{
> +       if (!execvp(file, argv))
> +               return 0;

> +       if (errno == EACCES && !strchr(file, '/'))
> +               errno = exists_in_PATH(file) ? EACCES : ENOENT;
> +       return -1;
> +}

One of the things I ran into while working on [1] is that quite some
errors that are produced can also be caused by the interpreter. This
does cover most of the itch I had earlier. I will still want to have
the interpreter check [2] in though; errno can for example also be set
to ENOENT if the interpreter or a required library isn't available. In
that case you wouldn't want to continue to the aliases, right?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]