[PATCH 2/3] virfile: Simplify virFindFileInPath() with g_find_program_in_path()

Martin Kletzander mkletzan at redhat.com
Fri Jun 4 10:26:09 UTC 2021


On Mon, May 31, 2021 at 09:48:23AM +0800, Luke Yue wrote:
>The behavior is a little bit different when using
>g_find_program_in_path(), when the `file` contains a relative path, the
>original function would return a absolute path, but the
>g_find_program_in_path() would probably return a relative one.
>
>Other conditions would be fine, so just use g_find_program_in_path() to
>simplify the implementation. Note that when PATH is not set,
>g_find_program_in_path() will search in `/bin:/usr/bin:.`.
>

That is the main issue I see with this patch.  Before we were searching
in PATH or, if unset, `/bin:/usr/bin`, but not the current directory.

I am a bit worried about that, but since that is the same way execvp()
would search for the binary I guess that's fine.

There is one thing that we should keep, though, and that is the fact
that the function returns an absolute path as there might be (and I
believe there is) a caller that depends on it.

>Signed-off-by: Luke Yue <lukedyue at gmail.com>
>---
> src/util/virfile.c | 42 ++++++------------------------------------
> 1 file changed, 6 insertions(+), 36 deletions(-)
>
>diff --git a/src/util/virfile.c b/src/util/virfile.c
>index dc2834fd1c..0d1c2ba518 100644
>--- a/src/util/virfile.c
>+++ b/src/util/virfile.c
>@@ -1662,27 +1662,14 @@ virFileIsLink(const char *linkpath)
> char *
> virFindFileInPath(const char *file)
> {
>-    const char *origpath = NULL;
>-    g_auto(GStrv) paths = NULL;
>-    char **pathiter;
>-
>     if (file == NULL)
>         return NULL;
>
>-    /* if we are passed an absolute path (starting with /), return a
>-     * copy of that path, after validating that it is executable
>-     */
>-    if (g_path_is_absolute(file)) {
>-        if (!virFileIsExecutable(file))
>-            return NULL;
>-
>-        return g_strdup(file);
>-    }
>-
>-    /* If we are passed an anchored path (containing a /), then there
>-     * is no path search - it must exist in the current directory
>+    /* If we are passed an anchored path (containing a /), and it's not an
>+     * absolute path then there is no path search - it must exist in the current
>+     * directory
>      */
>-    if (strchr(file, '/')) {
>+    if (!g_path_is_absolute(file) && strchr(file, '/')) {
>         char *abspath = NULL;
>

This is also already handled by g_find_program_in_path() so it can be removed.

>         if (!virFileIsExecutable(file))
>@@ -1692,25 +1679,8 @@ virFindFileInPath(const char *file)
>         return abspath;
>     }
>
>-    /* copy PATH env so we can tweak it */
>-    origpath = getenv("PATH");
>-    if (!origpath)
>-        origpath = "/bin:/usr/bin";
>-
>-    /* for each path segment, append the file to search for and test for
>-     * it. return it if found.
>-     */
>-
>-    if (!(paths = g_strsplit(origpath, ":", 0)))
>-        return NULL;
>-
>-    for (pathiter = paths; *pathiter; pathiter++) {
>-        g_autofree char *fullpath = g_build_filename(*pathiter, file, NULL);
>-        if (virFileIsExecutable(fullpath))
>-            return g_steal_pointer(&fullpath);
>-    }
>-
>-    return NULL;
>+    /* Otherwise, just use g_find_program_in_path() */
>+    return g_find_program_in_path(file);

And wrap the result in virFileAbsPath() so that it keeps that
functionality.  Otherwise it would just be a wrapper for
g_find_program_in_path() and could be removed altogether.

> }
>
>
>-- 
>2.31.1
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20210604/1c7f0029/attachment-0001.sig>


More information about the libvir-list mailing list