qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] sysroot


From: Edgar E. Iglesias
Subject: Re: [Qemu-devel] sysroot
Date: Mon, 3 Mar 2008 15:16:17 +0100
User-agent: Mutt/1.5.16 (2007-06-09)

Apologies, this was the correct sysroot patch.

Best regards
-- 
Edgar E. Iglesias
Axis Communications AB

diff --git a/darwin-user/qemu.h b/darwin-user/qemu.h
index 41b57f8..2147da3 100644
--- a/darwin-user/qemu.h
+++ b/darwin-user/qemu.h
@@ -106,7 +106,7 @@ void write_dt(void *ptr, unsigned long addr, unsigned long 
limit, int flags);
 
 extern CPUState *global_env;
 void cpu_loop(CPUState *env);
-void init_paths(const char *prefix);
+void init_paths(const char *prefix, int sysroot);
 const char *path(const char *pathname);
 
 extern int loglevel;
diff --git a/linux-user/main.c b/linux-user/main.c
index 0079c7a..1c63610 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -1912,6 +1912,7 @@ void usage(void)
            "-d options   activate log (logfile=%s)\n"
            "-p pagesize  set the host page size to 'pagesize'\n"
            "-strace      log system calls\n"
+           "-sysroot     Root for system calls with absolute file-names\n"
            "\n"
            "Environment variables:\n"
            "QEMU_STRACE       Print system calls and arguments similar to 
the\n"
@@ -1943,6 +1944,7 @@ int main(int argc, char **argv)
     int gdbstub_port = 0;
     int drop_ld_preload = 0, environ_count = 0;
     char **target_environ, **wrk, **dst;
+    char *sysroot = NULL;
 
     if (argc <= 1)
         usage();
@@ -2014,6 +2016,8 @@ int main(int argc, char **argv)
             drop_ld_preload = 1;
         } else if (!strcmp(r, "strace")) {
             do_strace = 1;
+        } else if (!strcmp(r, "sysroot")) {
+            sysroot = argv[optind++];
         } else
         {
             usage();
@@ -2030,7 +2034,10 @@ int main(int argc, char **argv)
     memset(info, 0, sizeof(struct image_info));
 
     /* Scan interp_prefix dir for replacement files. */
-    init_paths(interp_prefix);
+    if (sysroot)
+        init_paths(sysroot, 1);
+    else
+        init_paths(interp_prefix, 0);
 
     if (cpu_model == NULL) {
 #if defined(TARGET_I386)
diff --git a/linux-user/path.c b/linux-user/path.c
index 7da0a8b..19b9889 100644
--- a/linux-user/path.c
+++ b/linux-user/path.c
@@ -25,6 +25,8 @@ struct pathelem
 };
 
 static struct pathelem *base;
+static int use_sysroot;
+static size_t sysroot_pathlen;
 
 /* First N chars of S1 match S2, and S2 is N chars long. */
 static int strneq(const char *s1, unsigned int n, const char *s2)
@@ -118,7 +120,7 @@ follow_path(const struct pathelem *cursor, const char *name)
     return NULL;
 }
 
-void init_paths(const char *prefix)
+void init_paths(const char *prefix, int sysroot)
 {
     char pref_buf[PATH_MAX];
 
@@ -137,13 +139,21 @@ void init_paths(const char *prefix)
     } else
         strcpy(pref_buf,prefix + 1);
 
-    base = new_entry("", NULL, pref_buf);
-    base = add_dir_maybe(base);
-    if (base->num_entries == 0) {
-        free (base);
-        base = NULL;
+    use_sysroot = sysroot;
+    if (sysroot) {
+        base = malloc(sizeof (*base));
+        sysroot_pathlen = strlen(pref_buf);
+        base->pathname = malloc(sysroot_pathlen + PATH_MAX + 1);
+        memcpy(base->pathname, pref_buf, sysroot_pathlen);
     } else {
-        set_parents(base, base);
+        base = new_entry("", NULL, pref_buf);
+        base = add_dir_maybe(base);
+        if (base->num_entries == 0) {
+            free (base);
+            base = NULL;
+        } else {
+            set_parents(base, base);
+        }
     }
 }
 
@@ -155,5 +165,12 @@ const char *path(const char *name)
     if (!base || name[0] != '/')
        return name;
 
-    return follow_path(base, name) ?: name;
+    if (use_sysroot) {
+        size_t name_len;
+        /* Prepend base->pathname to name.  */
+        name_len = strlen(name);
+        memcpy (base->pathname + sysroot_pathlen, name, name_len + 1);
+        return base->pathname;
+    } else
+        return follow_path(base, name) ?: name;
 }
diff --git a/linux-user/qemu.h b/linux-user/qemu.h
index b33ad89..9e1b4f4 100644
--- a/linux-user/qemu.h
+++ b/linux-user/qemu.h
@@ -166,7 +166,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 void gemu_log(const char *fmt, ...) __attribute__((format(printf,1,2)));
 extern CPUState *global_env;
 void cpu_loop(CPUState *env);
-void init_paths(const char *prefix);
+void init_paths(const char *prefix, int sysroot);
 const char *path(const char *pathname);
 char *target_strerror(int err);
 
diff --git a/tests/test_path.c b/tests/test_path.c
index 7d6e831..e146736 100644
--- a/tests/test_path.c
+++ b/tests/test_path.c
@@ -69,7 +69,7 @@ static unsigned int do_test(void)
     if (close(creat("/tmp/qemu-test_path/DIR1/DIR2/FILE5", 0600)) != 0)
        return __LINE__;
 
-    init_paths("/tmp/qemu-test_path");
+    init_paths("/tmp/qemu-test_path", 0);
 
     NO_CHANGE("/tmp");
     NO_CHANGE("/tmp/");






reply via email to

[Prev in Thread] Current Thread [Next in Thread]