From cb05ff3e5a6aef2d1da2e4397b08e7eedde8c077 Mon Sep 17 00:00:00 2001 From: Matt Fleming Date: Tue, 13 Mar 2012 12:23:56 +0000 Subject: [PATCH] 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 --- 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 */ -- 2.7.4