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.
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.
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]
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
25 * Copyright 2016 Toomas Soome <tsoome@me.com>.
39 #define TEXT_DOMAIN "SUNW_OST_OSCMD"
40 #endif /* TEXT_DOMAIN */
43 #define _(x) gettext(x)
48 /* Type definitions */
50 /* GRUB menu per-line classification */
60 /* struct for menu.lst contents */
62 int lineNum
; /* Line number in menu.lst */
63 int entryNum
; /* menu boot entry #. ENTRY_INIT if not applicable */
73 typedef struct entry
{
82 /* For flags value in entry_t */
83 #define BAM_ENTRY_BOOTADM 0x01 /* entry created by bootadm */
84 #define BAM_ENTRY_LU 0x02 /* entry created by Live Upgrade */
85 #define BAM_ENTRY_CHAINLOADER 0x04 /* chainloader entry; do not disturb */
86 #define BAM_ENTRY_ROOT 0x08 /* entry has a root line */
87 #define BAM_ENTRY_FAILSAFE 0x10 /* failsafe entry */
88 #define BAM_ENTRY_DBOOT 0x20 /* Is dboot (normal or failsafe) */
89 #define BAM_ENTRY_32BIT 0x40 /* Is a 32-bit entry */
90 #define BAM_ENTRY_HV 0x80 /* Is a hypervisor entry */
91 #define BAM_ENTRY_FINDROOT 0x100 /* entry has a findroot line */
92 #define BAM_ENTRY_MULTIBOOT 0x200 /* is multiboot (normal or failsafe) */
93 #define BAM_ENTRY_64BIT 0x400 /* Is a 64-bit entry */
95 #define BAM_ENTRY_UPGFSKERNEL 0x800 /* Upgrade failsafe kernel entry */
96 #define BAM_ENTRY_UPGFSMODULE 0x1000 /* Upgrade failsafe module entry */
98 #define BAM_ENTRY_LIBBE 0x2000 /* entry created by libbe */
103 line_t
*curdefault
; /* line containing default */
104 line_t
*olddefault
; /* old default line (commented) */
105 line_t
*old_rc_default
; /* old default line for bootenv.rc */
106 entry_t
*entries
; /* os entries */
110 BAM_ERROR
= -1, /* Must be negative. add_boot_entry() depends on it */
113 BAM_MSG
, /* Used by upgrade_menu() */
114 BAM_NOCHANGE
/* Used by cvt_to_hyper()/cvt_to_metal() */
119 * menu_cmd_t and menu_cmds must be kept in sync
121 * The *_DOLLAR_CMD values must be 1 greater than the
122 * respective [KERNEL|MODULE]_CMD values.
130 KERNEL_DOLLAR_CMD
, /* Must be KERNEL_CMD + 1 */
132 MODULE_DOLLAR_CMD
, /* Must be MODULE_CMD + 1 */
141 extern char *menu_cmds
[];
143 /* For multi- or direct-boot */
146 BAM_DIRECT_MULTIBOOT
,
150 /* Is there a hypervisor present? */
157 /* Is there findroot capability present ? */
159 BAM_FINDROOT_UNKNOWN
,
165 OPT_ABSENT
= 0, /* No option */
166 OPT_REQ
, /* option required */
167 OPT_OPTIONAL
/* option may or may not be present */
173 error_t (*handler
)();
174 int unpriv
; /* is this an unprivileged command */
177 typedef enum zfs_mnted
{
185 extern int bam_verbose
;
186 extern int bam_force
;
187 extern direct_or_multi_t bam_direct
;
188 extern hv_t bam_is_hv
;
189 extern findroot_t bam_is_findroot
;
190 extern int bam_debug
;
192 extern void bam_add_line(menu_t
*mp
, entry_t
*entry
, line_t
*prev
, line_t
*lp
);
193 extern void update_numbering(menu_t
*mp
);
194 extern error_t
set_global(menu_t
*, char *, int);
195 extern error_t
upgrade_menu(menu_t
*, char *, char *);
196 extern error_t
cvt_to_hyper(menu_t
*, char *, char *);
197 extern error_t
cvt_to_metal(menu_t
*, char *, char *);
198 extern error_t
check_subcmd_and_options(char *, char *, subcmd_defn_t
*,
200 extern char *mount_top_dataset(char *pool
, zfs_mnted_t
*mnted
);
201 extern void elide_trailing_slash(const char *, char *, size_t);
202 extern int umount_top_dataset(char *, zfs_mnted_t
, char *);
203 extern void *s_calloc(size_t, size_t);
204 extern void *s_realloc(void *, size_t);
205 extern char *s_fgets(char *buf
, int n
, FILE *fp
);
206 extern void bam_error(char *format
, ...);
207 extern void bam_exit(int);
208 extern void bam_print(char *, ...);
209 extern void bam_print_stderr(char *format
, ...);
210 extern void bam_derror(char *format
, ...);
211 extern error_t
bam_loader_menu(char *, char *, int, char *[]);
212 extern error_t
get_boot_cap(const char *osroot
);
213 extern char *get_special(char *);
214 extern char *os_to_grubdisk(char *, int);
215 extern void update_line(line_t
*);
216 extern int add_boot_entry(menu_t
*, char *, char *, char *, char *, char *,
218 extern error_t
delete_boot_entry(menu_t
*, int, int);
219 extern int is_grub(const char *);
220 extern char *get_grubsign(char *osroot
, char *osdev
);
221 extern char *get_grubroot(char *osroot
, char *osdev
, char *menu_root
);
222 extern int root_optional(char *osroot
, char *menu_root
);
223 extern void unlink_line(menu_t
*mp
, line_t
*lp
);
224 extern void line_free(line_t
*lp
);
225 extern char *s_strdup(char *);
226 extern int is_sparc(void);
227 extern int is_pcfs(char *);
228 extern int is_zfs(char *);
229 extern int bootadm_digest(const char *, char **);
231 #define BAM_MAXLINE 8192
233 /* menu.lst comments created by bootadm */
234 #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
235 #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------"
238 * menu.lst comments create by Live Upgrade. Note that these are the end of
239 * the comment strings - there will be other text before them.
241 #define BAM_LU_HDR " - ADDED BY LIVE UPGRADE - DO NOT EDIT -----"
242 #define BAM_LU_FTR " -------------- END LIVE UPGRADE ------------"
244 #define BAM_OLDDEF "BOOTADM SAVED DEFAULT: "
245 #define BAM_OLD_RC_DEF "BOOTADM RC SAVED DEFAULT: "
248 * menu.lst comment created by libbe
250 #define BAM_LIBBE_FTR "============ End of LIBBE entry ============="
252 /* Title used for failsafe entries */
253 #define FAILSAFE_TITLE "Solaris failsafe"
255 /* Title used for hv entries */
256 #define NEW_HV_ENTRY "Solaris xVM"
258 /* ZFS boot option */
259 #define ZFS_BOOT "-B $ZFS-BOOTFS"
262 #define MULTI_BOOT "/platform/i86pc/multiboot"
263 #define MULTI_BOOT_FAILSAFE "/boot/multiboot"
264 #define MULTI_BOOT_FAILSAFE_UNIX "kernel/unix"
265 #define MULTI_BOOT_FAILSAFE_LINE "/boot/multiboot kernel/unix -s"
267 /* directboot kernels */
268 #define DIRECT_BOOT_32 "/platform/i86pc/kernel/unix"
269 #define DIRECT_BOOT_64 "/platform/i86pc/kernel/amd64/unix"
270 #define DIRECT_BOOT_KERNEL "/platform/i86pc/kernel/$ISADIR/unix"
271 #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix"
272 #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix"
273 #define DIRECT_BOOT_FAILSAFE_KERNEL \
274 "/boot/platform/i86pc/kernel/$ISADIR/unix"
275 #define DIRECT_BOOT_FAILSAFE_LINE DIRECT_BOOT_FAILSAFE_KERNEL " -s"
276 #define DIRECT_BOOT_KERNEL_ZFS DIRECT_BOOT_KERNEL " " ZFS_BOOT
277 #define DIRECT_BOOT_PREFIX "/platform/i86pc/"
278 #define KERNEL_PREFIX "/platform/i86pc/"
279 #define AMD_UNIX_SPACE "/amd64/unix "
280 #define UNIX_SPACE "/unix "
283 #define XEN_KERNEL_SUBSTR "xen.gz"
286 #define ARCHIVE_PREFIX "/platform/"
287 #define ARCHIVE_SUFFIX "/boot_archive"
288 #define CACHEDIR_SUFFIX "/archive_cache"
289 #define UPDATEDIR_SUFFIX "/updates"
290 #define DIRECT_BOOT_ARCHIVE "/platform/i86pc/$ISADIR/boot_archive"
291 #define DIRECT_BOOT_ARCHIVE_32 "/platform/i86pc/boot_archive"
292 #define DIRECT_BOOT_ARCHIVE_64 "/platform/i86pc/amd64/boot_archive"
293 #define MULTIBOOT_ARCHIVE DIRECT_BOOT_ARCHIVE_32
294 #define FAILSAFE_ARCHIVE "/boot/$ISADIR/x86.miniroot-safe"
295 #define FAILSAFE_ARCHIVE_32 "/boot/x86.miniroot-safe"
296 #define FAILSAFE_ARCHIVE_64 "/boot/amd64/x86.miniroot-safe"
297 #define CACHEDIR_32 "/platform/i86pc/archive_cache"
298 #define CACHEDIR_64 "/platform/i86pc/amd64/archive_cache"
299 #define UPDATEDIR_32 "/platform/i86pc/updates"
300 #define UPDATEDIR_64 "/platform/i86pc/amd64/updates"
303 #define XEN_64 "/boot/amd64/xen.gz"
304 #define XEN_MENU "/boot/$ISADIR/xen.gz"
305 #define HYPERVISOR_KERNEL "/platform/i86xpv/kernel/$ISADIR/unix"
306 #define XEN_KERNEL_MODULE_LINE HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
307 #define XEN_KERNEL_MODULE_LINE_ZFS \
308 HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
311 #define MKISOFS_PATH "/usr/bin/mkisofs"
312 #define DD_PATH_USR "/usr/bin/dd"
313 #define LOCKFS_PATH "/usr/sbin/lockfs"
315 /* A first guess at the number of entries in a menu */
316 #define BAM_ENTRY_NUM 10
318 /* toggle for whether delete_boot_entry prints an error message or not */
319 #define DBE_PRINTERR 0
325 #define INJECT_ERROR1(x, y) \
328 char *inj = getenv("_BOOTADM_INJECT"); \
329 if (inj && strcmp(inj, (x)) == 0) { \
335 #define INJECT_ERROR2(x, y, z) \
338 char *inj = getenv("_BOOTADM_INJECT"); \
339 if (inj && strcmp(inj, (x)) == 0) { \
346 #define BAM_DPRINTF(x) {if (bam_debug) bam_derror x; }
352 #endif /* _BOOTADM_H */