[syslinux:pathbased] loadconfig: fold FAT pathname search into generic_load_config

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Wed Jun 9 18:42:02 PDT 2010


Commit-ID:  598c4856c0080d44085dd58f39a76ad0816843cf
Gitweb:     http://syslinux.zytor.com/commit/598c4856c0080d44085dd58f39a76ad0816843cf
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Wed, 9 Jun 2010 11:07:19 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Wed, 9 Jun 2010 17:52:44 -0700

loadconfig: fold FAT pathname search into generic_load_config

Fold the FAT pathname searching into generic_load_config; make it a
simple set of loops.

Signed-off-by: H. Peter Anvin <hpa at linux.intel.com>


---
 core/fs/fat/fat.c        |   36 +-------------------------------
 core/fs/lib/loadconfig.c |   51 +++++++++++++++++++++++++++++++--------------
 2 files changed, 36 insertions(+), 51 deletions(-)

diff --git a/core/fs/fat/fat.c b/core/fs/fat/fat.c
index 54cd3b5..6850993 100644
--- a/core/fs/fat/fat.c
+++ b/core/fs/fat/fat.c
@@ -20,7 +20,6 @@ static struct inode * new_fat_inode(struct fs_info *fs)
     return inode;
 }
 
-
 /*
  * Check for a particular sector in the FAT cache
  */
@@ -697,39 +696,6 @@ got:
     return 0;
 }
 
-/* Load the config file, return 1 if failed, or 0 */
-static int vfat_load_config(void)
-{
-    const char *search_directories[] = {
-	"/boot/syslinux", 
-	"/syslinux",
-	"/",
-	NULL
-    };
-    com32sys_t regs;
-    int i;
-
-    /* If path filled by installer, then use that to load config*/
-    if (*CurrentDirName && !generic_load_config())
-	return 0;
-
-    for (i = 0; search_directories[i]; i++) {
-	    memset(&regs, 0, sizeof regs);
-	    snprintf(ConfigName, FILENAME_MAX, "%s/syslinux.cfg",
-		     search_directories[i]);
-	    regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
-	    call16(core_open, &regs, &regs);
-	    if (!(regs.eflags.l & EFLAGS_ZF))
-		break;
-    }
-    if (!search_directories[i])
-	return -1;
-
-    /* Set the current working directory */
-    chdir(search_directories[i]);
-    return 0;
-}
-
 /* init. the fs meta data, return the block size in bits */
 static int vfat_fs_init(struct fs_info *fs)
 {
@@ -803,7 +769,7 @@ const struct fs_ops vfat_fs_ops = {
     .getfssec      = generic_getfssec,
     .close_file    = generic_close_file,
     .mangle_name   = vfat_mangle_name,
-    .load_config   = vfat_load_config,
+    .load_config   = generic_load_config,
     .readdir       = vfat_readdir,
     .iget_root     = vfat_iget_root,
     .iget          = vfat_iget,
diff --git a/core/fs/lib/loadconfig.c b/core/fs/lib/loadconfig.c
index d84bdef..c4876dd 100644
--- a/core/fs/lib/loadconfig.c
+++ b/core/fs/lib/loadconfig.c
@@ -5,26 +5,45 @@
 #include <fs.h>
 
 /*
- * Standard version of load_config for extlinux/syslinux filesystems
+ * Standard version of load_config for extlinux/syslinux filesystems.
+ *
+ * This searches for extlinux.conf and syslinux.cfg in the install
+ * directory, followed by a set of fallback directories.  If found,
+ * set the current working directory to match.
  */
 int generic_load_config(void)
 {
+    static const char *search_directories[] = {
+	NULL,			/* CurrentDirName */
+	"/boot/syslinux", 
+	"/syslinux",
+	"/",
+	NULL
+    };
+    static const char *filenames[] = {
+	"extlinux.conf",
+	"syslinux.cfg",
+	NULL
+    };
     com32sys_t regs;
+    int i, j;
 
-    chdir(CurrentDirName);
-    /* try extlinux.conf first */
-    realpath(ConfigName, "extlinux.conf", FILENAME_MAX);
-    dprintf("Try config = %s\n", ConfigName);
-    memset(&regs, 0, sizeof regs);
-    regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
-    call16(core_open, &regs, &regs);
-    /* give syslinux.cfg a chance ? */
-    if (regs.eflags.l & EFLAGS_ZF) {
-	realpath(ConfigName, "syslinux.cfg", FILENAME_MAX);
-	dprintf("Then try config = %s\n", ConfigName);
-	memset(&regs, 0, sizeof regs);
-	regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
-	call16(core_open, &regs, &regs);
+    search_directories[0] = CurrentDirName;
+
+    for (i = *CurrentDirName ? 0 : 1; search_directories[i]; i++) {
+	for (j = 0; filenames[j]; j++) {
+	    memset(&regs, 0, sizeof regs);
+	    snprintf(ConfigName, FILENAME_MAX, "%s/%s",
+		     search_directories[i], filenames[j]);
+	    regs.edi.w[0] = OFFS_WRT(ConfigName, 0);
+	    dprintf("Config search: %s\n", ConfigName);
+	    call16(core_open, &regs, &regs);
+	    if (!(regs.eflags.l & EFLAGS_ZF)) {
+		chdir(search_directories[i]);
+		return 0;	/* Got it */
+	    }
+	}
     }
-    return (regs.eflags.l & EFLAGS_ZF) ? -1 : 0;
+
+    return -1;
 }



More information about the Syslinux-commits mailing list