summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/src/Makefile.am2
-rw-r--r--tests/src/libsystem.c91
2 files changed, 87 insertions, 6 deletions
diff --git a/tests/src/Makefile.am b/tests/src/Makefile.am
index cc25269b..0e202e94 100644
--- a/tests/src/Makefile.am
+++ b/tests/src/Makefile.am
@@ -8,6 +8,8 @@ libsystem_la_CFLAGS = \
$(GIO_UNIX_CFLAGS) \
-DSRCDIR=\"$(abs_top_srcdir)\" \
-DBUILDDIR=\"$(abs_top_builddir)\" \
+ -DSYSCONFDIR=\"$(sysconfdir)\" \
+ -DLOCALSTATEDIR=\"$(localstatedir)\" \
-DCONFIG_DIR=\"$(sysconfdir)/lightdm\"
libsystem_la_LIBADD = -ldl $(GLIB_LIBS) $(GIO_UNIX_LIBS)
diff --git a/tests/src/libsystem.c b/tests/src/libsystem.c
index e66e6f7e..95896883 100644
--- a/tests/src/libsystem.c
+++ b/tests/src/libsystem.c
@@ -151,16 +151,31 @@ setresuid (uid_t ruid, uid_t uuid, uid_t suid)
static gchar *
redirect_path (const gchar *path)
{
+ gchar *p;
+ gboolean matches;
+ size_t offset;
+
if (g_str_has_prefix (path, g_getenv ("LIGHTDM_TEST_ROOT")))
return g_strdup (path);
- else if (strcmp (path, CONFIG_DIR "/lightdm.conf") == 0)
+
+ if (strcmp (path, CONFIG_DIR "/lightdm.conf") == 0)
return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "etc", "lightdm", "lightdm.conf", NULL);
- else if (g_str_has_prefix (path, "/tmp/"))
+
+ p = g_strdup_printf ("%s/", SYSCONFDIR);
+ offset = strlen (p);
+ matches = g_str_has_prefix (path, p);
+ g_free (p);
+ if (g_str_has_prefix (path, "/tmp/"))
return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "tmp", path + 5, NULL);
- else if (g_str_has_prefix (path, "/var/"))
- return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "var", path + 5, NULL);
- else
- return g_strdup (path);
+
+ p = g_strdup_printf ("%s/", LOCALSTATEDIR);
+ offset = strlen (p);
+ matches = g_str_has_prefix (path, p);
+ g_free (p);
+ if (matches)
+ return g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "var", path + offset, NULL);
+
+ return g_strdup (path);
}
#ifdef __linux__
@@ -283,6 +298,70 @@ access (const char *pathname, int mode)
}
int
+stat (const char *path, struct stat *buf)
+{
+ int (*_stat) (const char *path, struct stat *buf);
+ gchar *new_path = NULL;
+ int ret;
+
+ _stat = (int (*)(const char *path, struct stat *buf)) dlsym (RTLD_NEXT, "stat");
+
+ new_path = redirect_path (path);
+ ret = _stat (new_path, buf);
+ g_free (new_path);
+
+ return ret;
+}
+
+int
+stat64 (const char *path, struct stat *buf)
+{
+ int (*_stat64) (const char *path, struct stat *buf);
+ gchar *new_path = NULL;
+ int ret;
+
+ _stat64 = (int (*)(const char *path, struct stat *buf)) dlsym (RTLD_NEXT, "stat64");
+
+ new_path = redirect_path (path);
+ ret = _stat (new_path, buf);
+ g_free (new_path);
+
+ return ret;
+}
+
+int
+__xstat (int version, const char *path, struct stat *buf)
+{
+ int (*___xstat) (int version, const char *path, struct stat *buf);
+ gchar *new_path = NULL;
+ int ret;
+
+ ___xstat = (int (*)(int version, const char *path, struct stat *buf)) dlsym (RTLD_NEXT, "__xstat");
+
+ new_path = redirect_path (path);
+ ret = ___xstat (version, new_path, buf);
+ g_free (new_path);
+
+ return ret;
+}
+
+int
+__xstat64 (int version, const char *path, struct stat *buf)
+{
+ int (*___xstat64) (int version, const char *path, struct stat *buf);
+ gchar *new_path = NULL;
+ int ret;
+
+ ___xstat64 = (int (*)(int version, const char *path, struct stat *buf)) dlsym (RTLD_NEXT, "__xstat64");
+
+ new_path = redirect_path (path);
+ ret = ___xstat64 (version, new_path, buf);
+ g_free (new_path);
+
+ return ret;
+}
+
+int
mkdir (const char *pathname, mode_t mode)
{
int (*_mkdir) (const char *pathname, mode_t mode);