[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