[syslinux:pathbased] syslinux: don't break -o just yet; print warning and resume

syslinux-bot for H. Peter Anvin hpa at linux.intel.com
Wed Jun 9 17:48:06 PDT 2010


Commit-ID:  064b36baf1da53a709d1598209b025fcd4494d27
Gitweb:     http://syslinux.zytor.com/commit/064b36baf1da53a709d1598209b025fcd4494d27
Author:     H. Peter Anvin <hpa at linux.intel.com>
AuthorDate: Wed, 9 Jun 2010 17:20:10 -0700
Committer:  H. Peter Anvin <hpa at linux.intel.com>
CommitDate: Wed, 9 Jun 2010 17:22:54 -0700

syslinux: don't break -o just yet; print warning and resume

-o has been supported for a very long time; recommend using -t
instead, but for now proceed with an error message.

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


---
 extlinux/main.c         |    4 ++--
 libinstaller/syslxopt.c |   43 +++++++++++++++++++++++++++++++------------
 libinstaller/syslxopt.h |   10 ++++++++--
 linux/syslinux.c        |    6 +++---
 4 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/extlinux/main.c b/extlinux/main.c
index e33e3ae..c76add4 100644
--- a/extlinux/main.c
+++ b/extlinux/main.c
@@ -883,7 +883,7 @@ int modify_existing_adv(const char *path)
 
 int main(int argc, char *argv[])
 {
-    parse_options(argc, argv, 0);
+    parse_options(argc, argv, MODE_EXTLINUX);
 
     if (!opt.directory)
 	usage(EX_USAGE, 0);
@@ -892,7 +892,7 @@ int main(int argc, char *argv[])
 	if (opt.reset_adv || opt.set_once || opt.menu_save)
 	    return modify_existing_adv(opt.directory);
 	else
-	    usage(EX_USAGE, 0);
+	    usage(EX_USAGE, MODE_EXTLINUX);
     }
 
     return install_loader(opt.directory, opt.update_only);
diff --git a/libinstaller/syslxopt.c b/libinstaller/syslxopt.c
index 728b19e..6b23a61 100644
--- a/libinstaller/syslxopt.c
+++ b/libinstaller/syslxopt.c
@@ -42,9 +42,10 @@ struct sys_options opt = {
 };
 
 const struct option long_options[] = {
+    {"force", 0, NULL, 'f'},	/* dummy option for compatibility */
     {"install", 0, NULL, 'i'},
     {"directory", 1, NULL, 'd'},
-    {"offset", 1, NULL, 'f'},
+    {"offset", 1, NULL, 't'},
     {"update", 0, NULL, 'U'},
     {"zipdrive", 0, NULL, 'z'},
     {"sectors", 1, NULL, 'S'},
@@ -53,27 +54,36 @@ const struct option long_options[] = {
     {"raid-mode", 0, NULL, 'r'},
     {"version", 0, NULL, 'v'},
     {"help", 0, NULL, 'h'},
-    {"once", 1, NULL, 'o'},
+    {"once", 1, NULL, OPT_ONCE},
     {"clear-once", 0, NULL, 'O'},
     {"reset-adv", 0, NULL, OPT_RESET_ADV},
     {"menu-save", 1, NULL, 'M'},
     {0, 0, 0, 0}
 };
 
-const char short_options[] = "id:f:UuzS:H:rvho:OM:";
+const char short_options[] = "tfid:UuzS:H:rvho:OM:";
 
-void __attribute__ ((noreturn)) usage(int rv, int mode)
+void __attribute__ ((noreturn)) usage(int rv, enum syslinux_mode mode)
 {
-    if (mode) /* for unmounted fs installation */
+    switch (mode) {
+    case MODE_SYSLINUX:
+	/* For unmounted fs installation (syslinux) */
 	fprintf(stderr,
 	    "Usage: %s [options] device\n"
-	    "  --offset     -f Offset of the file system on the device \n"
+	    "  --offset     -t Offset of the file system on the device \n"
 	    "  --directory  -d  Directory for installation target\n",
 	    program);
-    else /* actually extlinux can also use -d to provide directory too */
+	break;
+
+    case MODE_EXTLINUX:
+	/* Mounted fs installation (extlinux) */
+	/* Actually extlinux can also use -d to provide a directory too... */
 	fprintf(stderr,
 	    "Usage: %s [options] directory\n",
 	    program);
+	break;
+    }
+
     fprintf(stderr,
 	    "  --install    -i  Install over the current bootsector\n"
 	    "  --update     -U  Update a previous EXTLINUX installation\n"
@@ -82,7 +92,7 @@ void __attribute__ ((noreturn)) usage(int rv, int mode)
 	    "  --heads=#    -H  Force number of heads\n"
 	    "  --stupid     -s  Slow, safe and stupid mode\n"
 	    "  --raid       -r  Fall back to the next device on boot failure\n"
-	    "  --once=...   -o  Execute a command once upon boot\n"
+	    "  --once=...   %s  Execute a command once upon boot\n"
 	    "  --clear-once -O  Clear the boot-once command\n"
 	    "  --reset-adv      Reset auxilliary data\n"
 	    "  --menu-save= -M  Set the label to select as default on the next boot\n"
@@ -93,13 +103,13 @@ void __attribute__ ((noreturn)) usage(int rv, int mode)
 	    "  which includes zipdisks and LS-120 superfloppies.\n"
 	    "\n"
 	    "  The -z option is useful for USB devices which are considered\n"
-	    "  hard disks by some BIOSes and zipdrives by other BIOSes.\n"
-	    );
+	    "  hard disks by some BIOSes and zipdrives by other BIOSes.\n",
+	    mode == MODE_SYSLINUX ? "  " : "-o");
 
     exit(rv);
 }
 
