1ae115bc7Smrj /* 2ae115bc7Smrj * CDDL HEADER START 3ae115bc7Smrj * 4ae115bc7Smrj * The contents of this file are subject to the terms of the 5ae115bc7Smrj * Common Development and Distribution License (the "License"). 6ae115bc7Smrj * You may not use this file except in compliance with the License. 7ae115bc7Smrj * 8ae115bc7Smrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9ae115bc7Smrj * or http://www.opensolaris.org/os/licensing. 10ae115bc7Smrj * See the License for the specific language governing permissions 11ae115bc7Smrj * and limitations under the License. 12ae115bc7Smrj * 13ae115bc7Smrj * When distributing Covered Code, include this CDDL HEADER in each 14ae115bc7Smrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15ae115bc7Smrj * If applicable, add the following below this CDDL HEADER, with the 16ae115bc7Smrj * fields enclosed by brackets "[]" replaced with your own identifying 17ae115bc7Smrj * information: Portions Copyright [yyyy] [name of copyright owner] 18ae115bc7Smrj * 19ae115bc7Smrj * CDDL HEADER END 20ae115bc7Smrj */ 21ae115bc7Smrj /* 2237eb779cSVikram Hegde * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23ae115bc7Smrj * Use is subject to license terms. 24eeb2c267SToomas Soome * 25eeb2c267SToomas Soome * Copyright 2016 Toomas Soome <tsoome@me.com>. 26ae115bc7Smrj */ 27ae115bc7Smrj 28ae115bc7Smrj #ifndef _BOOTADM_H 29ae115bc7Smrj #define _BOOTADM_H 30ae115bc7Smrj 31ae115bc7Smrj #ifdef __cplusplus 32ae115bc7Smrj extern "C" { 33ae115bc7Smrj #endif 34ae115bc7Smrj 35eb2bd662Svikram #include <assert.h> 36*f64ca102SToomas Soome #include <libintl.h> 37eb2bd662Svikram 38ae115bc7Smrj #ifndef TEXT_DOMAIN 39ae115bc7Smrj #define TEXT_DOMAIN "SUNW_OST_OSCMD" 40ae115bc7Smrj #endif /* TEXT_DOMAIN */ 41ae115bc7Smrj 42*f64ca102SToomas Soome #ifndef lint 43*f64ca102SToomas Soome #define _(x) gettext(x) 44*f64ca102SToomas Soome #else 45*f64ca102SToomas Soome #define _(x) (x) 46*f64ca102SToomas Soome #endif 47*f64ca102SToomas Soome 48ae115bc7Smrj /* Type definitions */ 49ae115bc7Smrj 50ae115bc7Smrj /* GRUB menu per-line classification */ 51ae115bc7Smrj typedef enum { 52ae115bc7Smrj BAM_INVALID = 0, 53ae115bc7Smrj BAM_EMPTY, 54ae115bc7Smrj BAM_COMMENT, 55ae115bc7Smrj BAM_GLOBAL, 56ae115bc7Smrj BAM_ENTRY, 57ae115bc7Smrj BAM_TITLE 58ae115bc7Smrj } menu_flag_t; 59ae115bc7Smrj 60ae115bc7Smrj /* struct for menu.lst contents */ 61ae115bc7Smrj typedef struct line { 62ae115bc7Smrj int lineNum; /* Line number in menu.lst */ 63ae115bc7Smrj int entryNum; /* menu boot entry #. ENTRY_INIT if not applicable */ 64ae115bc7Smrj char *cmd; 65ae115bc7Smrj char *sep; 66ae115bc7Smrj char *arg; 67ae115bc7Smrj char *line; 68ae115bc7Smrj menu_flag_t flags; 69ae115bc7Smrj struct line *next; 70ae115bc7Smrj struct line *prev; 71ae115bc7Smrj } line_t; 72ae115bc7Smrj 73ae115bc7Smrj typedef struct entry { 74ae115bc7Smrj struct entry *next; 75ae115bc7Smrj struct entry *prev; 76ae115bc7Smrj line_t *start; 77ae115bc7Smrj line_t *end; 78ae115bc7Smrj int entryNum; 79eb2bd662Svikram uint_t flags; 80ae115bc7Smrj } entry_t; 81ae115bc7Smrj 82ae115bc7Smrj /* For flags value in entry_t */ 83ae115bc7Smrj #define BAM_ENTRY_BOOTADM 0x01 /* entry created by bootadm */ 84ae115bc7Smrj #define BAM_ENTRY_LU 0x02 /* entry created by Live Upgrade */ 85ae115bc7Smrj #define BAM_ENTRY_CHAINLOADER 0x04 /* chainloader entry; do not disturb */ 86ae115bc7Smrj #define BAM_ENTRY_ROOT 0x08 /* entry has a root line */ 87eb2bd662Svikram #define BAM_ENTRY_FAILSAFE 0x10 /* failsafe entry */ 88eb2bd662Svikram #define BAM_ENTRY_DBOOT 0x20 /* Is dboot (normal or failsafe) */ 89ae115bc7Smrj #define BAM_ENTRY_32BIT 0x40 /* Is a 32-bit entry */ 90843e1988Sjohnlev #define BAM_ENTRY_HV 0x80 /* Is a hypervisor entry */ 91eb2bd662Svikram #define BAM_ENTRY_FINDROOT 0x100 /* entry has a findroot line */ 92eb2bd662Svikram #define BAM_ENTRY_MULTIBOOT 0x200 /* is multiboot (normal or failsafe) */ 93eb2bd662Svikram #define BAM_ENTRY_64BIT 0x400 /* Is a 64-bit entry */ 94ae115bc7Smrj 95bbcc54bdSEnrico Perla - Sun Microsystems #define BAM_ENTRY_UPGFSKERNEL 0x800 /* Upgrade failsafe kernel entry */ 96bbcc54bdSEnrico Perla - Sun Microsystems #define BAM_ENTRY_UPGFSMODULE 0x1000 /* Upgrade failsafe module entry */ 97bbcc54bdSEnrico Perla - Sun Microsystems 98772d6a58SWilliam Kucharski #define BAM_ENTRY_LIBBE 0x2000 /* entry created by libbe */ 99772d6a58SWilliam Kucharski 100ae115bc7Smrj typedef struct { 101ae115bc7Smrj line_t *start; 102ae115bc7Smrj line_t *end; 103ae115bc7Smrj line_t *curdefault; /* line containing default */ 104ae115bc7Smrj line_t *olddefault; /* old default line (commented) */ 105ae115bc7Smrj line_t *old_rc_default; /* old default line for bootenv.rc */ 106ae115bc7Smrj entry_t *entries; /* os entries */ 107ae115bc7Smrj } menu_t; 108ae115bc7Smrj 109ae115bc7Smrj typedef enum { 110ae115bc7Smrj BAM_ERROR = -1, /* Must be negative. add_boot_entry() depends on it */ 111ae115bc7Smrj BAM_SUCCESS = 0, 112ae115bc7Smrj BAM_WRITE = 2, 11344da779fSWilliam Kucharski BAM_MSG, /* Used by upgrade_menu() */ 11444da779fSWilliam Kucharski BAM_NOCHANGE /* Used by cvt_to_hyper()/cvt_to_metal() */ 115ae115bc7Smrj } error_t; 116ae115bc7Smrj 117ae115bc7Smrj /* 118ae115bc7Smrj * Menu related 119ae115bc7Smrj * menu_cmd_t and menu_cmds must be kept in sync 120843e1988Sjohnlev * 121843e1988Sjohnlev * The *_DOLLAR_CMD values must be 1 greater than the 122843e1988Sjohnlev * respective [KERNEL|MODULE]_CMD values. 123ae115bc7Smrj */ 124ae115bc7Smrj typedef enum { 125ae115bc7Smrj DEFAULT_CMD = 0, 126ae115bc7Smrj TIMEOUT_CMD, 127ae115bc7Smrj TITLE_CMD, 128ae115bc7Smrj ROOT_CMD, 129ae115bc7Smrj KERNEL_CMD, 130843e1988Sjohnlev KERNEL_DOLLAR_CMD, /* Must be KERNEL_CMD + 1 */ 131ae115bc7Smrj MODULE_CMD, 132843e1988Sjohnlev MODULE_DOLLAR_CMD, /* Must be MODULE_CMD + 1 */ 133ae115bc7Smrj SEP_CMD, 134ae115bc7Smrj COMMENT_CMD, 135ae115bc7Smrj CHAINLOADER_CMD, 136eb2bd662Svikram ARGS_CMD, 13744da779fSWilliam Kucharski FINDROOT_CMD, 13844da779fSWilliam Kucharski BOOTFS_CMD 139ae115bc7Smrj } menu_cmd_t; 140ae115bc7Smrj 141ae115bc7Smrj extern char *menu_cmds[]; 142ae115bc7Smrj 143ae115bc7Smrj /* For multi- or direct-boot */ 144ae115bc7Smrj typedef enum { 145ae115bc7Smrj BAM_DIRECT_NOT_SET, 146ae115bc7Smrj BAM_DIRECT_MULTIBOOT, 147ae115bc7Smrj BAM_DIRECT_DBOOT 148ae115bc7Smrj } direct_or_multi_t; 149ae115bc7Smrj 150843e1988Sjohnlev /* Is there a hypervisor present? */ 151843e1988Sjohnlev typedef enum { 152843e1988Sjohnlev BAM_HV_UNKNOWN, 153843e1988Sjohnlev BAM_HV_NO, 154843e1988Sjohnlev BAM_HV_PRESENT 155843e1988Sjohnlev } hv_t; 156843e1988Sjohnlev 157eb2bd662Svikram /* Is there findroot capability present ? */ 158eb2bd662Svikram typedef enum { 159eb2bd662Svikram BAM_FINDROOT_UNKNOWN, 160eb2bd662Svikram BAM_FINDROOT_ABSENT, 161eb2bd662Svikram BAM_FINDROOT_PRESENT 162eb2bd662Svikram } findroot_t; 163eb2bd662Svikram 164*f64ca102SToomas Soome typedef enum { 165*f64ca102SToomas Soome OPT_ABSENT = 0, /* No option */ 166*f64ca102SToomas Soome OPT_REQ, /* option required */ 167*f64ca102SToomas Soome OPT_OPTIONAL /* option may or may not be present */ 168*f64ca102SToomas Soome } option_t; 169*f64ca102SToomas Soome 170*f64ca102SToomas Soome typedef struct { 171*f64ca102SToomas Soome char *subcmd; 172*f64ca102SToomas Soome option_t option; 173*f64ca102SToomas Soome error_t (*handler)(); 174*f64ca102SToomas Soome int unpriv; /* is this an unprivileged command */ 175*f64ca102SToomas Soome } subcmd_defn_t; 176*f64ca102SToomas Soome 177*f64ca102SToomas Soome typedef enum zfs_mnted { 178*f64ca102SToomas Soome ZFS_MNT_ERROR = -1, 179*f64ca102SToomas Soome LEGACY_MOUNTED = 1, 180*f64ca102SToomas Soome LEGACY_ALREADY, 181*f64ca102SToomas Soome ZFS_MOUNTED, 182*f64ca102SToomas Soome ZFS_ALREADY 183*f64ca102SToomas Soome } zfs_mnted_t; 184*f64ca102SToomas Soome 185ae115bc7Smrj extern int bam_verbose; 186ae115bc7Smrj extern int bam_force; 187ae115bc7Smrj extern direct_or_multi_t bam_direct; 188843e1988Sjohnlev extern hv_t bam_is_hv; 189eb2bd662Svikram extern findroot_t bam_is_findroot; 190eb2bd662Svikram extern int bam_debug; 191ae115bc7Smrj 192eb2bd662Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp); 193eb2bd662Svikram extern void update_numbering(menu_t *mp); 19444da779fSWilliam Kucharski extern error_t set_global(menu_t *, char *, int); 195ae115bc7Smrj extern error_t upgrade_menu(menu_t *, char *, char *); 19644da779fSWilliam Kucharski extern error_t cvt_to_hyper(menu_t *, char *, char *); 19744da779fSWilliam Kucharski extern error_t cvt_to_metal(menu_t *, char *, char *); 198*f64ca102SToomas Soome extern error_t check_subcmd_and_options(char *, char *, subcmd_defn_t *, 199*f64ca102SToomas Soome error_t (**fp)()); 200*f64ca102SToomas Soome extern char *mount_top_dataset(char *pool, zfs_mnted_t *mnted); 201*f64ca102SToomas Soome extern void elide_trailing_slash(const char *, char *, size_t); 202*f64ca102SToomas Soome extern int umount_top_dataset(char *, zfs_mnted_t, char *); 203ae115bc7Smrj extern void *s_calloc(size_t, size_t); 204ae115bc7Smrj extern void *s_realloc(void *, size_t); 205ae115bc7Smrj extern char *s_fgets(char *buf, int n, FILE *fp); 206ae115bc7Smrj extern void bam_error(char *format, ...); 20766b6aef6SWilliam Kucharski extern void bam_exit(int); 208eb2bd662Svikram extern void bam_print(char *, ...); 209ae115bc7Smrj extern void bam_print_stderr(char *format, ...); 210eb2bd662Svikram extern void bam_derror(char *format, ...); 211*f64ca102SToomas Soome extern error_t bam_loader_menu(char *, char *, int, char *[]); 212eb2bd662Svikram extern error_t get_boot_cap(const char *osroot); 213ae115bc7Smrj extern char *get_special(char *); 214ae115bc7Smrj extern char *os_to_grubdisk(char *, int); 215ae115bc7Smrj extern void update_line(line_t *); 21644da779fSWilliam Kucharski extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *, 21744da779fSWilliam Kucharski char *); 21844da779fSWilliam Kucharski extern error_t delete_boot_entry(menu_t *, int, int); 219986fd29aSsetje extern int is_grub(const char *); 220eb2bd662Svikram extern char *get_grubsign(char *osroot, char *osdev); 221eb2bd662Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root); 222eb2bd662Svikram extern int root_optional(char *osroot, char *menu_root); 223eb2bd662Svikram extern void unlink_line(menu_t *mp, line_t *lp); 224eb2bd662Svikram extern void line_free(line_t *lp); 225eb2bd662Svikram extern char *s_strdup(char *); 226eb2bd662Svikram extern int is_sparc(void); 227*f64ca102SToomas Soome extern int is_pcfs(char *); 228*f64ca102SToomas Soome extern int is_zfs(char *); 229eeb2c267SToomas Soome extern int bootadm_digest(const char *, char **); 230ae115bc7Smrj 231ae115bc7Smrj #define BAM_MAXLINE 8192 232ae115bc7Smrj 233ae115bc7Smrj /* menu.lst comments created by bootadm */ 234ae115bc7Smrj #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------" 235ae115bc7Smrj #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------" 236ae115bc7Smrj 237ae115bc7Smrj /* 238ae115bc7Smrj * menu.lst comments create by Live Upgrade. Note that these are the end of 239ae115bc7Smrj * the comment strings - there will be other text before them. 240ae115bc7Smrj */ 241ae115bc7Smrj #define BAM_LU_HDR " - ADDED BY LIVE UPGRADE - DO NOT EDIT -----" 242ae115bc7Smrj #define BAM_LU_FTR " -------------- END LIVE UPGRADE ------------" 243ae115bc7Smrj 244ae115bc7Smrj #define BAM_OLDDEF "BOOTADM SAVED DEFAULT: " 245ae115bc7Smrj #define BAM_OLD_RC_DEF "BOOTADM RC SAVED DEFAULT: " 246ae115bc7Smrj 247772d6a58SWilliam Kucharski /* 248772d6a58SWilliam Kucharski * menu.lst comment created by libbe 249772d6a58SWilliam Kucharski */ 250772d6a58SWilliam Kucharski #define BAM_LIBBE_FTR "============ End of LIBBE entry =============" 251772d6a58SWilliam Kucharski 252ae115bc7Smrj /* Title used for failsafe entries */ 253ae115bc7Smrj #define FAILSAFE_TITLE "Solaris failsafe" 254ae115bc7Smrj 255843e1988Sjohnlev /* Title used for hv entries */ 256843e1988Sjohnlev #define NEW_HV_ENTRY "Solaris xVM" 257843e1988Sjohnlev 258e7cbe64fSgw25295 /* ZFS boot option */ 259e7cbe64fSgw25295 #define ZFS_BOOT "-B $ZFS-BOOTFS" 260e7cbe64fSgw25295 261ae115bc7Smrj /* multiboot */ 262ae115bc7Smrj #define MULTI_BOOT "/platform/i86pc/multiboot" 263ae115bc7Smrj #define MULTI_BOOT_FAILSAFE "/boot/multiboot" 264ae115bc7Smrj #define MULTI_BOOT_FAILSAFE_UNIX "kernel/unix" 265ae115bc7Smrj #define MULTI_BOOT_FAILSAFE_LINE "/boot/multiboot kernel/unix -s" 266ae115bc7Smrj 267ae115bc7Smrj /* directboot kernels */ 268ae115bc7Smrj #define DIRECT_BOOT_32 "/platform/i86pc/kernel/unix" 269ae115bc7Smrj #define DIRECT_BOOT_64 "/platform/i86pc/kernel/amd64/unix" 270ae115bc7Smrj #define DIRECT_BOOT_KERNEL "/platform/i86pc/kernel/$ISADIR/unix" 271bbcc54bdSEnrico Perla - Sun Microsystems #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix" 272bbcc54bdSEnrico Perla - Sun Microsystems #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix" 273bbcc54bdSEnrico Perla - Sun Microsystems #define DIRECT_BOOT_FAILSAFE_KERNEL \ 274bbcc54bdSEnrico Perla - Sun Microsystems "/boot/platform/i86pc/kernel/$ISADIR/unix" 275ae115bc7Smrj #define DIRECT_BOOT_FAILSAFE_LINE DIRECT_BOOT_FAILSAFE_KERNEL " -s" 276e7cbe64fSgw25295 #define DIRECT_BOOT_KERNEL_ZFS DIRECT_BOOT_KERNEL " " ZFS_BOOT 27737eb779cSVikram Hegde #define DIRECT_BOOT_PREFIX "/platform/i86pc/" 27837eb779cSVikram Hegde #define KERNEL_PREFIX "/platform/i86pc/" 27937eb779cSVikram Hegde #define AMD_UNIX_SPACE "/amd64/unix " 28037eb779cSVikram Hegde #define UNIX_SPACE "/unix " 281ae115bc7Smrj 282eb2bd662Svikram /* xVM kernels */ 283eb2bd662Svikram #define XEN_KERNEL_SUBSTR "xen.gz" 284eb2bd662Svikram 285ae115bc7Smrj /* Boot archives */ 28679755401Ssetje #define ARCHIVE_PREFIX "/platform/" 28779755401Ssetje #define ARCHIVE_SUFFIX "/boot_archive" 28848847494SEnrico Perla - Sun Microsystems #define CACHEDIR_SUFFIX "/archive_cache" 28948847494SEnrico Perla - Sun Microsystems #define UPDATEDIR_SUFFIX "/updates" 290ae115bc7Smrj #define DIRECT_BOOT_ARCHIVE "/platform/i86pc/$ISADIR/boot_archive" 291ae115bc7Smrj #define DIRECT_BOOT_ARCHIVE_32 "/platform/i86pc/boot_archive" 292ae115bc7Smrj #define DIRECT_BOOT_ARCHIVE_64 "/platform/i86pc/amd64/boot_archive" 293eb2bd662Svikram #define MULTIBOOT_ARCHIVE DIRECT_BOOT_ARCHIVE_32 294bbcc54bdSEnrico Perla - Sun Microsystems #define FAILSAFE_ARCHIVE "/boot/$ISADIR/x86.miniroot-safe" 295bbcc54bdSEnrico Perla - Sun Microsystems #define FAILSAFE_ARCHIVE_32 "/boot/x86.miniroot-safe" 296bbcc54bdSEnrico Perla - Sun Microsystems #define FAILSAFE_ARCHIVE_64 "/boot/amd64/x86.miniroot-safe" 29748847494SEnrico Perla - Sun Microsystems #define CACHEDIR_32 "/platform/i86pc/archive_cache" 29848847494SEnrico Perla - Sun Microsystems #define CACHEDIR_64 "/platform/i86pc/amd64/archive_cache" 29948847494SEnrico Perla - Sun Microsystems #define UPDATEDIR_32 "/platform/i86pc/updates" 30048847494SEnrico Perla - Sun Microsystems #define UPDATEDIR_64 "/platform/i86pc/amd64/updates" 301ae115bc7Smrj 302843e1988Sjohnlev /* Hypervisors */ 303843e1988Sjohnlev #define XEN_64 "/boot/amd64/xen.gz" 304843e1988Sjohnlev #define XEN_MENU "/boot/$ISADIR/xen.gz" 305843e1988Sjohnlev #define HYPERVISOR_KERNEL "/platform/i86xpv/kernel/$ISADIR/unix" 306eb2bd662Svikram #define XEN_KERNEL_MODULE_LINE HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL 307eb2bd662Svikram #define XEN_KERNEL_MODULE_LINE_ZFS \ 308e7cbe64fSgw25295 HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT 309843e1988Sjohnlev 31048847494SEnrico Perla - Sun Microsystems /* Helpers */ 311cedc7e57SEnrico Perla - Sun Microsystems #define MKISOFS_PATH "/usr/bin/mkisofs" 31248847494SEnrico Perla - Sun Microsystems #define DD_PATH_USR "/usr/bin/dd" 313cedc7e57SEnrico Perla - Sun Microsystems #define LOCKFS_PATH "/usr/sbin/lockfs" 31448847494SEnrico Perla - Sun Microsystems 315eb2bd662Svikram /* A first guess at the number of entries in a menu */ 316eb2bd662Svikram #define BAM_ENTRY_NUM 10 317eb2bd662Svikram 31844da779fSWilliam Kucharski /* toggle for whether delete_boot_entry prints an error message or not */ 31944da779fSWilliam Kucharski #define DBE_PRINTERR 0 32044da779fSWilliam Kucharski #define DBE_QUIET 1 32144da779fSWilliam Kucharski 322eb2bd662Svikram /* 323eb2bd662Svikram * Debugging defines 324eb2bd662Svikram */ 325eb2bd662Svikram #define INJECT_ERROR1(x, y) \ 326eb2bd662Svikram { \ 327eb2bd662Svikram if (bam_debug) { \ 328eb2bd662Svikram char *inj = getenv("_BOOTADM_INJECT"); \ 329eb2bd662Svikram if (inj && strcmp(inj, (x)) == 0) { \ 330eb2bd662Svikram y; \ 331eb2bd662Svikram } \ 332eb2bd662Svikram } \ 333eb2bd662Svikram } 334eb2bd662Svikram 335eb2bd662Svikram #define INJECT_ERROR2(x, y, z) \ 336eb2bd662Svikram { \ 337eb2bd662Svikram if (bam_debug) { \ 338eb2bd662Svikram char *inj = getenv("_BOOTADM_INJECT"); \ 339eb2bd662Svikram if (inj && strcmp(inj, (x)) == 0) { \ 340eb2bd662Svikram y; \ 341eb2bd662Svikram z; \ 342eb2bd662Svikram } \ 343eb2bd662Svikram } \ 344eb2bd662Svikram } 345eb2bd662Svikram 346eb2bd662Svikram #define BAM_DPRINTF(x) {if (bam_debug) bam_derror x; } 347eb2bd662Svikram 348ae115bc7Smrj #ifdef __cplusplus 349ae115bc7Smrj } 350ae115bc7Smrj #endif 351ae115bc7Smrj 352ae115bc7Smrj #endif /* _BOOTADM_H */ 353