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