Commit ffb04fcf089865952592f1f8855c2848d4514a89

Authored by ths
1 parent e27f01ef

Allow relative paths for the interpreter prefix in linux-user emulation.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2984 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 29 additions and 17 deletions
linux-user/path.c
@@ -92,23 +92,6 @@ static void set_parents(struct pathelem *child, struct pathelem *parent) @@ -92,23 +92,6 @@ static void set_parents(struct pathelem *child, struct pathelem *parent)
92 set_parents(child->entries[i], child); 92 set_parents(child->entries[i], child);
93 } 93 }
94 94
95 -void init_paths(const char *prefix)  
96 -{  
97 - if (prefix[0] != '/' ||  
98 - prefix[0] == '\0' ||  
99 - !strcmp(prefix, "/"))  
100 - return;  
101 -  
102 - base = new_entry("", NULL, prefix+1);  
103 - base = add_dir_maybe(base);  
104 - if (base->num_entries == 0) {  
105 - free (base);  
106 - base = NULL;  
107 - } else {  
108 - set_parents(base, base);  
109 - }  
110 -}  
111 -  
112 /* FIXME: Doesn't handle DIR/.. where DIR is not in emulated dir. */ 95 /* FIXME: Doesn't handle DIR/.. where DIR is not in emulated dir. */
113 static const char * 96 static const char *
114 follow_path(const struct pathelem *cursor, const char *name) 97 follow_path(const struct pathelem *cursor, const char *name)
@@ -135,6 +118,35 @@ follow_path(const struct pathelem *cursor, const char *name) @@ -135,6 +118,35 @@ follow_path(const struct pathelem *cursor, const char *name)
135 return NULL; 118 return NULL;
136 } 119 }
137 120
  121 +void init_paths(const char *prefix)
  122 +{
  123 + char pref_buf[PATH_MAX];
  124 +
  125 + if (prefix[0] == '\0' ||
  126 + !strcmp(prefix, "/"))
  127 + return;
  128 +
  129 + if (prefix[0] != '/') {
  130 + char *cwd = get_current_dir_name();
  131 + if (!cwd)
  132 + abort();
  133 + strcpy(pref_buf, cwd);
  134 + strcat(pref_buf, "/");
  135 + strcat(pref_buf, prefix);
  136 + free(cwd);
  137 + } else
  138 + strcpy(pref_buf,prefix + 1);
  139 +
  140 + base = new_entry("", NULL, pref_buf);
  141 + base = add_dir_maybe(base);
  142 + if (base->num_entries == 0) {
  143 + free (base);
  144 + base = NULL;
  145 + } else {
  146 + set_parents(base, base);
  147 + }
  148 +}
  149 +
138 /* Look for path in emulation dir, otherwise return name. */ 150 /* Look for path in emulation dir, otherwise return name. */
139 const char *path(const char *name) 151 const char *path(const char *name)
140 { 152 {