c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * CDDL HEADER START
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * The contents of this file are subject to the terms of the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Common Development and Distribution License (the "License").
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * You may not use this file except in compliance with the License.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * or http://www.opensolaris.org/os/licensing.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * See the License for the specific language governing permissions
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * and limitations under the License.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * When distributing Covered Code, include this CDDL HEADER in each
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * If applicable, add the following below this CDDL HEADER, with the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * fields enclosed by brackets "[]" replaced with your own identifying
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * information: Portions Copyright [yyyy] [name of copyright owner]
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * CDDL HEADER END
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Copyright 2012 Milan Jurik. All rights reserved.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Copyright 2016 Toomas Soome <tsoome@me.com>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Loader menu management.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <stdio.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <stdlib.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <string.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <wchar.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <errno.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <limits.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <alloca.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <unistd.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <sys/types.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <sys/stat.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <sys/queue.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <libbe.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <ficl.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include <ficlplatform/emu.h>
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#include "bootadm.h"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeextern int bam_rootlen;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeextern int bam_alt_root;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeextern char *rootbuf;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeextern char *bam_root;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define BOOT_DIR "/boot"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define CONF_DIR BOOT_DIR "/conf.d"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define MENU BOOT_DIR "/menu.lst"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define TRANSIENT BOOT_DIR "/transient.conf"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define XEN_CONFIG CONF_DIR "/xen"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestruct menu_entry {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *title;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *bootfs;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_ENTRY(menu_entry) next;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome};
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas SoomeSTAILQ_HEAD(menu_lst, menu_entry);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t set_option(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t list_entry(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t update_entry(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t update_temp(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t list_setting(struct menu_lst *menu, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t disable_hyper(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t enable_hyper(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/* Menu related sub commands */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic subcmd_defn_t menu_subcmds[] = {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "set_option", OPT_ABSENT, set_option, 0, /* PUB */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "list_entry", OPT_OPTIONAL, list_entry, 1, /* PUB */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "update_entry", OPT_REQ, update_entry, 0, /* menu */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "update_temp", OPT_OPTIONAL, update_temp, 0, /* reboot */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "list_setting", OPT_OPTIONAL, list_setting, 1, /* menu */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "disable_hypervisor", OPT_ABSENT, disable_hyper, 0, /* menu */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "enable_hypervisor", OPT_ABSENT, enable_hyper, 0, /* menu */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome NULL, 0, NULL, 0 /* must be last */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome};
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome#define NUM_COLS (4)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestruct col_info {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *col_name;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t width;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome};
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * all columns output format
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestruct hdr_info {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct col_info cols[NUM_COLS];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome};
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeprint_hdr(struct hdr_info *hdr_info)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome boolean_t first = B_TRUE;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t i;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (i = 0; i < NUM_COLS; i++) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct col_info *col_info = &hdr_info->cols[i];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *name = col_info->col_name;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t width = col_info->width;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (name == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome continue;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (first) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%-*s", width, name);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome first = B_FALSE;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf(" %-*s", width, name);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) putchar('\n');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeinit_hdr_cols(struct hdr_info *hdr)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct col_info *col = hdr->cols;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t i;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[0].col_name = _("Index");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[1].col_name = _("Default");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[2].col_name = _("Dataset");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[3].col_name = _("Menu");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[4].col_name = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (i = 0; i < NUM_COLS; i++) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *name = col[i].col_name;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[i].width = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (name != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome wchar_t wname[128];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t sz = mbstowcs(wname, name, sizeof (wname) /
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome sizeof (wchar_t));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (sz > 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int wcsw = wcswidth(wname, sz);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (wcsw > 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[i].width = wcsw;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[i].width = sz;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome col[i].width = strlen(name);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomecount_widths(struct hdr_info *hdr, struct menu_lst *menu)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t len[NUM_COLS];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int i;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (i = 0; i < NUM_COLS; i++)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome len[i] = hdr->cols[i].width + 1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(entry, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome size_t bootfs_len = strlen(entry->bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (bootfs_len > len[2])
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome len[2] = bootfs_len + 1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (i = 0; i < NUM_COLS; i++)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome hdr->cols[i].width = len[i];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeprint_menu_nodes(boolean_t parsable, struct hdr_info *hdr,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_lst *menu)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int i = -1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int rv;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node_list_t *be_nodes, *be_node;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome rv = be_list(NULL, &be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (rv != BE_SUCCESS)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(entry, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome i++;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (be_node = be_nodes; be_node;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node = be_node->be_next_node)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(be_node->be_root_ds, entry->bootfs) == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (parsable)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%d;%s;%s;%s\n", i,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node->be_active_on_boot == B_TRUE? "*" : "-",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome entry->bootfs, entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%-*d %-*s %-*s %-*s\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome hdr->cols[0].width, i,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome hdr->cols[1].width,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node->be_active_on_boot == B_TRUE? "*" : "-",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome hdr->cols[2].width, entry->bootfs,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome hdr->cols[3].width, entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_free_list(be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeprint_nodes(boolean_t parsable, struct menu_lst *menu)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct hdr_info hdr;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (!parsable) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome init_hdr_cols(&hdr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome count_widths(&hdr, menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome print_hdr(&hdr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome print_menu_nodes(parsable, &hdr, menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeerror_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomemenu_read(struct menu_lst *menu, char *menu_path)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome FILE *fp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *mp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char buf[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *title;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *bootfs;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *ptr;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int i = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(menu_path, "r");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * menu.lst entry is on two lines, one for title, one for bootfs
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * so we process both lines in succession.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome do {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fgets(buf, PATH_MAX, fp) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (!feof(fp))
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = strchr(buf, '\n');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *ptr = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = strchr(buf, ' ');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *ptr++ = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(buf, "title") != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if ((title = strdup(ptr)) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fgets(buf, PATH_MAX, fp) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = strchr(buf, '\n');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *ptr = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = strchr(buf, ' ');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *ptr++ = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(buf, "bootfs") != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if ((bootfs = strdup(ptr)) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if ((mp = malloc(sizeof (struct menu_entry))) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mp->entry = i++;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mp->title = title;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mp->bootfs = bootfs;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_INSERT_TAIL(menu, mp, next);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } while (feof(fp) == 0);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomevoid
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomemenu_free(struct menu_lst *menu)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(entry, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_REMOVE_HEAD(menu, next);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(entry->bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(entry);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeerror_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomebam_loader_menu(char *subcmd, char *opt, int largc, char *largv[])
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome error_t ret;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char menu_path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char clean_menu_root[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char menu_root[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct stat sb;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome error_t (*f)(struct menu_lst *, char *, char *);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *special;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *pool = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome zfs_mnted_t zmnted;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *zmntpt;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *osdev;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *osroot;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *fcn = "bam_loader_menu()";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_lst menu = {0};
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_INIT(&menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Check arguments
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = check_subcmd_and_options(subcmd, opt, menu_subcmds, &f);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret == BAM_ERROR) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(bam_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strlcpy(menu_root, bam_root, sizeof (menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome osdev = osroot = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(subcmd, "update_entry") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome osdev = strtok(opt, ",");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(osdev);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome osroot = strtok(NULL, ",");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (osroot) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /* fixup bam_root so that it points at osroot */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (realpath(osroot, rootbuf) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cannot resolve path %s: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome osroot, strerror(errno));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_alt_root = 1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_root = rootbuf;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_rootlen = strlen(rootbuf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (stat(menu_root, &sb) == -1) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cannot find menu\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (!is_zfs(menu_root)) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("only ZFS root is supported\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(strcmp(menu_root, bam_root) == 0);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome special = get_special(menu_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome INJECT_ERROR1("Z_MENU_GET_SPECIAL", special = NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (special == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cant find special file for mount-point %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome menu_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome pool = strtok(special, "/");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome INJECT_ERROR1("Z_MENU_GET_POOL", pool = NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (pool == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cant find pool for mount-point %s\n"), menu_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: derived pool=%s from special\n", fcn, pool));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome zmntpt = mount_top_dataset(pool, &zmnted);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome INJECT_ERROR1("Z_MENU_MOUNT_TOP_DATASET", zmntpt = NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (zmntpt == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cannot mount pool dataset for pool: %s\n"), pool);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: top dataset mountpoint=%s\n", fcn, zmntpt));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strlcpy(menu_root, zmntpt, sizeof (menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: zfs menu_root=%s\n", fcn, menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome elide_trailing_slash(menu_root, clean_menu_root,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome sizeof (clean_menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: cleaned menu root is <%s>\n", fcn, clean_menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strlcpy(menu_path, clean_menu_root, sizeof (menu_path));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strlcat(menu_path, MENU, sizeof (menu_path));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: menu path is: %s\n", fcn, menu_path));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * update_entry is special case, its used by installer
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * and needs to create menu.lst file for loader
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (menu_read(&menu, menu_path) == BAM_ERROR &&
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome strcmp(subcmd, "update_entry") != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("cannot find menu file: %s\n"), menu_path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (special != NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * If listing the menu, display the menu location
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(subcmd, "list_entry") == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_print(_("the location for the active menu is: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome menu_path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * We already checked the following case in
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * check_subcmd_and_suboptions() above. Complete the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * final step now.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(subcmd, "set_option") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(largc == 1 && largv[0] && largv[1] == NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome opt = largv[0];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if ((strcmp(subcmd, "enable_hypervisor") != 0) &&
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (strcmp(subcmd, "list_setting") != 0)) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(largc == 0 && largv == NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Once the sub-cmd handler has run
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * only the line field is guaranteed to have valid values
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(subcmd, "update_entry") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, menu_root, osdev);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(subcmd, "upgrade") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, bam_root, menu_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(subcmd, "list_entry") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, menu_path, opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(subcmd, "list_setting") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, ((largc > 0) ? largv[0] : ""),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ((largc > 1) ? largv[1] : ""));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(subcmd, "disable_hypervisor") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (is_sparc()) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("%s operation unsupported on SPARC "
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "machines\n"), subcmd);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, bam_root, NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(subcmd, "enable_hypervisor") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (is_sparc()) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("%s operation unsupported on SPARC "
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "machines\n"), subcmd);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *extra_args = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Compress all arguments passed in the largv[] array
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * into one string that can then be appended to the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * end of the kernel$ string the routine to enable the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * hypervisor will build.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * This allows the caller to supply arbitrary unparsed
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * arguments, such as dom0 memory settings or APIC
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * options.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * This concatenation will be done without ANY syntax
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * checking whatsoever, so it's the responsibility of
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * the caller to make sure the arguments are valid and
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * do not duplicate arguments the conversion routines
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * may create.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (largc > 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int extra_len, i;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (extra_len = 0, i = 0; i < largc; i++)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome extra_len += strlen(largv[i]);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Allocate space for argument strings,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * intervening spaces and terminating NULL.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome extra_args = alloca(extra_len + largc);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strcpy(extra_args, largv[0]);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (i = 1; i < largc; i++) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strcat(extra_args, " ");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) strcat(extra_args, largv[i]);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, bam_root, extra_args);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = f(&menu, NULL, opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret == BAM_WRITE) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome BAM_DPRINTF(("%s: writing menu to clean-menu-root: <%s>\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fcn, clean_menu_root));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /* ret = menu_write(clean_menu_root, menu); */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome INJECT_ERROR1("POOL_SET", pool = "/pooldata");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert((is_zfs(menu_root)) ^ (pool == NULL));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (pool) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) umount_top_dataset(pool, zmnted, zmntpt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome menu_free(&menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * To suppress output from ficl. We do not want to see messages
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * from interpreting loader config.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic void
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas SoomeficlTextOutSilent(ficlCallback *cb, char *text)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeset_option(struct menu_lst *menu, char *dummy, char *opt)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *val;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *rest;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int optval;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_t *be_attrs;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome FILE *fp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int rv, ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(dummy == NULL);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome val = strchr(opt, '=');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (val != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *val++ = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(opt, "default") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome errno = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome optval = strtol(val, &rest, 10);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0 || *rest != '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid boot entry number: %s\n"), val);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(entry, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (entry->entry == optval)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (entry == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid boot entry number: %s\n"), val);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("out of memory\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome entry->title) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("out of memory\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_free(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = be_activate(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_free(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcmp(opt, "timeout") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome errno = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome optval = strtol(val, &rest, 10);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0 || *rest != '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid timeout: %s\n"), val);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(path, PATH_MAX, "%s" CONF_DIR "/timeout",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("failed to open file: %s: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome path, strerror(errno));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * timeout=-1 is to disable auto boot in illumos, but
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * loader needs "NO" to disable auto boot.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (optval == -1)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome rv = fprintf(fp, "autoboot_delay=\"NO\"\n");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome rv = fprintf(fp, "autoboot_delay=\"%d\"\n", optval);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (rv < 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("write to file failed: %s: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome path, strerror(errno));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome rv = fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (rv < 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("failed to close file: %s: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome path, strerror(errno));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret == BAM_ERROR)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) unlink(path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid option: %s\n"), opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic int
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomebam_mount_be(struct menu_entry *entry, char **dir)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_t *be_attrs = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *tmpdir = getenv("TMPDIR");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome const char *tmpname = "bam.XXXXXX";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node_list_t *be_node, *be_nodes = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *dir = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (tmpdir == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome tmpdir = "/tmp";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = asprintf(dir, "%s/%s", tmpdir, tmpname);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret < 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BE_ERR_NOMEM);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *dir = mkdtemp(*dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BE_ERR_NOMEM;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto out;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = be_list(NULL, &be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != BE_SUCCESS) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto out;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (be_node = be_nodes; be_node;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node = be_node->be_next_node)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(be_node->be_root_ds, entry->bootfs) == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node->be_node_name) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BE_ERR_NOMEM;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto out;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_add_string(be_attrs, BE_ATTR_MOUNTPOINT, *dir) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BE_ERR_NOMEM;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto out;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = be_mount(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret == BE_ERR_MOUNTED) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * if BE is mounted, dir does not point to correct directory
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) rmdir(*dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(*dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *dir = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeout:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (be_nodes != NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_free_list(be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_free(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic int
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomebam_umount_be(char *dir)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_t *be_attrs;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (dir == NULL) /* nothing to do */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BE_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_alloc(&be_attrs, NV_UNIQUE_NAME, 0) != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BE_ERR_NOMEM);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (nvlist_add_string(be_attrs, BE_ATTR_ORIG_BE_NAME, dir) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BE_ERR_NOMEM;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto out;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = be_unmount(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeout:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome nvlist_free(be_attrs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * display details of menu entry or single property
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomelist_menu_entry(struct menu_entry *entry, char *setting)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *ptr, *dir;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char buf[MAX_INPUT];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ficlVm *vm;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int mounted;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mounted = bam_mount_be(entry, &dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (mounted != BE_SUCCESS && mounted != BE_ERR_MOUNTED) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (dir != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) rmdir(dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("%s is not mounted\n"), entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome vm = bf_init("", ficlTextOutSilent);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (vm == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error setting up forth interpreter\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /* should only get FICL_VM_STATUS_OUT_OF_TEXT */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "set currdev=zfs:%s:",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome entry->bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "include /boot/forth/loader.4th");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "start");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "boot");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0')
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("\nTitle: %s\n", entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else if (strcasecmp(setting, "title") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", entry->title);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = getenv("autoboot_delay");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *timeout = "-1";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcasecmp(ptr, "NO") != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome timeout = ptr;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0')
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Timeout: %s\n", timeout);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else if (strcasecmp(setting, "timeout") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", timeout);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = getenv("console");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0')
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Console: %s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else if (strcasecmp(setting, "console") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0')
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Bootfs: %s\n", entry->bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else if (strcasecmp(setting, "bootfs") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", entry->bootfs);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = getenv("xen_kernel");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Xen kernel: %s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcasecmp(setting, "xen_kernel") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Xen args: \"%s\"\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome getenv("xen_cmdline"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcasecmp(setting, "xen_cmdline") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", getenv("xen_cmdline"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Kernel: %s\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome getenv("bootfile"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } if (strcasecmp(setting, "kernel") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", getenv("bootfile"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = getenv("kernelname");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Kernel: %s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcasecmp(setting, "kernel") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ptr = getenv("boot-args");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ptr != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("Boot-args: \"%s\"\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strcasecmp(setting, "boot-args") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("%s\n", ptr);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting == '\0' || strcasecmp(setting, "modules") == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) printf("\nModules:\n");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ficlVmSetTextOut(vm, ficlCallbackDefaultTextOut);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "show-module-options");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto done;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /* if we got here with setting string, its unknown property */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*setting != '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("unknown property: %s\n"), setting);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomedone:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (mounted != BE_ERR_MOUNTED) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) bam_umount_be(dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (dir != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) rmdir(dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome free(dir);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomelist_entry(struct menu_lst *menu, char *menu_root, char *opt)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome error_t ret = BAM_SUCCESS;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *entry;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *ptr, *title = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int i, e = -1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (opt == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome print_nodes(B_FALSE, menu);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if ((ptr = strchr(opt, '=')) == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid option: %s\n"), opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome i = ptr - opt;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strncmp(opt, "entry", i) == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome e = atoi(ptr+1);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (strncmp(opt, "title", i) == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome title = ptr+1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid option: %s\n"), opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(entry, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (title != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(title, entry->title) == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else if (entry->entry == e)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (entry == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("no matching entry found\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (list_menu_entry(entry, ""));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * For now this is just stub entry to support grub interface, the
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * known consumer is installer ict.py code, calling as:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * bootadm update-menu -R /a -Z -o rdisk
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * Later this can be converted to do something useful.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeupdate_entry(struct menu_lst *menu, char *menu_root, char *osdev)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *pool = menu_root + 1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node_list_t *be_nodes, *be_node;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int rv;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome FILE *fp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(path, PATH_MAX, "%s%s", menu_root, MENU);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome rv = be_list(NULL, &be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (rv != BE_SUCCESS)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_free_list(be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (be_node = be_nodes; be_node; be_node = be_node->be_next_node) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(be_node->be_rpool, pool) == 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "title %s\n", be_node->be_node_name);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "bootfs %s\n", be_node->be_root_ds);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_free_list(be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeupdate_temp(struct menu_lst *menu, char *dummy, char *opt)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome error_t ret = BAM_ERROR;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char buf[MAX_INPUT];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct mnttab mpref = { 0 };
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct mnttab mp = { 0 };
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ficlVm *vm;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *env, *o;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome FILE *fp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(path, PATH_MAX, "%s" TRANSIENT, bam_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * if opt == NULL, remove transient config
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (opt == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) unlink(path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(MNTTAB, "r");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mpref.mnt_mountp = "/";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (getmntany(fp, &mp, &mpref) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome vm = bf_init("", ficlTextOutSilent);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (vm == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error setting up forth interpreter\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * need to check current boot config, so fire up the ficl
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * if its xen setup, we add option to boot-args list, not replacing it.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "set currdev=zfs:%s:", mp.mnt_special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "include /boot/forth/loader.4th");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "start");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "boot");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (opt[0] == '-') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome env = getenv("xen_kernel");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (env != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome env = getenv("boot-args");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "boot-args=\"%s %s\"\n", env, opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "boot-args=\"%s\"\n", opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * it should be the case with "kernel args"
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * so, we split the opt at first space
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * and store bootfile= and boot-args=
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome env = getenv("xen_kernel");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome o = strchr(opt, ' ');
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (o == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "bootfile=\"%s\"\n", opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome *o++ = '\0';
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "bootfile=\"%s\"\n", opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (env != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome env = getenv("boot-args");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "boot-args=\"%s %s\"\n", env, opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "boot-args=\"%s\"\n", o);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fflush(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (ret);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomelist_setting(struct menu_lst *menu, char *which, char *setting)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int entry = -1;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct menu_entry *m;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node_list_t *be_nodes, *be_node = NULL;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(which);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome assert(setting);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * which can be:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * "" - list default entry
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * number - use for entry number
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * property name
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (*which != '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (isdigit(*which)) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *rest;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome errno = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome entry = strtol(which, &rest, 10);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0 || *rest != '\0') {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("invalid boot entry number: %s\n"),
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome which);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome setting = which;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /* find default entry */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (entry == -1) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = be_list(NULL, &be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != BE_SUCCESS) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("No BE's found\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(m, menu, next) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome entry++;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome for (be_node = be_nodes; be_node;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_node = be_node->be_next_node)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(be_node->be_root_ds, m->bootfs) == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (be_node->be_active_on_boot == B_TRUE)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break; /* found active node */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome be_free_list(be_nodes);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (be_node == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("None of BE nodes is marked active\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome STAILQ_FOREACH(m, menu, next)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (m->entry == entry)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome break;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (m == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("no matching entry found\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (list_menu_entry(m, setting));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomedisable_hyper(struct menu_lst *menu, char *osroot, char *opt)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(path, PATH_MAX, "%s" XEN_CONFIG, bam_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) unlink(path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome/*ARGSUSED*/
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomestatic error_t
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeenable_hyper(struct menu_lst *menu, char *osroot, char *opt)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome{
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ficlVm *vm;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char path[PATH_MAX];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char buf[MAX_INPUT];
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome char *env;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome FILE *fp;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct mnttab mpref = { 0 };
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome struct mnttab mp = { 0 };
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome int ret;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(MNTTAB, "r");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome mpref.mnt_mountp = "/";
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (getmntany(fp, &mp, &mpref) != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome vm = bf_init("", ficlTextOutSilent);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (vm == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error setting up forth interpreter\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * need to check current boot config, so fire up the ficl
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * if its xen setup, we add option to boot-args list, not replacing it.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "set currdev=zfs:%s:", mp.mnt_special);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "include /boot/forth/loader.4th");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "start");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(buf, MAX_INPUT, "boot");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome ret = ficlVmEvaluate(vm, buf);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (ret != FICL_VM_STATUS_OUT_OF_TEXT) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bam_error(_("Error interpreting boot config\n"));
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome bf_fini();
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) mkdir(CONF_DIR, 0755);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) snprintf(path, PATH_MAX, "%s" XEN_CONFIG, bam_root);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome fp = fopen(path, "w");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (fp == NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR); /* error, cant write config */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome errno = 0;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * on write error, remove file to ensure we have bootable config.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * note we dont mind if config exists, it will get updated
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "xen_kernel=\"/boot/${ISADIR}/xen\"\n");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto error;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome /*
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * really simple and stupid console conversion.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome * it really has to be gone, it belongs to milestone/xvm properties.
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome */
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome env = getenv("console");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (env != NULL) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (strcmp(env, "ttya") == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "xen_cmdline=\"console=com1 %s\"\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else if (strcmp(env, "ttyb") == 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "xen_cmdline=\"console=com2 %s\"\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "xen_cmdline=\"console=vga %s\"\n",
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome } else
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp, "xen_cmdline=\"%s\"\n", opt);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto error;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "bootfile=\"/platform/i86xpv/kernel/${ISADIR}/unix\"\n");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto error;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fprintf(fp,
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome "boot-args=\"/platform/i86xpv/kernel/${ISADIR}/unix\"\n");
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0)
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome goto error;
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome if (errno != 0) {
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) unlink(path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome }
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_SUCCESS);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soomeerror:
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) fclose(fp);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome (void) unlink(path);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome return (BAM_ERROR);
c262cbbc8301f7c884fd4800056ee51ba75d931cToomas Soome}