On Tue, Nov 3, 2026 at 9:54 AM Bruno Haible <[email protected]> wrote:

> Elliot Hughes wrote:
> > yeah, _PATH_DEFPATH is the only path string we offer anyway, but it
> should
> > be reasonable for this kind of use case.
>
> Thanks. I'm using it now, in the patch below.
>
> > > And which binaries exist in /bin = /system/bin ?
> >
> > "all the usual unix stuff [that we have]". the other stuff is probably a
> > mistake, but nothing i cared enough about to fight.
>
> Thanks for the info. Indeed, some of the binaries work (such as /bin/sh,
> /bin/ls), while others don't:
>
> $ /bin/df
> /bin/df: 1: Syntax error: word unexpected (expecting ")")
>
> Probably this doesn't get reported, because people don't know about
> these binaries :)
>

"works for me", but it's quite possible there's no CTS test for this so it
could be broken on your device. (there are a lot of _implicit_ CTS tests
for stuff in /bin because it's so handy to be able to use stat(1) or
whatever in a test for something else, but we don't explicitly include the
toybox tests as part of CTS.)

wanting to answer the question "when did we add df anyway?" i realized you
might be interested in
https://android.googlesource.com/platform/system/core/+/master/shell_and_utilities/README.md
which is just "the unixy subset" of what's in /bin, and so doesn't include
things like dex2oat or app_process64 or any of the other "androidy" stuff.


> Bruno
>
>
> 2026-11-03  Bruno Haible  <[email protected]>
>
>         findprog*: Don't use the empty PATH as fallback on most platforms.
>         Reported by Pádraig Brady in
>         <
> https://lists.gnu.org/archive/html/bug-gnulib/2026-11/msg00010.html>.
>         * lib/findprog.c: Include <paths.h>.
>         (find_in_path): If confstr fails, just abort. On Android, use
>         _PATH_DEFPATH, as recommended by Elliott Hughes.
>         * lib/findprog-in.c: Include <paths.h>.
>         (find_in_given_path): If confstr fails, just abort. On Android, use
>         _PATH_DEFPATH, as recommended by Elliott Hughes.
>
> diff --git a/lib/findprog-in.c b/lib/findprog-in.c
> index d937f7c834..24cd2f9014 100644
> --- a/lib/findprog-in.c
> +++ b/lib/findprog-in.c
> @@ -26,6 +26,9 @@
>  #include <string.h>
>  #include <unistd.h>
>  #include <sys/stat.h>
> +#ifdef __ANDROID__
> +# include <paths.h>
> +#endif
>
>  #include "filename.h"
>  #include "concat-filename.h"
> @@ -223,10 +226,18 @@ find_in_given_path (const char *progname, const char
> *path,
>           dependent.  On POSIX systems, it is confstr (_CS_PATH).  */
>        #if HAVE_CONFSTR
>        int ret = confstr (_CS_PATH, default_path, sizeof (default_path));
> -      if (ret == 0 || ret > sizeof (default_path))
> -      #endif
> -        default_path[0] = '\0';
> +      if (ret == 0)
> +        /* The platform has confstr(), but it does not support _CS_PATH.
> */
> +        abort ();
> +      if (ret > sizeof (default_path))
> +        /* MAX_DEFAULT_PATH_SIZE is too small.  Increase it.  */
> +        abort ();
>        path = default_path;
> +      #elif defined __ANDROID__
> +      path = _PATH_DEFPATH;
> +      #else /* native Windows, Minix */
> +      path = "";
> +      #endif
>      }
>
>    {
> diff --git a/lib/findprog.c b/lib/findprog.c
> index 2d321dc0d9..2a017e8686 100644
> --- a/lib/findprog.c
> +++ b/lib/findprog.c
> @@ -27,6 +27,9 @@
>  #if !(defined _WIN32 || defined __CYGWIN__ || defined __EMX__ || defined
> __DJGPP__)
>  # include <sys/stat.h>
>  #endif
> +#ifdef __ANDROID__
> +# include <paths.h>
> +#endif
>
>  /* Avoid collision between findprog.c and findprog-lgpl.c.  */
>  #if IN_FINDPROG_LGPL || ! GNULIB_FINDPROG_LGPL
> @@ -69,7 +72,7 @@ find_in_path (const char *progname)
>         the current directory.  PATH is not used.  */
>      return progname;
>
> -  char *path = getenv ("PATH");
> +  const char *path = getenv ("PATH");
>    char default_path[MAX_DEFAULT_PATH_SIZE];
>    if (path == NULL)
>      {
> @@ -77,24 +80,33 @@ find_in_path (const char *progname)
>           dependent.  On POSIX systems, it is confstr (_CS_PATH).  */
>        #if HAVE_CONFSTR
>        int ret = confstr (_CS_PATH, default_path, sizeof (default_path));
> -      if (ret == 0 || ret > sizeof (default_path))
> -      #endif
> -        default_path[0] = '\0';
> +      if (ret == 0)
> +        /* The platform has confstr(), but it does not support _CS_PATH.
> */
> +        abort ();
> +      if (ret > sizeof (default_path))
> +        /* MAX_DEFAULT_PATH_SIZE is too small.  Increase it.  */
> +        abort ();
>        path = default_path;
> +      #elif defined __ANDROID__
> +      path = _PATH_DEFPATH;
> +      #else /* native Windows, Minix */
> +      path = "";
> +      #endif
>      }
>    if (*path == '\0')
>      return progname;
>
>    /* Make a copy, to prepare for destructive modifications.  */
> +  char *path_copy;
>  # if !IN_FINDPROG_LGPL
> -  path = xstrdup (path);
> +  path_copy = xstrdup (path);
>  # else
> -  path = strdup (path);
> -  if (path == NULL)
> +  path_copy = strdup (path);
> +  if (path_copy == NULL)
>      /* Out of memory.  */
>      return progname;
>  # endif
> -  for (char *path_rest = path; ; )
> +  for (char *path_rest = path_copy; ; )
>      {
>        /* Extract next directory in PATH.  */
>        const char *dir = path_rest;
> @@ -117,7 +129,7 @@ find_in_path (const char *progname)
>        if (progpathname == NULL)
>          {
>            /* Out of memory.  */
> -          free (path);
> +          free (path_copy);
>            return progname;
>          }
>  # endif
> @@ -149,7 +161,7 @@ find_in_path (const char *progname)
>                    if (progpathname == NULL)
>                      {
>                        /* Out of memory.  */
> -                      free (path);
> +                      free (path_copy);
>                        return progname;
>                      }
>  # endif
> @@ -158,7 +170,7 @@ find_in_path (const char *progname)
>                    memcpy (progpathname + 2, progname, strlen (progname) +
> 1);
>                  }
>
> -              free (path);
> +              free (path_copy);
>                return progpathname;
>              }
>          }
> @@ -172,7 +184,7 @@ find_in_path (const char *progname)
>      }
>
>    /* Not found in PATH.  An error will be signalled at the first call.  */
> -  free (path);
> +  free (path_copy);
>    return progname;
>  #endif
>  }
>
>
>
>

Reply via email to