-void parse_options(int argc, char *argv[], int mode)
+void parse_options(int argc, char *argv[], enum syslinux_mode mode)
 {
     int o;
 
@@ -107,6 +117,8 @@ void parse_options(int argc, char *argv[], int mode)
     while ((o = getopt_long(argc, argv, short_options,
 			    long_options, NULL)) != EOF) {
 	switch (o) {
+	case 'f':
+	    break;
 	case 'z':
 	    opt.heads = 64;
 	    opt.sectors = 32;
@@ -146,9 +158,16 @@ void parse_options(int argc, char *argv[], int mode)
 	    usage(0, mode);
 	    break;
 	case 'o':
+	    if (mode == MODE_SYSLINUX) {
+		fprintf(stderr,	"Warning: -o will change meaning in a future version, use -t or --offset\n");
+		goto opt_offset;
+	    }
+	    /* else fall through */
+	case OPT_ONCE:
 	    opt.set_once = optarg;
 	    break;
-	case 'f':
+	case 't':
+opt_offset:
 	    opt.offset = strtoul(optarg, NULL, 0);
 	case 'O':
 	    opt.set_once = "";
diff --git a/libinstaller/syslxopt.h b/libinstaller/syslxopt.h
index dfa6dc7..ba60ce2 100644
--- a/libinstaller/syslxopt.h
+++ b/libinstaller/syslxopt.h
@@ -19,10 +19,16 @@ struct sys_options {
 enum long_only_opt {
     OPT_NONE,
     OPT_RESET_ADV,
+    OPT_ONCE,
 };
 
-void __attribute__ ((noreturn)) usage(int rv, int mode);
-void parse_options(int argc, char *argv[], int mode);
+enum syslinux_mode {
+    MODE_SYSLINUX,		/* Unmounted filesystem */
+    MODE_EXTLINUX,
+};
+
+void __attribute__ ((noreturn)) usage(int rv, enum syslinux_mode mode);
+void parse_options(int argc, char *argv[], enum syslinux_mode mode);
 
 extern struct sys_options opt;
 extern const struct option long_options[];
diff --git a/linux/syslinux.c b/linux/syslinux.c
index 1194fbb..bd3c555 100644
--- a/linux/syslinux.c
+++ b/linux/syslinux.c
@@ -286,12 +286,12 @@ int main(int argc, char *argv[])
 
     mypid = getpid();
     umask(077);
-    parse_options(argc, argv, 1);
+    parse_options(argc, argv, MODE_SYSLINUX);
 
     subdir = opt.directory;
 
     if (!opt.device)
-	usage(EX_USAGE, 1);
+	usage(EX_USAGE, MODE_SYSLINUX);
 
     /*
      * First make sure we can open the device at all, and that we have
@@ -400,7 +400,7 @@ int main(int argc, char *argv[])
 	    rmdir(mntpath);
 	    exit(0);
 	} else
-	    usage(EX_USAGE, 0);
+	    usage(EX_USAGE, MODE_SYSLINUX);
     }
 
     /* Read a pre-existing ADV, if already installed */



More information about the Syslinux-commits mailing list