xref: /illumos-gate/usr/src/cmd/boot/bootadm/bootadm.h (revision c262cbbc)
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.
242dc23587SToomas Soome  *
252dc23587SToomas 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*c262cbbcSToomas Soome #include <libintl.h>
37eb2bd662Svikram 
38ae115bc7Smrj #ifndef	TEXT_DOMAIN
39ae115bc7Smrj #define	TEXT_DOMAIN	"SUNW_OST_OSCMD"
40ae115bc7Smrj #endif  /* TEXT_DOMAIN */
41ae115bc7Smrj 
42*c262cbbcSToomas Soome #ifndef	lint
43*c262cbbcSToomas Soome #define	_(x) gettext(x)
44*c262cbbcSToomas Soome #else
45*c262cbbcSToomas Soome #define	_(x) (x)
46*c262cbbcSToomas Soome #endif
47*c262cbbcSToomas 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*c262cbbcSToomas Soome typedef enum {
165*c262cbbcSToomas Soome 	OPT_ABSENT = 0,		/* No option */
166*c262cbbcSToomas Soome 	OPT_REQ,		/* option required */
167*c262cbbcSToomas Soome 	OPT_OPTIONAL		/* option may or may not be present */
168*c262cbbcSToomas Soome } option_t;
169*c262cbbcSToomas Soome 
170*c262cbbcSToomas Soome typedef struct {
171*c262cbbcSToomas Soome 	char	*subcmd;
172*c262cbbcSToomas Soome 	option_t option;
173*c262cbbcSToomas Soome 	error_t	(*handler)();
174*c262cbbcSToomas Soome 	int	unpriv;			/* is this an unprivileged command */
175*c262cbbcSToomas Soome } subcmd_defn_t;
176*c262cbbcSToomas Soome 
177*c262cbbcSToomas Soome typedef enum zfs_mnted {
178*c262cbbcSToomas Soome 	ZFS_MNT_ERROR = -1,
179*c262cbbcSToomas Soome 	LEGACY_MOUNTED = 1,
180*c262cbbcSToomas Soome 	LEGACY_ALREADY,
181*c262cbbcSToomas Soome 	ZFS_MOUNTED,
182*c262cbbcSToomas Soome 	ZFS_ALREADY
183*c262cbbcSToomas Soome } zfs_mnted_t;
184*c262cbbcSToomas 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*c262cbbcSToomas Soome extern error_t check_subcmd_and_options(char *, char *, subcmd_defn_t *,
199*c262cbbcSToomas Soome     error_t (**fp)());
200*c262cbbcSToomas Soome extern char *mount_top_dataset(char *pool, zfs_mnted_t *mnted);
201*c262cbbcSToomas Soome extern void elide_trailing_slash(const char *, char *, size_t);
202*c262cbbcSToomas 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*c262cbbcSToomas 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*c262cbbcSToomas Soome extern int is_pcfs(char *);
228*c262cbbcSToomas Soome extern int is_zfs(char *);
2292dc23587SToomas 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 
258e7cbe64fSgw /* ZFS boot option */
259e7cbe64fSgw #define	ZFS_BOOT	"-B $ZFS-BOOTFS"
260e7cbe64fSgw 
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"
276e7cbe64fSgw #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	\
308e7cbe64fSgw 	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