[syslinux:master] extlinux: fix ADV handling, so extlinux.sys -> ldlinux.sys actually works

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Thu Jun 24 13:12:38 PDT 2010


Commit-ID:  06b5bd5a470cf4aad212aa81a26c8a5e03a48b2c
Gitweb:     http://syslinux.zytor.com/commit/06b5bd5a470cf4aad212aa81a26c8a5e03a48b2c
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Thu, 24 Jun 2010 13:08:46 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Thu, 24 Jun 2010 13:08:46 -0700

extlinux: fix ADV handling, so extlinux.sys -> ldlinux.sys actually works

Do the appropriate thing for various error cases, so that the
migration code actually does the right thing.

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


---
 extlinux/main.c |   25 ++++++++++++++++---------
 1 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/extlinux/main.c b/extlinux/main.c
index a771643..1ecb39c 100644
--- a/extlinux/main.c
+++ b/extlinux/main.c
@@ -711,13 +711,21 @@ static int btrfs_read_adv(int devfd)
     return syslinux_validate_adv(syslinux_adv) ? 1 : 0;
 }
 
-static int ext_read_adv(const char *path, const char *cfg, int devfd)
+static int ext_read_adv(const char *path, int devfd, const char **namep)
 {
+    int err;
+    const char *name;
+
     if (fs_type == BTRFS) {
 	/* btrfs "ldlinux.sys" is in 64k blank area */
 	return btrfs_read_adv(devfd);
-    } else {	
-	return read_adv(path, cfg);
+    } else {
+	err = read_adv(path, name = "ldlinux.sys");
+	if (err == 2)		/* ldlinux.sys does not exist */
+	    err = read_adv(path, name = "extlinux.sys");
+	if (namep)
+	    *namep = name; 
+	return err;
     }
 }
 
@@ -752,11 +760,11 @@ int install_loader(const char *path, int update_only)
     }
 
     /* Read a pre-existing ADV, if already installed */
-    if (opt.reset_adv ||
-	!already_installed(devfd) ||
-	(ext_read_adv(path, "ldlinux.sys", devfd) < 0 &&
-	 ext_read_adv(path, "extlinux.sys", devfd) < 0)) {
+    if (opt.reset_adv) {
 	syslinux_reset_adv(syslinux_adv);
+    } else if (ext_read_adv(path, devfd, NULL) < 0) {
+	close(devfd);
+	return 1;
     }
 
     if (modify_adv() < 0) {
@@ -798,8 +806,7 @@ int modify_existing_adv(const char *path)
 
     if (opt.reset_adv)
 	syslinux_reset_adv(syslinux_adv);
-    else if (ext_read_adv(path, filename = "ldlinux.sys", devfd) < 0 &&
-	     ext_read_adv(path, filename = "extlinux.sys", devfd) < 0) {
+    else if (ext_read_adv(path, devfd, &filename) < 0) {
 	close(devfd);
 	return 1;
     }



More information about the Syslinux-commits mailing list