Print this page
bug fix
adding functionality and fixing bugs
adding functions to menuadm
menuadm to replace bootadm menu interaction
hypervisor + bug fix
*** 21,30 ****
--- 21,34 ----
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
*/
+ /*
+ * Copyright 2012 Daniil Lunev. All rights reserved.
+ */
+
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
*** 37,47 ****
#define HYPER_KERNEL_DIR "/platform/i86xpv/kernel"
#define METAL_KERNEL_DIR "/platform/i86pc/kernel"
#define BOOTRC_FILE "/boot/solaris/bootenv.rc"
! #define ZFS_BOOTSTR "$ZFS-BOOTFS"
#define BFLAG "-B"
#define DEFAULT_SERIAL "9600,8,n,1"
#define TTYXMODE_TO_COMNUM(ttyxmode) ((int)(*((ttyxmode) + 3) - '`'))
--- 41,51 ----
#define HYPER_KERNEL_DIR "/platform/i86xpv/kernel"
#define METAL_KERNEL_DIR "/platform/i86pc/kernel"
#define BOOTRC_FILE "/boot/solaris/bootenv.rc"
! #define ZFS_BOOTSTR "$ZFS_BOOTFS"
#define BFLAG "-B"
#define DEFAULT_SERIAL "9600,8,n,1"
#define TTYXMODE_TO_COMNUM(ttyxmode) ((int)(*((ttyxmode) + 3) - '`'))
*** 761,772 ****
--- 765,778 ----
char *title = NULL;
char *findroot = NULL;
char *bootfs = NULL;
char *kernel = NULL;
+ char *opts = NULL;
char *mod_kernel = NULL;
char *module = NULL;
+ char *tmp = NULL;
char *kern_path = NULL;
char *kern_bargs = NULL;
int curdef, newdef;
*** 839,852 ****
* Process important lines from menu.lst boot entry.
*/
if (lp->flags == BAM_TITLE) {
title = strdupa(lp->arg);
} else if (lp->cmd != NULL) {
! if (strcmp(lp->cmd, "findroot") == 0) {
findroot = strdupa(lp->arg);
! } else if (strcmp(lp->cmd, "bootfs") == 0) {
bootfs = strdupa(lp->arg);
} else if (strcmp(lp->cmd,
menu_cmds[MODULE_DOLLAR_CMD]) == 0) {
module = strdupa(lp->arg);
} else if ((strcmp(lp->cmd,
menu_cmds[KERNEL_DOLLAR_CMD]) == 0) &&
--- 845,860 ----
* Process important lines from menu.lst boot entry.
*/
if (lp->flags == BAM_TITLE) {
title = strdupa(lp->arg);
} else if (lp->cmd != NULL) {
! if (strcmp(lp->cmd, "pool_label") == 0) {
findroot = strdupa(lp->arg);
! } else if (strcmp(lp->cmd, "data_set") == 0) {
bootfs = strdupa(lp->arg);
+ } else if (strcmp(lp->cmd, "kernel_options") == 0) {
+ opts = strdupa(lp->arg);
} else if (strcmp(lp->cmd,
menu_cmds[MODULE_DOLLAR_CMD]) == 0) {
module = strdupa(lp->arg);
} else if ((strcmp(lp->cmd,
menu_cmds[KERNEL_DOLLAR_CMD]) == 0) &&
*** 864,873 ****
--- 872,882 ----
if (lp == ent->end)
break;
}
+
/*
* If findroot, module or kern_path are NULL, the boot entry is
* malformed.
*/
if (findroot == NULL) {
*** 946,955 ****
--- 955,967 ----
*/
len = (strlen(kern_path) * 2) + WHITESPC(1) + 1;
zfslen = (zfs_boot ? (WHITESPC(1) + strlen(ZFS_BOOT)) : 0);
mod_kernel = alloca(len + zfslen);
+ if (opts)
+ (void) snprintf(mod_kernel, len + strlen(opts) + 1, "%s %s %s", kern_path, kern_path, opts);
+ else
(void) snprintf(mod_kernel, len, "%s %s", kern_path, kern_path);
if (kp_allocated)
free(kern_path);
*** 1060,1072 ****
* Process important lines from menu.lst boot entry.
*/
if (lp->flags == BAM_TITLE) {
title = strdupa(lp->arg);
} else if (lp->cmd != NULL) {
! if (strcmp(lp->cmd, "findroot") == 0) {
findroot = strdupa(lp->arg);
! } else if (strcmp(lp->cmd, "bootfs") == 0) {
bootfs = strdupa(lp->arg);
} else if (strcmp(lp->cmd,
menu_cmds[MODULE_DOLLAR_CMD]) == 0) {
if (strstr(lp->arg, "boot_archive") == NULL) {
module = strdupa(lp->arg);
--- 1072,1084 ----
* Process important lines from menu.lst boot entry.
*/
if (lp->flags == BAM_TITLE) {
title = strdupa(lp->arg);
} else if (lp->cmd != NULL) {
! if (strcmp(lp->cmd, "pool_label") == 0) {
findroot = strdupa(lp->arg);
! } else if (strcmp(lp->cmd, "data_set") == 0) {
bootfs = strdupa(lp->arg);
} else if (strcmp(lp->cmd,
menu_cmds[MODULE_DOLLAR_CMD]) == 0) {
if (strstr(lp->arg, "boot_archive") == NULL) {
module = strdupa(lp->arg);