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 } menu_cmd_t;
 131 
 132 extern char *menu_cmds[];
 133 
 134 /* For multi- or direct-boot */
 135 typedef enum {
 136         BAM_DIRECT_NOT_SET,
 137         BAM_DIRECT_MULTIBOOT,
 138         BAM_DIRECT_DBOOT
 139 } direct_or_multi_t;
 140 
 141 /* Is there a hypervisor present? */
 142 typedef enum {
 143         BAM_HV_UNKNOWN,
 144         BAM_HV_NO,
 145         BAM_HV_PRESENT
 146 } hv_t;
 147 
 148 /* Is there findroot capability present ? */
 149 typedef enum {
 150         BAM_FINDROOT_UNKNOWN,
 151         BAM_FINDROOT_ABSENT,
 152         BAM_FINDROOT_PRESENT
 153 } findroot_t;
 154 
 155 extern int bam_verbose;
 156 extern int bam_force;
 157 extern direct_or_multi_t bam_direct;
 158 extern hv_t bam_is_hv;
 159 extern findroot_t bam_is_findroot;
 160 extern int bam_debug;
 161 
 162 extern void bam_add_line(menu_t *mp, entry_t *entry, line_t *prev, line_t *lp);
 163 extern void update_numbering(menu_t *mp);
 164 extern error_t set_global(menu_t *, char *, int);
 165 extern error_t upgrade_menu(menu_t *, char *, char *);
 166 extern error_t cvt_to_hyper(menu_t *, char *, char *);
 167 extern error_t cvt_to_metal(menu_t *, char *, char *);
 168 extern void *s_calloc(size_t, size_t);
 169 extern void *s_realloc(void *, size_t);
 170 extern char *s_fgets(char *buf, int n, FILE *fp);
 171 extern void bam_error(char *format, ...);
 172 extern void bam_exit(int);
 173 extern void bam_print(char *, ...);
 174 extern void bam_print_stderr(char *format, ...);
 175 extern void bam_derror(char *format, ...);
 176 extern error_t get_boot_cap(const char *osroot);
 177 extern char *get_special(char *);
 178 extern char *os_to_grubdisk(char *, int);
 179 extern void update_line(line_t *);
 180 extern int add_boot_entry(menu_t *, char *, char *, char *, char *, char *,
 181     char *);
 182 extern error_t delete_boot_entry(menu_t *, int, int);
 183 extern int is_grub(const char *);
 184 extern char *get_grubsign(char *osroot, char *osdev);
 185 extern char *get_grubroot(char *osroot, char *osdev, char *menu_root);
 186 extern int root_optional(char *osroot, char *menu_root);
 187 extern void unlink_line(menu_t *mp, line_t *lp);
 188 extern void line_free(line_t *lp);
 189 extern char *s_strdup(char *);
 190 extern int is_sparc(void);
 191 
 192 #define BAM_MAXLINE     8192
 193 
 194 /* menu.lst comments created by bootadm */
 195 #define BAM_BOOTADM_HDR "---------- ADDED BY BOOTADM - DO NOT EDIT ----------"
 196 #define BAM_BOOTADM_FTR "---------------------END BOOTADM--------------------"
 197 
 198 /*
 199  * menu.lst comments create by Live Upgrade.  Note that these are the end of
 200  * the comment strings - there will be other text before them.
 201  */
 202 #define BAM_LU_HDR      " - ADDED BY LIVE UPGRADE - DO NOT EDIT  -----"
 203 #define BAM_LU_FTR      " -------------- END LIVE UPGRADE ------------"
 204 
 205 #define BAM_OLDDEF      "BOOTADM SAVED DEFAULT: "
 206 #define BAM_OLD_RC_DEF  "BOOTADM RC SAVED DEFAULT: "
 207 
 208 /*
 209  * menu.lst comment created by libbe
 210  */
 211 #define BAM_LIBBE_FTR   "============ End of LIBBE entry ============="
 212 
 213 /* Title used for failsafe entries */
 214 #define FAILSAFE_TITLE  "Solaris failsafe"
 215 
 216 /* Title used for hv entries */
 217 #define NEW_HV_ENTRY    "Solaris xVM"
 218 
 219 /* ZFS boot option */
 220 #define ZFS_BOOT        "-B $ZFS-BOOTFS"
 221 
 222 /* multiboot */
 223 #define MULTI_BOOT      "/platform/i86pc/multiboot"
 224 #define MULTI_BOOT_FAILSAFE     "/boot/multiboot"
 225 #define MULTI_BOOT_FAILSAFE_UNIX        "kernel/unix"
 226 #define MULTI_BOOT_FAILSAFE_LINE        "/boot/multiboot kernel/unix -s"
 227 
 228 /* directboot kernels */
 229 #define DIRECT_BOOT_32  "/platform/i86pc/kernel/unix"
 230 #define DIRECT_BOOT_64  "/platform/i86pc/kernel/amd64/unix"
 231 #define DIRECT_BOOT_KERNEL      "/platform/i86pc/kernel/$ISADIR/unix"
 232 #define DIRECT_BOOT_FAILSAFE_32 "/boot/platform/i86pc/kernel/unix"
 233 #define DIRECT_BOOT_FAILSAFE_64 "/boot/platform/i86pc/kernel/amd64/unix"
 234 #define DIRECT_BOOT_FAILSAFE_KERNEL \
 235         "/boot/platform/i86pc/kernel/$ISADIR/unix"
 236 #define DIRECT_BOOT_FAILSAFE_LINE       DIRECT_BOOT_FAILSAFE_KERNEL " -s"
 237 #define DIRECT_BOOT_KERNEL_ZFS  DIRECT_BOOT_KERNEL " " ZFS_BOOT
 238 #define DIRECT_BOOT_PREFIX      "/platform/i86pc/"
 239 #define KERNEL_PREFIX   "/platform/i86pc/"
 240 #define AMD_UNIX_SPACE  "/amd64/unix "
 241 #define UNIX_SPACE      "/unix "
 242 
 243 /* xVM kernels */
 244 #define XEN_KERNEL_SUBSTR "xen.gz"
 245 
 246 /* Boot archives */
 247 #define ARCHIVE_PREFIX          "/platform/"
 248 #define ARCHIVE_SUFFIX          "/boot_archive"
 249 #define CACHEDIR_SUFFIX         "/archive_cache"
 250 #define UPDATEDIR_SUFFIX        "/updates"
 251 #define DIRECT_BOOT_ARCHIVE     "/platform/i86pc/$ISADIR/boot_archive"
 252 #define DIRECT_BOOT_ARCHIVE_32  "/platform/i86pc/boot_archive"
 253 #define DIRECT_BOOT_ARCHIVE_64  "/platform/i86pc/amd64/boot_archive"
 254 #define MULTIBOOT_ARCHIVE       DIRECT_BOOT_ARCHIVE_32
 255 #define FAILSAFE_ARCHIVE        "/boot/$ISADIR/x86.miniroot-safe"
 256 #define FAILSAFE_ARCHIVE_32     "/boot/x86.miniroot-safe"
 257 #define FAILSAFE_ARCHIVE_64     "/boot/amd64/x86.miniroot-safe"
 258 #define CACHEDIR_32             "/platform/i86pc/archive_cache"
 259 #define CACHEDIR_64             "/platform/i86pc/amd64/archive_cache"
 260 #define UPDATEDIR_32            "/platform/i86pc/updates"
 261 #define UPDATEDIR_64            "/platform/i86pc/amd64/updates"
 262 
 263 /* Hypervisors */
 264 #define XEN_64                  "/boot/amd64/xen.gz"
 265 #define XEN_MENU                "/boot/$ISADIR/xen.gz"
 266 #define HYPERVISOR_KERNEL       "/platform/i86xpv/kernel/$ISADIR/unix"
 267 #define XEN_KERNEL_MODULE_LINE  HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL
 268 #define XEN_KERNEL_MODULE_LINE_ZFS      \
 269         HYPERVISOR_KERNEL " " HYPERVISOR_KERNEL " " ZFS_BOOT
 270 
 271 /* Helpers */
 272 #define MKISOFS_PATH            "/usr/bin/mkisofs"
 273 #define DD_PATH_USR             "/usr/bin/dd"
 274 #define LOCKFS_PATH             "/usr/sbin/lockfs"
 275 
 276 /* A first guess at the number of entries in a menu */
 277 #define BAM_ENTRY_NUM           10
 278 
 279 /* toggle for whether delete_boot_entry prints an error message or not */
 280 #define DBE_PRINTERR            0
 281 #define DBE_QUIET               1
 282 
 283 /*
 284  * Debugging defines
 285  */
 286 #define INJECT_ERROR1(x, y)     \
 287 { \
 288         if (bam_debug) { \
 289                 char *inj = getenv("_BOOTADM_INJECT"); \
 290                 if (inj && strcmp(inj, (x)) == 0) {  \
 291                         y;      \
 292                 } \
 293         } \
 294 }
 295 
 296 #define INJECT_ERROR2(x, y, z)  \
 297 { \
 298         if (bam_debug) { \
 299                 char *inj = getenv("_BOOTADM_INJECT"); \
 300                 if (inj && strcmp(inj, (x)) == 0) {  \
 301                         y;      \
 302                         z;      \
 303                 } \
 304         } \
 305 }
 306 
 307 #define BAM_DPRINTF(x)  {if (bam_debug)  bam_derror x; }
 308 
 309 #ifdef __cplusplus
 310 }
 311 #endif
 312 
 313 #endif  /* _BOOTADM_H */