*/
char *fakerootdir;
+/* To add a new mocked prefix in virpcimock:
+ * - add the prefix here as a define to make it easier to track what we
+ * are mocking;
+ * - add it to the 'pathPrefixIsMocked()' helper;
+ * - (optional) edit 'getrealpath()' if you need the resulting mocked
+ * path to be different than <fakerootdir>/path
+ */
# define SYSFS_PCI_PREFIX "/sys/bus/pci/"
+# define SYSFS_KERNEL_PREFIX "/sys/kernel/"
+# define DEV_VFIO_PREFIX "/dev/vfio/"
# define STDERR(...) \
fprintf(stderr, "%s %zu: ", __FUNCTION__, (size_t) __LINE__); \
return ret;
}
+static bool
+pathPrefixIsMocked(const char *path)
+{
+ return STRPREFIX(path, SYSFS_PCI_PREFIX) ||
+ STRPREFIX(path, SYSFS_KERNEL_PREFIX) ||
+ STRPREFIX(path, DEV_VFIO_PREFIX);
+}
+
static int
getrealpath(char **newpath,
const char *path)
{
- init_env();
+ if (!fakerootdir && pathPrefixIsMocked(path))
+ init_env();
if (STRPREFIX(path, SYSFS_PCI_PREFIX)) {
if (virAsprintfQuiet(newpath, "%s/sys/bus/pci/%s",
errno = ENOMEM;
return -1;
}
- } else if (STRPREFIX(path, "/sys/kernel/") ||
- STRPREFIX(path, "/dev/vfio/")) {
-
+ } else if (pathPrefixIsMocked(path)) {
if (virAsprintfQuiet(newpath, "%s/%s",
fakerootdir,
path) < 0) {
{
VIR_AUTOFREE(char *) tmp = NULL;
- if (fakerootdir)
- return;
-
if (!(fakerootdir = getenv("LIBVIRT_FAKE_ROOT_DIR")))
ABORT("Missing LIBVIRT_FAKE_ROOT_DIR env variable\n");
init_syms();
- if (STRPREFIX(path, SYSFS_PCI_PREFIX) &&
- getrealpath(&newpath, path) < 0)
+ if (getrealpath(&newpath, path) < 0)
return -1;
- return real_access(newpath ? newpath : path, mode);
+ return real_access(newpath, mode);
}
static int
virMockStatRedirect(const char *path, char **newpath)
{
- if (STRPREFIX(path, SYSFS_PCI_PREFIX)) {
- if (getrealpath(newpath, path) < 0)
- return -1;
- }
+ if (getrealpath(newpath, path) < 0)
+ return -1;
+
return 0;
}
init_syms();
- if (STRPREFIX(path, SYSFS_PCI_PREFIX) &&
- getrealpath(&newpath, path) < 0)
+ if (getrealpath(&newpath, path) < 0)
return -1;
if (flags & O_CREAT) {
va_start(ap, flags);
mode = (mode_t) va_arg(ap, int);
va_end(ap);
- ret = real_open(newpath ? newpath : path, flags, mode);
+ ret = real_open(newpath, flags, mode);
} else {
- ret = real_open(newpath ? newpath : path, flags);
+ ret = real_open(newpath, flags);
}
/* Catch both: /sys/bus/pci/drivers/... and
init_syms();
- if (STRPREFIX(path, SYSFS_PCI_PREFIX) &&
- getrealpath(&newpath, path) < 0)
+ if (getrealpath(&newpath, path) < 0)
return -1;
- ret = real___open_2(newpath ? newpath : path, flags);
+ ret = real___open_2(newpath, flags);
/* Catch both: /sys/bus/pci/drivers/... and
* /sys/bus/pci/device/.../driver/... */
init_syms();
- if ((STRPREFIX(path, SYSFS_PCI_PREFIX) ||
- STRPREFIX(path, "/sys/kernel/")) &&
- getrealpath(&newpath, path) < 0)
+ if (getrealpath(&newpath, path) < 0)
return NULL;
- return real_opendir(newpath ? newpath : path);
+ return real_opendir(newpath);
}
int
init_syms();
- if (STRPREFIX(path, SYSFS_PCI_PREFIX) &&
- getrealpath(&newpath, path) < 0)
+ if (getrealpath(&newpath, path) < 0)
return NULL;
- return real_virFileCanonicalizePath(newpath ? newpath : path);
+ return real_virFileCanonicalizePath(newpath);
}
# include "virmockstathelpers.c"