[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
`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)
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |