13446Smrj /* 23446Smrj * CDDL HEADER START 33446Smrj * 43446Smrj * The contents of this file are subject to the terms of the 53446Smrj * Common Development and Distribution License (the "License"). 63446Smrj * You may not use this file except in compliance with the License. 73446Smrj * 83446Smrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93446Smrj * or http://www.opensolaris.org/os/licensing. 103446Smrj * See the License for the specific language governing permissions 113446Smrj * and limitations under the License. 123446Smrj * 133446Smrj * When distributing Covered Code, include this CDDL HEADER in each 143446Smrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153446Smrj * If applicable, add the following below this CDDL HEADER, with the 163446Smrj * fields enclosed by brackets "[]" replaced with your own identifying 173446Smrj * information: Portions Copyright [yyyy] [name of copyright owner] 183446Smrj * 193446Smrj * CDDL HEADER END 203446Smrj */ 213446Smrj /* 228642SVikram.Hegde@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 233446Smrj * Use is subject to license terms. 243446Smrj */ 253446Smrj 263446Smrj #ifndef _BOOTADM_H 273446Smrj #define _BOOTADM_H 283446Smrj 293446Smrj #ifdef __cplusplus 303446Smrj extern "C" { 313446Smrj #endif 323446Smrj 336448Svikram #include <assert.h> 346448Svikram 353446Smrj #ifndef TEXT_DOMAIN 363446Smrj #define TEXT_DOMAIN "SUNW_OST_OSCMD" 373446Smrj #endif /* TEXT_DOMAIN */ 383446Smrj 393446Smrj /* Type definitions */ 403446Smrj 413446Smrj /* GRUB menu per-line classification */ 423446Smrj typedef enum { 433446Smrj BAM_INVALID = 0, 443446Smrj BAM_EMPTY, 453446Smrj BAM_COMMENT, 463446Smrj BAM_GLOBAL, 473446Smrj BAM_ENTRY, 483446Smrj BAM_TITLE 493446Smrj } menu_flag_t; 503446Smrj 513446Smrj /* struct for menu.lst contents */ 523446Smrj typedef struct line { 533446Smrj int lineNum; /* Line number in menu.lst */ 543446Smrj int entryNum; /* menu boot entry #. ENTRY_INIT if not applicable */ 553446Smrj char *cmd; 563446Smrj char *sep; 573446Smrj char *arg; 583446Smrj char *line; 593446Smrj menu_flag_t flags; 603446Smrj struct line *next; 613446Smrj struct line *prev; 623446Smrj } line_t; 633446Smrj 643446Smrj typedef struct entry { 653446Smrj struct entry *next; 663446Smrj struct entry *prev; 673446Smrj line_t *start; 683446Smrj line_t *end; 693446Smrj int entryNum; 706448Svikram uint_t flags; 713446Smrj } entry_t; 723446Smrj 733446Smrj /* For flags value in entry_t */ 743446Smrj #define BAM_ENTRY_BOOTADM 0x01 /* entry created by bootadm */ 753446Smrj #define BAM_ENTRY_LU 0x02 /* entry created by Live Upgrade */ 763446Smrj #define BAM_ENTRY_CHAINLOADER 0x04 /* chainloader entry; do not disturb */ 773446Smrj #define BAM_ENTRY_ROOT 0x08 /* entry has a root line */ 786448Svikram #define BAM_ENTRY_FAILSAFE 0x10 /* failsafe entry */ 796448Svikram #define BAM_ENTRY_DBOOT 0x20 /* Is dboot (normal or failsafe) */ 803446Smrj #define BAM_ENTRY_32BIT 0x40 /* Is a 32-bit entry */ 815084Sjohnlev #define BAM_ENTRY_HV 0x80 /* Is a hypervisor entry */ 826448Svikram #define BAM_ENTRY_FINDROOT 0x100 /* entry has a findroot line */ 836448Svikram #define BAM_ENTRY_MULTIBOOT 0x200 /* is multiboot (normal or failsafe) */ 846448Svikram #define BAM_ENTRY_64BIT 0x400 /* Is a 64-bit entry */ 853446Smrj 868104SEnrico.Perla@Sun.COM #define BAM_ENTRY_UPGFSKERNEL 0x800 /* Upgrade failsafe kernel entry */ 878104SEnrico.Perla@Sun.COM #define BAM_ENTRY_UPGFSMODULE 0x1000 /* Upgrade failsafe module entry */ 888104SEnrico.Perla@Sun.COM 89*10989SWilliam.Kucharski@Sun.COM #define BAM_ENTRY_LIBBE 0x2000 /* entry created by libbe */ 90*10989SWilliam.Kucharski@Sun.COM 913446Smrj typedef struct { 923446Smrj line_t *start; 933446Smrj line_t *end; 943446Smrj line_t *curdefault; /* line containing default */ 953446Smrj line_t *olddefault; /* old default line (commented) */ 963446Smrj line_t *old_rc_default; /* old default line for bootenv.rc */ 973446Smrj entry_t *entries; /* os entries */ 983446Smrj } menu_t; 993446Smrj 1003446Smrj typedef enum { 1013446Smrj BAM_ERROR = -1, /* Must be negative. add_boot_entry() depends on it */ 1023446Smrj BAM_SUCCESS = 0, 1033446Smrj BAM_WRITE = 2, 10410499SWilliam.Kucharski@Sun.COM BAM_MSG, /* Used by upgrade_menu() */ 10510499SWilliam.Kucharski@Sun.COM BAM_NOCHANGE /* Used by cvt_to_hyper()/cvt_to_metal() */ 1063446Smrj } error_t; 1073446Smrj 1083446Smrj /* 1093446Smrj * Menu related 1103446Smrj * menu_cmd_t and menu_cmds must be kept in sync 1115084Sjohnlev * 1125084Sjohnlev * The *_DOLLAR_CMD values must be 1 greater than the 1135084Sjohnlev * respective [KERNEL|MODULE]_CMD values. 1143446Smrj */ 1153446Smrj typedef enum { 1163446Smrj DEFAULT_CMD = 0, 1173446Smrj TIMEOUT_CMD, 1183446Smrj TITLE_CMD, 1193446Smrj ROOT_CMD, 1203446Smrj KERNEL_CMD, 1215084Sjohnlev KERNEL_DOLLAR_CMD, /* Must be KERNEL_CMD + 1 */ 1223446Smrj MODULE_CMD, 1235084Sjohnlev MODULE_DOLLAR_CMD, /* Must be MODULE_CMD + 1 */ 1243446Smrj SEP_CMD, 1253446Smrj COMMENT_CMD, 1263446Smrj CHAINLOADER_CMD, 1276448Svikram ARGS_CMD, 12810499SWilliam.Kucharski@Sun.COM FINDROOT_CMD, 12910499SWilliam.Kucharski@Sun.COM BOOTFS_CMD 1303446Smrj } menu_cmd_t; 1313446Smrj 1323446Smrj extern char *menu_cmds[]; 1333446Smrj 1343446Smrj /* For multi- or direct-boot */ 1353446Smrj typedef enum { 1363446Smrj BAM_DIRECT_NOT_SET, 1373446Smrj BAM_DIRECT_MULTIBOOT, 1383446Smrj BAM_DIRECT_DBOOT 1393446Smrj } direct_or_multi_t; 1403446Smrj 1415084Sjohnlev /* Is there a hypervisor present? */ 1425084Sjohnlev typedef enum { 1435084Sjohnlev BAM_HV_UNKNOWN, 1445084Sjohnlev BAM_HV_NO, 1455084Sjohnlev BAM_HV_PRESENT 1465084Sjohnlev } hv_t; 1475084Sjohnlev 1486448Svikram /* Is there findroot capability present ? */ 1496448Svikram typedef enum { 1506448Svikram BAM_FINDROOT_UNKNOWN, 1516448Svikram BAM_FINDROOT_ABSENT, 1526448Svikram BAM_FINDROOT_PRESENT 1536448Svikram } findroot_t; 1546448Svikram 1553446Smrj extern int bam_verbose; 1563446Smrj extern int bam_force; 1573446Smrj extern direct_or_multi_t bam_direct; 1585084Sjohnlev extern hv_t bam_is_hv; 1596448Svikram extern findroot_t bam_is_findroot; 1606448Svikram extern int bam_debug; 1613446Smrj 1626448Svikram extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp); 1636448Svikram extern void update_numbering(menu_t *mp); 16410499SWilliam.Kucharski@Sun.COM extern error_t set_global(menu_t *, char *, int); 1653446Smrj extern error_t upgrade_menu(menu_t *, char *, char *); 16610499SWilliam.Kucharski@Sun.COM extern error_t cvt_to_hyper(menu_t *, char *, char *); 16710499SWilliam.Kucharski@Sun.COM extern error_t cvt_to_metal(menu_t *, char *, char *); 1683446Smrj extern void *s_calloc(size_t, size_t); 1693446Smrj extern void *s_realloc(void *, size_t); 1703446Smrj extern char *s_fgets(char *buf, int n, FILE *fp); 1713446Smrj extern void bam_error(char *format, ...); 17210787SWilliam.Kucharski@Sun.COM extern void bam_exit(int); 1736448Svikram extern void bam_print(char *, ...); 1743446Smrj extern void bam_print_stderr(char *format, ...); 1756448Svikram extern void bam_derror(char *format, ...); 1766448Svikram extern error_t get_boot_cap(const char *osroot); 1773446Smrj extern char *get_special(char *); 1783446Smrj extern char *os_to_grubdisk(char *, int); 1793446Smrj extern void update_line(line_t *); 18010499SWilliam.Kucharski@Sun.COM extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *, 18110499SWilliam.Kucharski@Sun.COM char *); 18210499SWilliam.Kucharski@Sun.COM extern error_t delete_boot_entry(menu_t *, int, int); 1835648Ssetje extern int is_grub(const char *); 1846448Svikram extern char *get_grubsign(char *osroot, char *osdev); 1856448Svikram extern char *get_grubroot(char *osroot, char *osdev, char *menu_root); 1866448Svikram extern int root_optional(char *osroot, char *menu_root); 1876448Svikram extern void unlink_line(menu_t *mp, line_t *lp); 1886448Svikram extern void line_free(line_t *lp); 1896448Svikram extern char *s_strdup(char *); 1906448Svikram extern int is_sparc(void); 1913446Smrj 1923446Smrj #define BAM_MAXLINE 8192 1933446Smrj 1943446Smrj /* menu.lst comments created by bootadm */ 1953446Smrj #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------" 1963446Smrj #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------" 1973446Smrj 1983446Smrj /* 1993446Smrj * menu.lst comments create by Live Upgrade. Note that these are the end of 2003446Smrj * the comment strings - there will be other text before them. 2013446Smrj */ 2023446Smrj #define BAM_LU_HDR " - ADDED BY LIVE UPGRADE - DO NOT EDIT -----" 2033446Smrj #define BAM_LU_FTR " -------------- END LIVE UPGRADE ------------" 2043446Smrj 2053446Smrj #define BAM_OLDDEF "BOOTADM SAVED DEFAULT: " 2063446Smrj #define BAM_OLD_RC_DEF "BOOTADM RC SAVED DEFAULT: " 2073446Smrj 208*10989SWilliam.Kucharski@Sun.COM /* 209*10989SWilliam.Kucharski@Sun.COM * menu.lst comment created by libbe 210*10989SWilliam.Kucharski@Sun.COM */ 211*10989SWilliam.Kucharski@Sun.COM #define BAM_LIBBE_FTR "============ End of LIBBE entry =============" 212*10989SWilliam.Kucharski@Sun.COM 2133446Smrj /* Title used for failsafe entries */ 2143446Smrj #define FAILSAFE_TITLE "Solaris failsafe" 2153446Smrj 2165084Sjohnlev /* Title used for hv entries */ 2175084Sjohnlev #define NEW_HV_ENTRY "Solaris xVM" 2185084Sjohnlev 2196423Sgw25295 /* ZFS boot option */ 2206423Sgw25295 #define ZFS_BOOT "-B $ZFS-BOOTFS" 2216423Sgw25295 2223446Smrj /* multiboot */ 2233446Smrj #define MULTI_BOOT "/platform/i86pc/multiboot" 2243446Smrj #define MULTI_BOOT_FAILSAFE "/boot/multiboot" 2253446Smrj #define MULTI_BOOT_FAILSAFE_UNIX "kernel/unix" 2263446Smrj #define MULTI_BOOT_FAILSAFE_LINE "/boot/multiboot kernel/unix -s" 2273446Smrj 2283446Smrj /* directboot kernels */ 2293446Smrj #define DIRECT_BOOT_32 "/platform/i86pc/kernel/unix" 2303446Smrj #define DIRECT_BOOT_64 "/platform/i86pc/kernel/amd64/unix" 2313446Smrj #define DIRECT_BOOT_KERNEL "/platform/i86pc/kernel/$ISADIR/unix" 2328104SEnrico.Perla@Sun.COM #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix" 2338104SEnrico.Perla@Sun.COM #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix" 2348104SEnrico.Perla@Sun.COM #define DIRECT_BOOT_FAILSAFE_KERNEL \ 2358104SEnrico.Perla@Sun.COM "/boot/platform/i86pc/kernel/$ISADIR/unix" 2363446Smrj #define DIRECT_BOOT_FAILSAFE_LINE DIRECT_BOOT_FAILSAFE_KERNEL " -s" 2376423Sgw25295 #define DIRECT_BOOT_KERNEL_ZFS DIRECT_BOOT_KERNEL " " ZFS_BOOT 2388642SVikram.Hegde@Sun.COM #define DIRECT_BOOT_PREFIX "/platform/i86pc/" 2398642SVikram.Hegde@Sun.COM #define KERNEL_PREFIX "/platform/i86pc/" 2408642SVikram.Hegde@Sun.COM #define AMD_UNIX_SPACE "/amd64/unix " 2418642SVikram.Hegde@Sun.COM #define UNIX_SPACE "/unix " 2423446Smrj 2436448Svikram /* xVM kernels */ 2446448Svikram #define XEN_KERNEL_SUBSTR "xen.gz" 2456448Svikram 2463446Smrj /* Boot archives */ 2476582Ssetje #define ARCHIVE_PREFIX "/platform/" 2486582Ssetje #define ARCHIVE_SUFFIX "/boot_archive" 2498735SEnrico.Perla@Sun.COM #define CACHEDIR_SUFFIX "/archive_cache" 2508735SEnrico.Perla@Sun.COM #define UPDATEDIR_SUFFIX "/updates" 2513446Smrj #define DIRECT_BOOT_ARCHIVE "/platform/i86pc/$ISADIR/boot_archive" 2523446Smrj #define DIRECT_BOOT_ARCHIVE_32 "/platform/i86pc/boot_archive" 2533446Smrj #define DIRECT_BOOT_ARCHIVE_64 "/platform/i86pc/amd64/boot_archive" 2546448Svikram #define MULTIBOOT_ARCHIVE DIRECT_BOOT_ARCHIVE_32 2558104SEnrico.Perla@Sun.COM #define FAILSAFE_ARCHIVE "/boot/$ISADIR/x86.miniroot-safe" 2568104SEnrico.Perla@Sun.COM #define FAILSAFE_ARCHIVE_32 "/boot/x86.miniroot-safe" 2578104SEnrico.Perla@Sun.COM #define FAILSAFE_ARCHIVE_64 "/boot/amd64/x86.miniroot-safe" 2588735SEnrico.Perla@Sun.COM #define CACHEDIR_32 "/platform/i86pc/archive_cache" 2598735SEnrico.Perla@Sun.COM #define CACHEDIR_64 "/platform/i86pc/amd64/archive_cache" 2608735SEnrico.Perla@Sun.COM #define UPDATEDIR_32 "/platform/i86pc/updates" 2618735SEnrico.Perla@Sun.COM #define UPDATEDIR_64 "/platform/i86pc/amd64/updates" 2623446Smrj 2635084Sjohnlev /* Hypervisors */ 2645084Sjohnlev #define XEN_64 "/boot/amd64/xen.gz" 2655084Sjohnlev #define XEN_MENU "/boot/$ISADIR/xen.gz" 2665084Sjohnlev #define HYPERVISOR_KERNEL "/platform/i86xpv/kernel/$ISADIR/unix" 2676448Svikram #define XEN_KERNEL_MODULE_LINE HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL 2686448Svikram #define XEN_KERNEL_MODULE_LINE_ZFS \ 2696423Sgw25295 HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT 2705084Sjohnlev 2718735SEnrico.Perla@Sun.COM /* Helpers */ 2728954SEnrico.Perla@Sun.COM #define MKISOFS_PATH "/usr/bin/mkisofs" 2738735SEnrico.Perla@Sun.COM #define DD_PATH_USR "/usr/bin/dd" 2748954SEnrico.Perla@Sun.COM #define LOCKFS_PATH "/usr/sbin/lockfs" 2758735SEnrico.Perla@Sun.COM 2766448Svikram /* A first guess at the number of entries in a menu */ 2776448Svikram #define BAM_ENTRY_NUM 10 2786448Svikram 27910499SWilliam.Kucharski@Sun.COM /* toggle for whether delete_boot_entry prints an error message or not */ 28010499SWilliam.Kucharski@Sun.COM #define DBE_PRINTERR 0 28110499SWilliam.Kucharski@Sun.COM #define DBE_QUIET 1 28210499SWilliam.Kucharski@Sun.COM 2836448Svikram /* 2846448Svikram * Debugging defines 2856448Svikram */ 2866448Svikram #define INJECT_ERROR1(x, y) \ 2876448Svikram { \ 2886448Svikram if (bam_debug) { \ 2896448Svikram char *inj = getenv("_BOOTADM_INJECT"); \ 2906448Svikram if (inj && strcmp(inj, (x)) == 0) { \ 2916448Svikram y; \ 2926448Svikram } \ 2936448Svikram } \ 2946448Svikram } 2956448Svikram 2966448Svikram #define INJECT_ERROR2(x, y, z) \ 2976448Svikram { \ 2986448Svikram if (bam_debug) { \ 2996448Svikram char *inj = getenv("_BOOTADM_INJECT"); \ 3006448Svikram if (inj && strcmp(inj, (x)) == 0) { \ 3016448Svikram y; \ 3026448Svikram z; \ 3036448Svikram } \ 3046448Svikram } \ 3056448Svikram } 3066448Svikram 3076448Svikram #define BAM_DPRINTF(x) {if (bam_debug) bam_derror x; } 3086448Svikram 3093446Smrj #ifdef __cplusplus 3103446Smrj } 3113446Smrj #endif 3123446Smrj 3133446Smrj #endif /* _BOOTADM_H */ 314