[syslinux] [PATCH 19/19] core: Abstract search_config() into search_dirs()

Matt Fleming matt at console-pimps.org
Fri Mar 23 11:02:53 PDT 2012


From: Matt Fleming <matt.fleming at intel.com>

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 at intel.com>
---
 core/elflink/load_env32.c  |    5 +++--
 core/fs/iso9660/iso9660.c  |    2 +-
 core/fs/lib/loadconfig.c   |    2 +-
 core/fs/lib/searchconfig.c |   18 +++++++++---------
 core/include/fs.h          |    5 +++--
 5 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/core/elflink/load_env32.c b/core/elflink/load_env32.c
index 2dd4a7b..28bc70c 100644
--- a/core/elflink/load_env32.c
+++ b/core/elflink/load_env32.c
@@ -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);
 }
 
diff --git a/core/fs/iso9660/iso9660.c b/core/fs/iso9660/iso9660.c
index 792cd99..fe58a5b 100644
--- a/core/fs/iso9660/iso9660.c
+++ b/core/fs/iso9660/iso9660.c
@@ -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)
diff --git a/core/fs/lib/loadconfig.c b/core/fs/lib/loadconfig.c
index 100500c..95e6f3f 100644
--- a/core/fs/lib/loadconfig.c
+++ b/core/fs/lib/loadconfig.c
@@ -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);
 }
diff --git a/core/fs/lib/searchconfig.c b/core/fs/lib/searchconfig.c
index f688e7f..f7cfeac 100644
--- a/core/fs/lib/searchconfig.c
+++ b/core/fs/lib/searchconfig.c
@@ -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 */
 	    }
diff --git a/core/include/fs.h b/core/include/fs.h
index fd8e483..93eb818 100644
--- a/core/include/fs.h
+++ b/core/include/fs.h
@@ -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 */
-- 
1.7.4.4




More information about the Syslinux mailing list