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

[XEN PATCH v2 1/1] tools/libxl: search PATH for QEMU if `QEMU_XEN_PATH` is not absolute


  • To: xen-devel@xxxxxxxxxxxxxxxxxxxx
  • From: Hongbo <hehongbo@xxxxxxxx>
  • Date: Mon, 31 Mar 2025 00:03:04 +0800
  • Cc: Hongbo <hehongbo@xxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Juergen Gross <jgross@xxxxxxxx>
  • Delivery-date: Sun, 30 Mar 2025 16:04:01 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>
  • Ui-outboundreport: notjunk:1;M01:P0:Gx6iHqN3pJg=;0Tyn0EQOCHpD9pJvkemii4yQY9Q 1gdeDrDDHCNs7cK9SzYR3rYiF0MNoFdGodeBsuXC21gCeTp0AZdbKAbaULK18xrVb4LAw/Xl5 Et7VuBwvIUcN7//7P5inGCDS+RHxGGXWgzfqV51jBa3IFsGPNOuIAS/l5YNmSOMj4tNqksZBV eh+iJCzl5Z3DDlnNt3EuJjF0rLgvN6739r6NwbCbireMFYLcmRV0OYARYoDXoVn5KgKrrn3Uj UaEX6ThgmC5C1p5qltwURCVV+awU/gsQEigZQEHKocQph7Xm5+weiyzhCUuhHhuwxA8r/C7Ph NOH52KNkHozcaYFyNoYaewvyDoSYn6DltN6CxwIWYcZz7/UsF8sNvF0+zBcHfU7QJsyYEbyW8 bySPvAZSptdwHMcC+4lrgOKqHHwFY8xoyDoBX2advNMszbUItlSxMjJ+e4kIdp2/8KJNLkXP9 jGr1rZvcEA/+k5P8c+NXAuJb348c8lNVXGUo4cB4VQpbGpTyDYZaBqDnf/V0N1f70XfBMbWEJ 5vG45g2/dVbFXEDso7dEHVwQsK9As/ijd09gI2scc6wTGhaSTfC+55zsnHWZOFfGxXVciXHjD j+mEbaRJF0+2xuc+jCnjocxgtZuOaaOFAFOPtYb0HF7iDlaNOoUqllet4fqIkwqRMDfMVPmqL wduwpH/6Un7s3Dnrw0DgANo70yi3uR8erMay3Q0SJ3iv00918fm8Jof9NEci1s/SYpmM2ndX0 y0r1jblS9Cz0Z4r/pvGSiATUwd7Qx6CNwqYEN6dEHISOaxt0UEjfvB87kqoYnWJuW5HlESLRo BunO5CbzBr7m0G2IAD5cVhtY3gNg4ZHMfSNDaWAbsl6m08NYHLX66Gaf4P87VerKWSZ+VzraI cDudx9PKyDiglBwcW5ZgF5zbeD0QU7uJ7pBLG9W7Mo33EQqHtyi/ppQI2S8RFId26QlXqpte5 I0S1axGJR3krATrNMLbERMG1gpIsnFGsTJSf5HXVcY8rlbpm8Tk2BKC9rPNX8plqZ6/vMOQSZ kyPn424WJqz51vVC19V5bOqDsQD44WD7VDgOaNGnVgJoH0NFcKURzqA9B/aKxiL5EkRCGw8zx nDMrMrnCZfscpys8MKg+LM3+f8i2kZ4mKNRtTAMc7gYwdlDMyqKldQEorR2thZm9qjjPfR23r rgbKQGrXio2dUnOhGB5xIMc1CZ1cH7bDhXBu/Hl8oaywtUPGB7u7ze3XmcZ1h8e91X5Re1Ol5 t8R6wuqo/WLIhd5y4JoGl+0gOilaL2K9wnoo1d0MJ1le3eJZ+E3q5OSWaMzNbzFhzbZ3cY6Wi LOXzGeUZeTQ/jHK/4wQNyEosep18nvbTz6Es63dWnz8mnBp3nY23fF5SBkeM6kfCoF86FJDKl Xa8ryHeE5ijIMt5pT1Ji3Qu1IvZDpG7JSHtW9W/tpVc7rWOOIL8p7X7CVpF5IfGyVaYv53tiV joAppR3nZ2Va6i9MUlE3AGqEdZnY=

`QEMU_XEN_PATH` will be configured as `qemu-system-i386` with no clue where, if
`--with-system-qemu` is set without giving a path (as matched in the case `yes`
but not `*`). However, the existence of the executable is checked by `access()`,
that will not look for anywhere in $PATH but the current directory. And since it
is possible for `qemu-system-i386` (or any other configured values) to be
executed from PATH later, we'd better find that in PATH and return the full path
for the caller to check against.

Signed-off-by: Hongbo <hehongbo@xxxxxxxx>
---
v2:
 - Identify absolute/relative paths with their first char (being `/` or not).
 - Put the case inside a block `{}` to address `clang` warnings about the new
   variable.
 - Avoid unnecessary string duplications.
 - Parity of using `{}` block on both sides of `if` statements.
 - Use `libxl__abs_path()` to get absolute paths.

Updated the patch as requested.

Also, I just realized that there is a `libxl__abs_path()` (occurred just above
my patched hunk), and I should utilize that instead of doing the `%s/%s`
`snprintf` thing myself.

Let me know if further changes are needed.

Best regards,
Hongbo
---
CC: Anthony PERARD <anthony.perard@xxxxxxxxxx>
CC: Juergen Gross <jgross@xxxxxxxx>
---
 tools/libs/light/libxl_dm.c | 38 +++++++++++++++++++++++++++++++++++--
 1 file changed, 36 insertions(+), 2 deletions(-)

diff --git a/tools/libs/light/libxl_dm.c b/tools/libs/light/libxl_dm.c
index b193a5dc37..8f0bbd5d64 100644
--- a/tools/libs/light/libxl_dm.c
+++ b/tools/libs/light/libxl_dm.c
@@ -331,9 +331,43 @@ const char *libxl__domain_device_model(libxl__gc *gc,
         case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
             dm = libxl__abs_path(gc, "qemu-dm", libxl__private_bindir_path());
             break;
-        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
-            dm = qemu_xen_path(gc);
+        case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN: {
+            const char *configured_dm = qemu_xen_path(gc);
+            if (configured_dm[0] == '/')
+            {
+                dm = configured_dm;
+            }
+            else
+            {
+                const char *path_env = getenv("PATH");
+                if (!path_env)
+                {
+                    dm = configured_dm;
+                }
+                else
+                {
+                    char *path_dup = libxl__strdup(gc, path_env);
+                    char *saveptr;
+
+                    char *path = strtok_r(path_dup, ":", &saveptr);
+                    dm = NULL;
+                    while (path)
+                    {
+                        char *candidate = libxl__abs_path(gc, configured_dm, 
path);
+                        if (access(candidate, X_OK) == 0)
+                        {
+                            dm = candidate;
+                            break;
+                        }
+                        path = strtok_r(NULL, ":", &saveptr);
+                    }
+
+                    if (!dm)
+                        dm = configured_dm;
+                }
+            }
             break;
+        }
         default:
             LOG(ERROR, "invalid device model version %d",
                 info->device_model_version);
--
2.39.5 (Apple Git-154)




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.