176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* ----------------------------------------------------------------------- *
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Copyright 2010 Intel Corp. - All Rights Reserved
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   This program is free software; you can redistribute it and/or modify
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   it under the terms of the GNU General Public License as published by
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   Boston MA 02111-1307, USA; either version 2 of the License, or
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *   (at your option) any later version; incorporated herein by reference.
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ----------------------------------------------------------------------- */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * syslxopt.c
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * parse cmdline for extlinux and syslinux installer
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h>
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h>
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stddef.h>
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h>
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h>
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <getopt.h>
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <sysexits.h>
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "version.h"
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "syslxcom.h"
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "syslxfs.h"
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "syslxopt.h"
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* These are the options we can set their values */
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct sys_options opt = {
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .sectors = 0,
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .heads = 0,
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .raid_mode = 0,
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .stupid_mode = 0,
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .reset_adv = 0,
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .set_once = NULL,
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .update_only = -1,
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .directory = NULL,
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .device = NULL,
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .offset = 0,
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .menu_save = NULL,
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .install_mbr = 0,
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .activate_partition = 0,
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .force = 0,
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    .bootsecfile = NULL,
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst struct option long_options[] = {
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"force", 0, NULL, 'f'},	/* DOS/Win32/mtools only */
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"install", 0, NULL, 'i'},
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"directory", 1, NULL, 'd'},
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"offset", 1, NULL, 't'},
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"update", 0, NULL, 'U'},
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"zipdrive", 0, NULL, 'z'},
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"sectors", 1, NULL, 'S'},
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"stupid", 0, NULL, 's'},
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"heads", 1, NULL, 'H'},
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"raid-mode", 0, NULL, 'r'},
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"version", 0, NULL, 'v'},
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"help", 0, NULL, 'h'},
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"once", 1, NULL, OPT_ONCE},
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"clear-once", 0, NULL, 'O'},
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"reset-adv", 0, NULL, OPT_RESET_ADV},
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"menu-save", 1, NULL, 'M'},
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"mbr", 0, NULL, 'm'},	/* DOS/Win32 only */
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"active", 0, NULL, 'a'},	/* DOS/Win32 only */
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {"device", 1, NULL, OPT_DEVICE},
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    {NULL, 0, NULL, 0}
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanconst char short_options[] = "t:fid:UuzsS:H:rvho:OM:ma";
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid __attribute__ ((noreturn)) usage(int rv, enum syslinux_mode mode)
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    switch (mode) {
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_SYSLINUX:
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* For unmounted fs installation (syslinux) */
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fprintf(stderr,
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "Usage: %s [options] device\n"
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --offset     -t  Offset of the file system on the device \n"
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --directory  -d  Directory for installation target\n",
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    program);
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	break;
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_EXTLINUX:
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* Mounted fs installation (extlinux) */
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* Actually extlinux can also use -d to provide a directory too... */
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fprintf(stderr,
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "Usage: %s [options] directory\n"
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --device         Force use of a specific block device (experts only)\n",
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    program);
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	break;
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_SYSLINUX_DOSWIN:
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* For fs installation under Windows (syslinux.exe) */
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fprintf(stderr,
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "Usage: %s [options] <drive>: [bootsecfile]\n"
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --directory  -d  Directory for installation target\n",
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    program);
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	break;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    fprintf(stderr,
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --install    -i  Install over the current bootsector\n"
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --update     -U  Update a previous installation\n"
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --zip        -z  Force zipdrive geometry (-H 64 -S 32)\n"
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --sectors=#  -S  Force the number of sectors per track\n"
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --heads=#    -H  Force number of heads\n"
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --stupid     -s  Slow, safe and stupid mode\n"
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --raid       -r  Fall back to the next device on boot failure\n"
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --once=...   %s  Execute a command once upon boot\n"
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --clear-once -O  Clear the boot-once command\n"
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --reset-adv      Reset auxilliary data\n",
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    mode == MODE_SYSLINUX  ? "  " : "-o");
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    /*
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     * Have to chop this roughly in half for the DOS installer due
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     * to limited output buffer size
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman     */
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    fprintf(stderr,
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    "  --menu-save= -M  Set the label to select as default on the next boot\n");
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (mode == MODE_SYSLINUX_DOSWIN)
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fprintf(stderr,
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		"  --mbr        -m  Install an MBR\n"
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		"  --active     -a  Mark partition as active\n");
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (mode == MODE_SYSLINUX_DOSWIN || mode == MODE_SYSLINUX)
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	fprintf(stderr,
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		"  --force      -f  Ignore precautions\n");
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    exit(rv);
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid parse_options(int argc, char *argv[], enum syslinux_mode mode)
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    int o;
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    program = argv[0];
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    while ((o = getopt_long(argc, argv, short_options,
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			    long_options, NULL)) != EOF) {
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	switch (o) {
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'f':
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.force = 1;
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'z':
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.heads = 64;
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.sectors = 32;
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'S':
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.sectors = strtoul(optarg, NULL, 0);
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (opt.sectors < 1 || opt.sectors > 63) {
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		fprintf(stderr,
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			"%s: invalid number of sectors: %u (must be 1-63)\n",
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			program, opt.sectors);
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		exit(EX_USAGE);
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    }
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'H':
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.heads = strtoul(optarg, NULL, 0);
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (opt.heads < 1 || opt.heads > 256) {
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		fprintf(stderr,
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			"%s: invalid number of heads: %u (must be 1-256)\n",
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			program, opt.heads);
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		exit(EX_USAGE);
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    }
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'r':
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.raid_mode = 1;
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 's':
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.stupid_mode = 1;
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'i':
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.update_only = 0;
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'u':
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'U':
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.update_only = 1;
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'h':
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    usage(0, mode);
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'o':
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (mode == MODE_SYSLINUX) {
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		fprintf(stderr,	"%s: -o will change meaning in a future version, use -t or --offset\n", program);
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		goto opt_offset;
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    }
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    /* else fall through */
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case OPT_ONCE:
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.set_once = optarg;
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 't':
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	opt_offset:
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.offset = strtoul(optarg, NULL, 0);
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'O':
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.set_once = "";
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'd':
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.directory = optarg;
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case OPT_RESET_ADV:
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.reset_adv = 1;
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'M':
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.menu_save = optarg;
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'm':
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.install_mbr = 1;
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'a':
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.activate_partition = 1;
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case OPT_DEVICE:
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    if (mode != MODE_EXTLINUX)
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		usage(EX_USAGE, mode);
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.device = optarg;
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    break;
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	case 'v':
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fprintf(stderr,
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    "%s " VERSION_STR "  Copyright 1994-" YEAR_STR
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    " H. Peter Anvin et al\n", program);
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    exit(0);
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	default:
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fprintf(stderr, "%s: Unknown option: -%c\n", program, optopt);
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    usage(EX_USAGE, mode);
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    switch (mode) {
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_SYSLINUX:
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_SYSLINUX_DOSWIN:
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	opt.device = argv[optind++];
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	break;
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    case MODE_EXTLINUX:
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (!opt.directory)
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    opt.directory = argv[optind++];
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	break;
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (argv[optind] && (mode == MODE_SYSLINUX_DOSWIN))
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	/* Allow for the boot-sector argument */
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	opt.bootsecfile = argv[optind++];
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (argv[optind])
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	usage(EX_USAGE, mode);	/* Excess arguments */
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Make any user-specified ADV modifications in memory
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint modify_adv(void)
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    int rv = 0;
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (opt.reset_adv)
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	syslinux_reset_adv(syslinux_adv);
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (opt.set_once) {
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	if (syslinux_setadv(ADV_BOOTONCE, strlen(opt.set_once), opt.set_once)) {
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fprintf(stderr, "%s: not enough space for boot-once command\n",
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    program);
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    rv = -1;
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	}
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (opt.menu_save) {
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (syslinux_setadv(ADV_MENUSAVE, strlen(opt.menu_save), opt.menu_save)) {
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    fprintf(stderr, "%s: not enough space for menu-save label\n",
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    program);
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	    rv = -1;
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return rv;
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
276