Print this page
libbe patch

@@ -459,15 +459,15 @@
 
         while (fgets(line, BUFSIZ, menu_fp)) {
                 char *tok = NULL;
 
                 (void) strlcpy(temp_line, line, BUFSIZ);
-                tok = strtok(line, BE_WHITE_SPACE);
+                tok = strtok(line, "=\n");
 
                 if (tok == NULL || tok[0] == '#') {
                         continue;
-                } else if (strcmp(tok, "title") == 0) {
+                } else if (strcmp(tok, "entry_name") == 0) {
                         collect_lines = B_FALSE;
                         if ((tok = strtok(NULL, "\n")) == NULL)
                                 (void) strlcpy(title, "", sizeof (title));
                         else
                                 (void) strlcpy(title, tok, sizeof (title));

@@ -478,11 +478,11 @@
                                         free(tmp_entries[i]);
                                         tmp_entries[i] = NULL;
                                 }
                                 num_tmp_lines = 0;
                         }
-                } else if (strcmp(tok, "bootfs") == 0) {
+                } else if (strcmp(tok, "data_set") == 0) {
                         char *bootfs = strtok(NULL, BE_WHITE_SPACE);
                         found_title = B_FALSE;
                         if (bootfs == NULL)
                                 continue;
 

@@ -498,11 +498,11 @@
                                 found_orig_be = B_TRUE;
                                 num_lines = 0;
                                 /*
                                  * Store the new title line
                                  */
-                                (void) snprintf(str, BUFSIZ, "title %s\n",
+                                (void) snprintf(str, BUFSIZ, "entry_name=%s\n",
                                     description ? description : be_name);
                                 entries[num_lines] = strdup(str);
                                 num_lines++;
                                 /*
                                  * If there are any lines between the title

@@ -512,15 +512,35 @@
                                 for (i = 0; i < num_tmp_lines; i++) {
                                         entries[num_lines] = tmp_entries[i];
                                         tmp_entries[i] = NULL;
                                         num_lines++;
                                 }
-                                num_tmp_lines = 0;
+
+                                zprop_get_cbdata_t cb = { 0 };
+                                zprop_source_t src;
+                                char * bc = strchr(be_root_ds, '/');
+                                char sguid[] = "guid";
+
+                                *bc = '\0';
+                                cb.cb_first = B_TRUE;
+                                cb.cb_sources = ZPROP_SRC_ALL;
+                                cb.cb_type = ZFS_TYPE_POOL;
+                                zprop_get_list(g_zfs, sguid, &cb.cb_proplist, ZFS_TYPE_POOL);
+                                zpool_handle_t * z_hndl = zpool_open(g_zfs, be_root_ds);
+                                *bc = '/';
+                                if (z_hndl) {
+                                        uint64_t guid = zpool_get_prop_int(z_hndl, cb.cb_proplist->pl_prop, &src);
+                                        (void) snprintf(str, BUFSIZ, "pool_uuid=%llx\n", guid);
+                                        entries[num_lines] = strdup(str);
+                                        num_lines++;
+                                        zpool_close(z_hndl);
+                                }
+num_tmp_lines = 0;
                                 /*
                                  * Store the new bootfs line.
                                  */
-                                (void) snprintf(str, BUFSIZ, "bootfs %s\n",
+                                (void) snprintf(str, BUFSIZ, "data_set=%s\n",
                                     be_root_ds);
                                 entries[num_lines] = strdup(str);
                                 num_lines++;
                                 collect_lines = B_TRUE;
                         }

@@ -534,10 +554,23 @@
                                 continue;
                         if (strcmp(tok, "splashimage") == 0) {
                                 entries[num_lines] =
                                     strdup("splashimage "
                                     "/boot/splashimage.xpm\n");
+                        } else if ((strcmp(tok, "kernel_path") == 0) || 
+                                (strcmp(tok, "module") == 0)) 
+                        {
+                                char * path;
+                                char * st_path;
+                                
+                                st_path = strtok(NULL, "\n");
+                                path = (char *) malloc(512);
+                                strcpy(path, tok);
+                                strcat(path, "=");
+                                strcat(path, st_path);
+                                strcat(path, "\n");
+                                entries[num_lines] = path;
                         } else {
                                 entries[num_lines] = strdup(temp_line);
                         }
                         num_lines++;
                 } else if (found_title && !found_orig_be) {

@@ -596,22 +629,40 @@
                  */
                 if (be_has_grub())
                         (void) fprintf(menu_fp, "%s\n", BE_GRUB_COMMENT);
                 ret = BE_SUCCESS;
         } else {
-                (void) fprintf(menu_fp, "title %s\n",
+                zprop_get_cbdata_t cb = { 0 };
+                zprop_source_t src;
+                char * bc = strchr(be_root_ds, '/');
+                char sguid[] = "guid";
+
+                (void) fprintf(menu_fp, "entry_name=%s\n",
                     description ? description : be_name);
-                (void) fprintf(menu_fp, "bootfs %s\n", be_root_ds);
+                *bc = '\0';
+                cb.cb_first = B_TRUE;
+                cb.cb_sources = ZPROP_SRC_ALL;
+                cb.cb_type = ZFS_TYPE_POOL;
+                zprop_get_list(g_zfs, sguid, &cb.cb_proplist, ZFS_TYPE_POOL);
+                zpool_handle_t * z_hndl = zpool_open(g_zfs, be_root_ds);
+                *bc = '/';
+                if (z_hndl) {
+                        uint64_t guid = zpool_get_prop_int(z_hndl, cb.cb_proplist->pl_prop, &src);
+                        (void) fprintf(menu_fp, "pool_uuid=%llx\n", guid);
+                        zpool_close(z_hndl);
+                }
+                (void) fprintf(menu_fp, "data_set=%s\n", be_root_ds);
 
                 /*
                  * Check to see if this system supports grub
                  */
                 if (be_has_grub()) {
-                        (void) fprintf(menu_fp, "kernel$ "
-                            "/platform/i86pc/kernel/$ISADIR/unix -B "
-                            "$ZFS-BOOTFS\n");
-                        (void) fprintf(menu_fp, "module$ "
+                        (void) fprintf(menu_fp, "kernel_path="
+                            "/platform/i86pc/kernel/$ISADIR/unix\n");
+                        (void) fprintf(menu_fp, "kernel_options="
+                            "-B $ZFS_BOOTFS,console=graphic\n");
+                        (void) fprintf(menu_fp, "module="
                             "/platform/i86pc/$ISADIR/boot_archive\n");
                         (void) fprintf(menu_fp, "%s\n", BE_GRUB_COMMENT);
                 }
                 ret = BE_SUCCESS;
         }

@@ -787,11 +838,11 @@
                 char *tok = NULL;
 
                 (void) strlcpy(tline, menu_buf, sizeof (tline));
 
                 /* Tokenize line */
-                tok = strtok(tline, BE_WHITE_SPACE);
+                tok = strtok(tline, "=\n");
 
                 if (tok == NULL || tok[0] == '#') {
                         /* Found empty line or comment line */
                         if (do_buffer) {
                                 /* Buffer this line */

@@ -809,11 +860,11 @@
                         } else if (write || strncmp(menu_buf, BE_GRUB_COMMENT,
                             strlen(BE_GRUB_COMMENT)) != 0) {
                                 /* Write this line out */
                                 (void) fputs(menu_buf, tmp_menu_fp);
                         }
-                } else if (strcmp(tok, "default") == 0) {
+                } else if (strcmp(tok, "default_entry") == 0) {
                         /*
                          * Record what 'default' is set to because we might
                          * need to adjust this upon deleting an entry.
                          */
                         tok = strtok(NULL, BE_WHITE_SPACE);

@@ -821,11 +872,11 @@
                         if (tok != NULL) {
                                 default_entry = atoi(tok);
                         }
 
                         (void) fputs(menu_buf, tmp_menu_fp);
-                } else if (strcmp(tok, "title") == 0) {
+                } else if (strcmp(tok, "entry_name") == 0) {
                         /*
                          * If we've reached a 'title' line and do_buffer is
                          * is true, that means we've just buffered an entire
                          * entry without finding a 'bootfs' directive.  We
                          * need to write that entry out and keep searching.

@@ -857,11 +908,11 @@
                         if ((buffer[nlines++] = strdup(menu_buf)) == NULL) {
                                 ret = BE_ERR_NOMEM;
                                 goto cleanup;
                         }
 
-                } else if (strcmp(tok, "bootfs") == 0) {
+                } else if (strcmp(tok, "data_set") == 0) {
                         char *bootfs = NULL;
 
                         /*
                          * Found a 'bootfs' line.  See if it matches the
                          * BE we're looking for.

@@ -1018,19 +1069,19 @@
                                 char *tok = NULL;
 
                                 (void) strlcpy(tline, menu_buf, sizeof (tline));
 
                                 /* Tokenize line */
-                                tok = strtok(tline, BE_WHITE_SPACE);
+                                tok = strtok(tline, "=\n");
 
                                 if (tok == NULL) {
                                         /* Found empty line, write it out */
                                         (void) fputs(menu_buf, tmp_menu_fp);
-                                } else if (strcmp(tok, "default") == 0) {
+                                } else if (strcmp(tok, "default_entry") == 0) {
                                         /* Found the default line, adjust it */
                                         (void) snprintf(tline, sizeof (tline),
-                                            "default %d\n", default_entry);
+                                            "default_entry=%d\n", default_entry);
 
                                         (void) fputs(tline, tmp_menu_fp);
                                 } else {
                                         /* Pass through all other lines */
                                         (void) fputs(menu_buf, tmp_menu_fp);

@@ -1185,28 +1236,28 @@
 
         free(pool_mntpnt);
         pool_mntpnt = NULL;
 
         while (fgets(line, BUFSIZ, menu_fp)) {
-                char *tok = strtok(line, BE_WHITE_SPACE);
+                char *tok = strtok(line, "=\n");
 
                 if (tok != NULL && tok[0] != '#') {
                         if (!found_default) {
-                                if (strcmp(tok, "default") == 0) {
+                                if (strcmp(tok, "default_entry") == 0) {
                                         tok = strtok(NULL, BE_WHITE_SPACE);
                                         if (tok != NULL) {
                                                 default_entry = atoi(tok);
                                                 rewind(menu_fp);
                                                 found_default = 1;
                                         }
                                 }
                                 continue;
                         }
-                        if (strcmp(tok, "title") == 0) {
+                        if (strcmp(tok, "entry_name") == 0) {
                                 entries++;
                         } else if (default_entry == entries - 1) {
-                                if (strcmp(tok, "bootfs") == 0) {
+                                if (strcmp(tok, "data_set") == 0) {
                                         tok = strtok(NULL, BE_WHITE_SPACE);
                                         (void) fclose(menu_fp);
 
                                         if (tok == NULL) {
                                                 ret = BE_SUCCESS;

@@ -1385,18 +1436,18 @@
                 ret = errno_to_be_err(err);
                 goto cleanup;
         }
 
         while (fgets(line, BUFSIZ, grub_fp)) {
-                char *tok = strtok(line, BE_WHITE_SPACE);
+                char *tok = strtok(line, "=\n");
 
                 if (tok == NULL || tok[0] == '#') {
                         continue;
-                } else if (strcmp(tok, "title") == 0) {
+                } else if (strcmp(tok, "entry_name") == 0) {
                         entries++;
                         continue;
-                } else if (strcmp(tok, "bootfs") == 0) {
+                } else if (strcmp(tok, "data_set") == 0) {
                         char *bootfs = strtok(NULL, BE_WHITE_SPACE);
                         if (bootfs == NULL)
                                 continue;
 
                         if (strcmp(bootfs, be_root_ds) == 0) {

@@ -1414,20 +1465,20 @@
                 goto cleanup;
         }
 
         rewind(grub_fp);
 
+        (void) snprintf(temp_line, BUFSIZ, "default_entry=%d\n",
+            entries - 1 >= 0 ? entries - 1 : 0);
+        (void) fputs(temp_line, temp_fp);
         while (fgets(line, BUFSIZ, grub_fp)) {
                 char *tok = NULL;
 
                 (void) strncpy(temp_line, line, BUFSIZ);
 
-                if ((tok = strtok(temp_line, BE_WHITE_SPACE)) != NULL &&
-                    strcmp(tok, "default") == 0) {
-                        (void) snprintf(temp_line, BUFSIZ, "default %d\n",
-                            entries - 1 >= 0 ? entries - 1 : 0);
-                        (void) fputs(temp_line, temp_fp);
+                if ((tok = strtok(temp_line, "=\n")) != NULL &&
+                    strcmp(tok, "default_entry") == 0) {
                 } else {
                         (void) fputs(line, temp_fp);
                 }
         }
 

@@ -1518,10 +1569,11 @@
         FILE *new_fp = NULL;
         struct stat sb;
         int temp_menu_len = 0;
         int tmp_fd;
         int ret = BE_SUCCESS;
+        int flag = 0;
         int err = 0;
         boolean_t pool_mounted = B_FALSE;
 
         errno = 0;
 

@@ -1634,26 +1686,27 @@
                 char *c = NULL;
 
                 (void) strlcpy(tline, line, sizeof (tline));
 
                 /* Tokenize line */
-                c = strtok(tline, BE_WHITE_SPACE);
+                c = strtok(tline, "=\n");
 
                 if (c == NULL) {
                         /* Found empty line, write it out. */
                         (void) fputs(line, new_fp);
                 } else if (c[0] == '#') {
                         /* Found a comment line, write it out. */
                         (void) fputs(line, new_fp);
-                } else if (strcmp(c, "title") == 0) {
+                } else if (strcmp(c, "entry_name") == 0) {
                         char *name = NULL;
                         char *desc = NULL;
 
                         /*
                          * Found a 'title' line, parse out BE name or
                          * the description.
                          */
+                        flag = 0;
                         name = strtok(NULL, BE_WHITE_SPACE);
 
                         if (name == NULL) {
                                 /*
                                  * Nothing after 'title', just push

@@ -1673,27 +1726,28 @@
                                          * the old BE name, replace it with
                                          * the new one, and write it out
                                          * along with the remainder of
                                          * description if there is one.
                                          */
+                                        ++flag;
                                         if (desc) {
                                                 (void) snprintf(new_line,
                                                     sizeof (new_line),
-                                                    "title %s %s\n",
+                                                    "entry_name=%s %s\n",
                                                     be_new_name, desc);
                                         } else {
                                                 (void) snprintf(new_line,
                                                     sizeof (new_line),
-                                                    "title %s\n", be_new_name);
+                                                    "entry_name=%s\n", be_new_name);
                                         }
 
                                         (void) fputs(new_line, new_fp);
                                 } else {
                                         (void) fputs(line, new_fp);
                                 }
                         }
-                } else if (strcmp(c, "bootfs") == 0) {
+                } else if (strcmp(c, "data_set") == 0) {
                         /*
                          * Found a 'bootfs' line, parse out the BE root
                          * dataset value.
                          */
                         char *root_ds = strtok(NULL, BE_WHITE_SPACE);

@@ -1708,12 +1762,13 @@
                                 /*
                                  * If this bootfs is the one we're renaming,
                                  * write out the new root dataset value
                                  */
                                 if (strcmp(root_ds, be_root_ds) == 0) {
+                                        ++flag;
                                         (void) snprintf(new_line,
-                                            sizeof (new_line), "bootfs %s\n",
+                                            sizeof (new_line), "data_set=%s\n",
                                             be_new_root_ds);
 
                                         (void) fputs(new_line, new_fp);
                                 } else {
                                         (void) fputs(line, new_fp);

@@ -1851,14 +1906,14 @@
 
         free(rpool_mntpnt);
         rpool_mntpnt = NULL;
 
         while (fgets(line, BUFSIZ, menu_fp)) {
-                char *tok = strtok_r(line, BE_WHITE_SPACE, &last);
+                char *tok = strtok_r(line, "=\n", &last);
 
                 if (tok != NULL && tok[0] != '#') {
-                        if (strcmp(tok, "bootfs") == 0) {
+                        if (strcmp(tok, "data_set") == 0) {
                                 tok = strtok_r(last, BE_WHITE_SPACE, &last);
                                 if (tok != NULL && strcmp(tok,
                                     be_dataset) == 0) {
                                         (void) fclose(menu_fp);
                                         /*

@@ -1871,11 +1926,11 @@
                                          */
                                         *entry = ent_num - 1;
                                         ret = B_TRUE;
                                         goto cleanup;
                                 }
-                        } else if (strcmp(tok, "title") == 0)
+                        } else if (strcmp(tok, "entry_name") == 0)
                                 ent_num++;
                 }
         }
 
 cleanup:

@@ -3637,26 +3692,26 @@
                          * GRUB splash screen will not be enabled.
                          */
                         if (strncmp(console, "text", strlen("text")) == 0 ||
                             strncmp(console, "graphics",
                             strlen("graphics")) == 0) {
-
+/*
                                 (void) fprintf(temp_fp, "%s\n", BE_GRUB_SPLASH);
                                 (void) fprintf(temp_fp, "%s\n",
                                     BE_GRUB_FOREGROUND);
                                 (void) fprintf(temp_fp, "%s\n",
                                     BE_GRUB_BACKGROUND);
                                 (void) fprintf(temp_fp, "%s\n",
-                                    BE_GRUB_DEFAULT);
+                                    BE_GRUB_DEFAULT);*/
                         } else {
                                 be_print_err(gettext("be_create_menu: "
                                     "console on serial line, "
                                     "GRUB splash image will be disabled\n"));
                         }
                 }
 
-                (void) fprintf(temp_fp, "timeout 30\n");
+                (void) fprintf(temp_fp, "timeout=30\n");
                 (void) fclose(temp_fp);
 
         } else {
                 /*
                  * The menu file doesn't exist so we need to create a