aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Fleming <matt.fleming@intel.com>2012-03-13 12:23:56 +0000
committerMatt Fleming <matt.fleming@intel.com>2012-03-23 16:56:16 +0000
commitcb05ff3e5a6aef2d1da2e4397b08e7eedde8c077 (patch)
treea6ccab00e2cc9e5838ca325164a873fcb52c633c
parent0105cae269ed2488a2a99f1548740ca99326cc4a (diff)
downloadsyslinux-cb05ff3e5a6aef2d1da2e4397b08e7eedde8c077.tar.gz
syslinux-cb05ff3e5a6aef2d1da2e4397b08e7eedde8c077.tar.xz
syslinux-cb05ff3e5a6aef2d1da2e4397b08e7eedde8c077.zip
core: Abstract search_config() into search_dirs()
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>
-rw-r--r--core/elflink/load_env32.c5
-rw-r--r--core/fs/iso9660/iso9660.c2
-rw-r--r--core/fs/lib/loadconfig.c2
-rw-r--r--core/fs/lib/searchconfig.c18
-rw-r--r--core/include/fs.h5
5 files changed, 17 insertions, 15 deletions
diff --git a/core/elflink/load_env32.c b/core/elflink/load_env32.c
index 2dd4a7bc..28bc70c1 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 792cd99f..fe58a5b3 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 100500c5..95e6f3f8 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 f688e7f2..f7cfeac7 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 fd8e4834..93eb8180 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 */