core: Abstract search_config() into search_dirs()
authorMatt Fleming <matt.fleming@intel.com>
Tue, 13 Mar 2012 12:23:56 +0000 (12:23 +0000)
committerMatt Fleming <matt.fleming@intel.com>
Fri, 23 Mar 2012 16:56:16 +0000 (16:56 +0000)
The core currently abuses search_config() in order to locate
ldlinux.c32. The problem with this is that search_config() updates
ConfigName with the realpath of the file on every invocation. If we've
previously set ConfigName search_config() will overwrite this value.

Signed-off-by: Matt Fleming <matt.fleming@intel.com>
core/elflink/load_env32.c
core/fs/iso9660/iso9660.c
core/fs/lib/loadconfig.c
core/fs/lib/searchconfig.c
core/include/fs.h

index 2dd4a7b..28bc70c 100644 (file)
@@ -121,6 +121,7 @@ void load_env32(com32sys_t * regs)
        struct file_info *fp;
        int fd;
        char *argv[] = { LDLINUX, NULL };
+       char *realname;
 
        static const char *search_directories[] = {
                "/boot/isolinux",
@@ -155,7 +156,7 @@ void load_env32(com32sys_t * regs)
        /*
         * If we failed to load LDLINUX it could be because our
         * current working directory isn't the install directory. Try
-        * a bit harder to find LDLINUX. If search_config() succeeds
+        * a bit harder to find LDLINUX. If search_dirs() succeeds
         * in finding LDLINUX it will set the cwd.
         */
        fd = opendev(&__file_dev, NULL, O_RDONLY);
@@ -164,7 +165,7 @@ void load_env32(com32sys_t * regs)
 
        fp = &__file_info[fd];
 
-       if (!search_config(&fp->i.fd, search_directories, filenames))
+       if (!search_dirs(&fp->i.fd, search_directories, filenames, realname))
                start_ldlinux(argv);
 }
 
index 792cd99..fe58a5b 100644 (file)
@@ -243,7 +243,7 @@ static int iso_open_config(struct com32_filedata *filedata)
        NULL
     };
 
-    return search_config(filedata, search_directories, filenames);
+    return search_dirs(filedata, search_directories, filenames, ConfigName);
 }
 
 static int iso_fs_init(struct fs_info *fs)
index 100500c..95e6f3f 100644 (file)
@@ -30,5 +30,5 @@ int generic_open_config(struct com32_filedata *filedata)
 
     dprintf("CurrentDirName: \"%s\"\n", CurrentDirName);
 
-    return search_config(filedata, search_directories, filenames);
+    return search_dirs(filedata, search_directories, filenames, ConfigName);
 }
index f688e7f..f7cfeac 100644 (file)
@@ -8,28 +8,28 @@ char ConfigName[FILENAME_MAX];
 char config_cwd[FILENAME_MAX];
 
 /*
- * Common implementation of load_config
- *
  * This searches for a specified set of filenames in a specified set
  * of directories.  If found, set the current working directory to
  * match.
  */
-int search_config(struct com32_filedata *filedata,
-                 const char *search_directories[], const char *filenames[])
+int search_dirs(struct com32_filedata *filedata,
+               const char *search_directories[],
+               const char *filenames[],
+               char *realname)
 {
-    char confignamebuf[FILENAME_MAX];
+    char namebuf[FILENAME_MAX];
     const char *sd, **sdp;
     const char *sf, **sfp;
 
     for (sdp = search_directories; (sd = *sdp); sdp++) {
        for (sfp = filenames; (sf = *sfp); sfp++) {
-           snprintf(confignamebuf, sizeof confignamebuf,
+           snprintf(namebuf, sizeof namebuf,
                     "%s%s%s",
                     sd, (*sd && sd[strlen(sd)-1] == '/') ? "" : "/",
                     sf);
-           realpath(ConfigName, confignamebuf, FILENAME_MAX);
-           dprintf("Config search: %s\n", ConfigName);
-           if (open_file(ConfigName, filedata) >= 0) {
+           realpath(realname, namebuf, FILENAME_MAX);
+           dprintf("Directory search: %s\n", realname);
+           if (open_file(realname, filedata) >= 0) {
                chdir(sd);
                return 0;       /* Got it */
            }
index fd8e483..93eb818 100644 (file)
@@ -218,8 +218,9 @@ int generic_chdir_start(void);
 void generic_mangle_name(char *, const char *);
 
 /* loadconfig.c */
-int search_config(struct com32_filedata *filedata,
-                 const char *search_directores[], const char *filenames[]);
+int search_dirs(struct com32_filedata *filedata,
+               const char *search_directores[], const char *filenames[],
+               char *realname);
 int generic_open_config(struct com32_filedata *filedata);
 
 /* close.c */