1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _BOOTADM_H 27 #define _BOOTADM_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #include <assert.h> 34 35 #ifndef TEXT_DOMAIN 36 #define TEXT_DOMAIN "SUNW_OST_OSCMD" 37 #endif /* TEXT_DOMAIN */ 38 39 /* Type definitions */ 40 41 /* GRUB menu per-line classification */ 42 typedef enum { 43 BAM_INVALID = 0, 44 BAM_EMPTY, 45 BAM_COMMENT, 46 BAM_GLOBAL, 47 BAM_ENTRY, 48 BAM_TITLE 49 } menu_flag_t; 50 51 /* struct for menu.lst contents */ 52 typedef struct line { 53 int lineNum; /* Line number in menu.lst */ 54 int entryNum; /* menu boot entry #. ENTRY_INIT if not applicable */ 55 char *cmd; 56 char *sep; 57 char *arg; 58 char *line; 59 menu_flag_t flags; 60 struct line *next; 61 struct line *prev; 62 } line_t; 63 64 typedef struct entry { 65 struct entry *next; 66 struct entry *prev; 67 line_t *start; 68 line_t *end; 69 int entryNum; 70 uint_t flags; 71 } entry_t; 72 73 /* For flags value in entry_t */ 74 #define BAM_ENTRY_BOOTADM 0x01 /* entry created by bootadm */ 75 #define BAM_ENTRY_LU 0x02 /* entry created by Live Upgrade */ 76 #define BAM_ENTRY_CHAINLOADER 0x04 /* chainloader entry; do not disturb */ 77 #define BAM_ENTRY_ROOT 0x08 /* entry has a root line */ 78 #define BAM_ENTRY_FAILSAFE 0x10 /* failsafe entry */ 79 #define BAM_ENTRY_DBOOT 0x20 /* Is dboot (normal or failsafe) */ 80 #define BAM_ENTRY_32BIT 0x40 /* Is a 32-bit entry */ 81 #define BAM_ENTRY_HV 0x80 /* Is a hypervisor entry */ 82 #define BAM_ENTRY_FINDROOT 0x100 /* entry has a findroot line */ 83 #define BAM_ENTRY_MULTIBOOT 0x200 /* is multiboot (normal or failsafe) */ 84 #define BAM_ENTRY_64BIT 0x400 /* Is a 64-bit entry */ 85 86 #define BAM_ENTRY_UPGFSKERNEL 0x800 /* Upgrade failsafe kernel entry */ 87 #define BAM_ENTRY_UPGFSMODULE 0x1000 /* Upgrade failsafe module entry */ 88 89 #define BAM_ENTRY_LIBBE 0x2000 /* entry created by libbe */ 90 91 typedef struct { 92 line_t *start; 93 line_t *end; 94 line_t *curdefault; /* line containing default */ 95 line_t *olddefault; /* old default line (commented) */ 96 line_t *old_rc_default; /* old default line for bootenv.rc */ 97 entry_t *entries; /* os entries */ 98 } menu_t; 99 100 typedef enum { 101 BAM_ERROR = -1, /* Must be negative. add_boot_entry() depends on it */ 102 BAM_SUCCESS = 0, 103 BAM_WRITE = 2, 104 BAM_MSG, /* Used by upgrade_menu() */ 105 BAM_NOCHANGE /* Used by cvt_to_hyper()/cvt_to_metal() */ 106 } error_t; 107 108 /* 109 * Menu related 110 * menu_cmd_t and menu_cmds must be kept in sync 111 * 112 * The *_DOLLAR_CMD values must be 1 greater than the 113 * respective [KERNEL|MODULE]_CMD values. 114 */ 115 typedef enum { 116 DEFAULT_CMD = 0, 117 TIMEOUT_CMD, 118 TITLE_CMD, 119 ROOT_CMD, 120 KERNEL_CMD, 121 KERNEL_DOLLAR_CMD, /* Must be KERNEL_CMD + 1 */ 122 MODULE_CMD, 123 MODULE_DOLLAR_CMD, /* Must be MODULE_CMD + 1 */ 124 SEP_CMD, 125 COMMENT_CMD, 126 CHAINLOADER_CMD, 127 ARGS_CMD, 128 FINDROOT_CMD, 129 BOOTFS_CMD, 130 KERNEL_OPTIONS_CMD, 131 } menu_cmd_t; 132 133 extern char *menu_cmds[]; 134 135 /* For multi- or direct-boot */ 136 typedef enum { 137 BAM_DIRECT_NOT_SET, 138 BAM_DIRECT_MULTIBOOT, 139 BAM_DIRECT_DBOOT 140 } direct_or_multi_t; 141 142 /* Is there a hypervisor present? */ 143 typedef enum { 144 BAM_HV_UNKNOWN, 145 BAM_HV_NO, 146 BAM_HV_PRESENT 147 } hv_t; 148 149 /* Is there findroot capability present ? */ 150 typedef enum { 151 BAM_FINDROOT_UNKNOWN, 152 BAM_FINDROOT_ABSENT, 153 BAM_FINDROOT_PRESENT 154 } findroot_t; 155 156 extern int bam_verbose; 157 extern int bam_force; 158 extern direct_or_multi_t bam_direct; 159 extern hv_t bam_is_hv; 160 extern findroot_t bam_is_findroot; 161 extern int bam_debug; 162 163 extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp); 164 extern void update_numbering(menu_t *mp); 165 extern error_t set_global(menu_t *, char *, int); 166 extern error_t upgrade_menu(menu_t *, char *, char *); 167 extern error_t cvt_to_hyper(menu_t *, char *, char *); 168 extern error_t cvt_to_metal(menu_t *, char *, char *); 169 extern void *s_calloc(size_t, size_t); 170 extern void *s_realloc(void *, size_t); 171 extern char *s_fgets(char *buf, int n, FILE *fp); 172 extern void bam_error(char *format, ...); 173 extern void bam_exit(int); 174 extern void bam_print(char *, ...); 175 extern void bam_print_stderr(char *format, ...); 176 extern void bam_derror(char *format, ...); 177 extern error_t get_boot_cap(const char *osroot); 178 extern char *get_special(char *); 179 extern char *os_to_grubdisk(char *, int); 180 extern void update_line(line_t *); 181 extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *, 182 char *); 183 extern error_t delete_boot_entry(menu_t *, int, int); 184 extern int is_grub(const char *); 185 extern char *get_grubsign(char *osroot, char *osdev); 186 extern char *get_grubroot(char *osroot, char *osdev, char *menu_root); 187 extern int root_optional(char *osroot, char *menu_root); 188 extern void unlink_line(menu_t *mp, line_t *lp); 189 extern void line_free(line_t *lp); 190 extern char *s_strdup(char *); 191 extern int is_sparc(void); 192 193 #define BAM_MAXLINE 8192 194 195 /* menu.lst comments created by bootadm */ 196 #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------" 197 #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------" 198 199 /* 200 * menu.lst comments create by Live Upgrade. Note that these are the end of 201 * the comment strings - there will be other text before them. 202 */ 203 #define BAM_LU_HDR " - ADDED BY LIVE UPGRADE - DO NOT EDIT -----" 204 #define BAM_LU_FTR " -------------- END LIVE UPGRADE ------------" 205 206 #define BAM_OLDDEF "BOOTADM SAVED DEFAULT: " 207 #define BAM_OLD_RC_DEF "BOOTADM RC SAVED DEFAULT: " 208 209 /* 210 * menu.lst comment created by libbe 211 */ 212 #define BAM_LIBBE_FTR "============ End of LIBBE entry =============" 213 214 /* Title used for failsafe entries */ 215 #define FAILSAFE_TITLE "Solaris failsafe" 216 217 /* Title used for hv entries */ 218 #define NEW_HV_ENTRY "Solaris xVM" 219 220 /* ZFS boot option */ 221 #define ZFS_BOOT "-B $ZFS_BOOTFS" 222 223 /* multiboot */ 224 #define MULTI_BOOT "/platform/i86pc/multiboot" 225 #define MULTI_BOOT_FAILSAFE "/boot/multiboot" 226 #define MULTI_BOOT_FAILSAFE_UNIX "kernel/unix" 227 #define MULTI_BOOT_FAILSAFE_LINE "/boot/multiboot kernel/unix -s" 228 229 /* directboot kernels */ 230 #define DIRECT_BOOT_32 "/platform/i86pc/kernel/unix" 231 #define DIRECT_BOOT_64 "/platform/i86pc/kernel/amd64/unix" 232 #define DIRECT_BOOT_KERNEL "/platform/i86pc/kernel/$ISADIR/unix" 233 #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix" 234 #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix" 235 #define DIRECT_BOOT_FAILSAFE_KERNEL \ 236 "/boot/platform/i86pc/kernel/$ISADIR/unix" 237 #define DIRECT_BOOT_FAILSAFE_LINE DIRECT_BOOT_FAILSAFE_KERNEL " -s" 238 #define DIRECT_BOOT_KERNEL_ZFS DIRECT_BOOT_KERNEL " " ZFS_BOOT 239 #define DIRECT_BOOT_PREFIX "/platform/i86pc/" 240 #define KERNEL_PREFIX "/platform/i86pc/" 241 #define AMD_UNIX_SPACE "/amd64/unix " 242 #define UNIX_SPACE "/unix " 243 244 /* xVM kernels */ 245 #define XEN_KERNEL_SUBSTR "xen.gz" 246 247 /* Boot archives */ 248 #define ARCHIVE_PREFIX "/platform/" 249 #define ARCHIVE_SUFFIX "/boot_archive" 250 #define CACHEDIR_SUFFIX "/archive_cache" 251 #define UPDATEDIR_SUFFIX "/updates" 252 #define DIRECT_BOOT_ARCHIVE "/platform/i86pc/$ISADIR/boot_archive" 253 #define DIRECT_BOOT_ARCHIVE_32 "/platform/i86pc/boot_archive" 254 #define DIRECT_BOOT_ARCHIVE_64 "/platform/i86pc/amd64/boot_archive" 255 #define MULTIBOOT_ARCHIVE DIRECT_BOOT_ARCHIVE_32 256 #define FAILSAFE_ARCHIVE "/boot/$ISADIR/x86.miniroot-safe" 257 #define FAILSAFE_ARCHIVE_32 "/boot/x86.miniroot-safe" 258 #define FAILSAFE_ARCHIVE_64 "/boot/amd64/x86.miniroot-safe" 259 #define CACHEDIR_32 "/platform/i86pc/archive_cache" 260 #define CACHEDIR_64 "/platform/i86pc/amd64/archive_cache" 261 #define UPDATEDIR_32 "/platform/i86pc/updates" 262 #define UPDATEDIR_64 "/platform/i86pc/amd64/updates" 263 264 /* Hypervisors */ 265 #define XEN_64 "/boot/amd64/xen.gz" 266 #define XEN_MENU "/boot/$ISADIR/xen.gz" 267 #define HYPERVISOR_KERNEL "/platform/i86xpv/kernel/$ISADIR/unix" 268 #define XEN_KERNEL_MODULE_LINE HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL 269 #define XEN_KERNEL_MODULE_LINE_ZFS \ 270 HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT 271 272 /* Helpers */ 273 #define MKISOFS_PATH "/usr/bin/mkisofs" 274 #define DD_PATH_USR "/usr/bin/dd" 275 #define LOCKFS_PATH "/usr/sbin/lockfs" 276 277 /* A first guess at the number of entries in a menu */ 278 #define BAM_ENTRY_NUM 10 279 280 /* toggle for whether delete_boot_entry prints an error message or not */ 281 #define DBE_PRINTERR 0 282 #define DBE_QUIET 1 283 284 /* 285 * Debugging defines 286 */ 287 #define INJECT_ERROR1(x, y) \ 288 { \ 289 if (bam_debug) { \ 290 char *inj = getenv("_BOOTADM_INJECT"); \ 291 if (inj && strcmp(inj, (x)) == 0) { \ 292 y; \ 293 } \ 294 } \ 295 } 296 297 #define INJECT_ERROR2(x, y, z) \ 298 { \ 299 if (bam_debug) { \ 300 char *inj = getenv("_BOOTADM_INJECT"); \ 301 if (inj && strcmp(inj, (x)) == 0) { \ 302 y; \ 303 z; \ 304 } \ 305 } \ 306 } 307 308 #define BAM_DPRINTF(x) {if (bam_debug) bam_derror x; } 309 310 #ifdef __cplusplus 311 } 312 #endif 313 314 #endif /* _BOOTADM_H */