Print this page
libbe
ba_path->module + lost file

*** 459,473 **** while (fgets(line, BUFSIZ, menu_fp)) { char *tok = NULL; (void) strlcpy(temp_line, line, BUFSIZ); ! tok = strtok(line, BE_WHITE_SPACE); if (tok == NULL || tok[0] == '#') { continue; ! } else if (strcmp(tok, "title") == 0) { collect_lines = B_FALSE; if ((tok = strtok(NULL, "\n")) == NULL) (void) strlcpy(title, "", sizeof (title)); else (void) strlcpy(title, tok, sizeof (title)); --- 459,473 ---- while (fgets(line, BUFSIZ, menu_fp)) { char *tok = NULL; (void) strlcpy(temp_line, line, BUFSIZ); ! tok = strtok(line, "=\n"); if (tok == NULL || tok[0] == '#') { continue; ! } 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,488 **** free(tmp_entries[i]); tmp_entries[i] = NULL; } num_tmp_lines = 0; } ! } else if (strcmp(tok, "bootfs") == 0) { char *bootfs = strtok(NULL, BE_WHITE_SPACE); found_title = B_FALSE; if (bootfs == NULL) continue; --- 478,488 ---- free(tmp_entries[i]); tmp_entries[i] = NULL; } num_tmp_lines = 0; } ! } else if (strcmp(tok, "data_set") == 0) { char *bootfs = strtok(NULL, BE_WHITE_SPACE); found_title = B_FALSE; if (bootfs == NULL) continue;
*** 498,508 **** found_orig_be = B_TRUE; num_lines = 0; /* * Store the new title line */ ! (void) snprintf(str, BUFSIZ, "title %s\n", description ? description : be_name); entries[num_lines] = strdup(str); num_lines++; /* * If there are any lines between the title --- 498,508 ---- found_orig_be = B_TRUE; num_lines = 0; /* * Store the new title line */ ! (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,526 **** for (i = 0; i < num_tmp_lines; i++) { entries[num_lines] = tmp_entries[i]; tmp_entries[i] = NULL; num_lines++; } ! num_tmp_lines = 0; /* * Store the new bootfs line. */ ! (void) snprintf(str, BUFSIZ, "bootfs %s\n", be_root_ds); entries[num_lines] = strdup(str); num_lines++; collect_lines = B_TRUE; } --- 512,546 ---- for (i = 0; i < num_tmp_lines; i++) { entries[num_lines] = tmp_entries[i]; tmp_entries[i] = NULL; num_lines++; } ! ! 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, "data_set=%s\n", be_root_ds); entries[num_lines] = strdup(str); num_lines++; collect_lines = B_TRUE; }
*** 534,543 **** --- 554,576 ---- 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,617 **** */ if (be_has_grub()) (void) fprintf(menu_fp, "%s\n", BE_GRUB_COMMENT); ret = BE_SUCCESS; } else { ! (void) fprintf(menu_fp, "title %s\n", description ? description : be_name); ! (void) fprintf(menu_fp, "bootfs %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$ " "/platform/i86pc/$ISADIR/boot_archive\n"); (void) fprintf(menu_fp, "%s\n", BE_GRUB_COMMENT); } ret = BE_SUCCESS; } --- 629,668 ---- */ if (be_has_grub()) (void) fprintf(menu_fp, "%s\n", BE_GRUB_COMMENT); ret = BE_SUCCESS; } else { ! 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); ! *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_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,797 **** char *tok = NULL; (void) strlcpy(tline, menu_buf, sizeof (tline)); /* Tokenize line */ ! tok = strtok(tline, BE_WHITE_SPACE); if (tok == NULL || tok[0] == '#') { /* Found empty line or comment line */ if (do_buffer) { /* Buffer this line */ --- 838,848 ---- char *tok = NULL; (void) strlcpy(tline, menu_buf, sizeof (tline)); /* Tokenize line */ ! tok = strtok(tline, "=\n"); if (tok == NULL || tok[0] == '#') { /* Found empty line or comment line */ if (do_buffer) { /* Buffer this line */
*** 809,819 **** } 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) { /* * Record what 'default' is set to because we might * need to adjust this upon deleting an entry. */ tok = strtok(NULL, BE_WHITE_SPACE); --- 860,870 ---- } 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_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,831 **** if (tok != NULL) { default_entry = atoi(tok); } (void) fputs(menu_buf, tmp_menu_fp); ! } else if (strcmp(tok, "title") == 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. --- 872,882 ---- if (tok != NULL) { default_entry = atoi(tok); } (void) fputs(menu_buf, tmp_menu_fp); ! } 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,867 **** if ((buffer[nlines++] = strdup(menu_buf)) == NULL) { ret = BE_ERR_NOMEM; goto cleanup; } ! } else if (strcmp(tok, "bootfs") == 0) { char *bootfs = NULL; /* * Found a 'bootfs' line. See if it matches the * BE we're looking for. --- 908,918 ---- if ((buffer[nlines++] = strdup(menu_buf)) == NULL) { ret = BE_ERR_NOMEM; goto cleanup; } ! } 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,1036 **** char *tok = NULL; (void) strlcpy(tline, menu_buf, sizeof (tline)); /* Tokenize line */ ! tok = strtok(tline, BE_WHITE_SPACE); if (tok == NULL) { /* Found empty line, write it out */ (void) fputs(menu_buf, tmp_menu_fp); ! } else if (strcmp(tok, "default") == 0) { /* Found the default line, adjust it */ (void) snprintf(tline, sizeof (tline), ! "default %d\n", default_entry); (void) fputs(tline, tmp_menu_fp); } else { /* Pass through all other lines */ (void) fputs(menu_buf, tmp_menu_fp); --- 1069,1087 ---- char *tok = NULL; (void) strlcpy(tline, menu_buf, sizeof (tline)); /* Tokenize line */ ! 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_entry") == 0) { /* Found the default line, adjust it */ (void) snprintf(tline, sizeof (tline), ! "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,1212 **** free(pool_mntpnt); pool_mntpnt = NULL; while (fgets(line, BUFSIZ, menu_fp)) { ! char *tok = strtok(line, BE_WHITE_SPACE); if (tok != NULL && tok[0] != '#') { if (!found_default) { ! if (strcmp(tok, "default") == 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) { entries++; } else if (default_entry == entries - 1) { ! if (strcmp(tok, "bootfs") == 0) { tok = strtok(NULL, BE_WHITE_SPACE); (void) fclose(menu_fp); if (tok == NULL) { ret = BE_SUCCESS; --- 1236,1263 ---- free(pool_mntpnt); pool_mntpnt = NULL; while (fgets(line, BUFSIZ, menu_fp)) { ! char *tok = strtok(line, "=\n"); if (tok != NULL && tok[0] != '#') { if (!found_default) { ! 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, "entry_name") == 0) { entries++; } else if (default_entry == entries - 1) { ! if (strcmp(tok, "data_set") == 0) { tok = strtok(NULL, BE_WHITE_SPACE); (void) fclose(menu_fp); if (tok == NULL) { ret = BE_SUCCESS;
*** 1385,1402 **** ret = errno_to_be_err(err); goto cleanup; } while (fgets(line, BUFSIZ, grub_fp)) { ! char *tok = strtok(line, BE_WHITE_SPACE); if (tok == NULL || tok[0] == '#') { continue; ! } else if (strcmp(tok, "title") == 0) { entries++; continue; ! } else if (strcmp(tok, "bootfs") == 0) { char *bootfs = strtok(NULL, BE_WHITE_SPACE); if (bootfs == NULL) continue; if (strcmp(bootfs, be_root_ds) == 0) { --- 1436,1453 ---- ret = errno_to_be_err(err); goto cleanup; } while (fgets(line, BUFSIZ, grub_fp)) { ! char *tok = strtok(line, "=\n"); if (tok == NULL || tok[0] == '#') { continue; ! } else if (strcmp(tok, "entry_name") == 0) { entries++; continue; ! } 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,1433 **** goto cleanup; } rewind(grub_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); } else { (void) fputs(line, temp_fp); } } --- 1465,1484 ---- 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, "=\n")) != NULL && ! strcmp(tok, "default_entry") == 0) { } else { (void) fputs(line, temp_fp); } }
*** 1518,1527 **** --- 1569,1579 ---- 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,1659 **** char *c = NULL; (void) strlcpy(tline, line, sizeof (tline)); /* Tokenize line */ ! c = strtok(tline, BE_WHITE_SPACE); 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) { char *name = NULL; char *desc = NULL; /* * Found a 'title' line, parse out BE name or * the description. */ name = strtok(NULL, BE_WHITE_SPACE); if (name == NULL) { /* * Nothing after 'title', just push --- 1686,1712 ---- char *c = NULL; (void) strlcpy(tline, line, sizeof (tline)); /* Tokenize line */ ! 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, "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,1699 **** * the old BE name, replace it with * the new one, and write it out * along with the remainder of * description if there is one. */ if (desc) { (void) snprintf(new_line, sizeof (new_line), ! "title %s %s\n", be_new_name, desc); } else { (void) snprintf(new_line, sizeof (new_line), ! "title %s\n", be_new_name); } (void) fputs(new_line, new_fp); } else { (void) fputs(line, new_fp); } } ! } else if (strcmp(c, "bootfs") == 0) { /* * Found a 'bootfs' line, parse out the BE root * dataset value. */ char *root_ds = strtok(NULL, BE_WHITE_SPACE); --- 1726,1753 ---- * 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), ! "entry_name=%s %s\n", be_new_name, desc); } else { (void) snprintf(new_line, sizeof (new_line), ! "entry_name=%s\n", be_new_name); } (void) fputs(new_line, new_fp); } else { (void) fputs(line, new_fp); } } ! } 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,1719 **** /* * If this bootfs is the one we're renaming, * write out the new root dataset value */ if (strcmp(root_ds, be_root_ds) == 0) { (void) snprintf(new_line, ! sizeof (new_line), "bootfs %s\n", be_new_root_ds); (void) fputs(new_line, new_fp); } else { (void) fputs(line, new_fp); --- 1762,1774 ---- /* * 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), "data_set=%s\n", be_new_root_ds); (void) fputs(new_line, new_fp); } else { (void) fputs(line, new_fp);
*** 1851,1864 **** free(rpool_mntpnt); rpool_mntpnt = NULL; while (fgets(line, BUFSIZ, menu_fp)) { ! char *tok = strtok_r(line, BE_WHITE_SPACE, &last); if (tok != NULL && tok[0] != '#') { ! if (strcmp(tok, "bootfs") == 0) { tok = strtok_r(last, BE_WHITE_SPACE, &last); if (tok != NULL && strcmp(tok, be_dataset) == 0) { (void) fclose(menu_fp); /* --- 1906,1919 ---- free(rpool_mntpnt); rpool_mntpnt = NULL; while (fgets(line, BUFSIZ, menu_fp)) { ! char *tok = strtok_r(line, "=\n", &last); if (tok != NULL && tok[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,1881 **** */ *entry = ent_num - 1; ret = B_TRUE; goto cleanup; } ! } else if (strcmp(tok, "title") == 0) ent_num++; } } cleanup: --- 1926,1936 ---- */ *entry = ent_num - 1; ret = B_TRUE; goto cleanup; } ! } else if (strcmp(tok, "entry_name") == 0) ent_num++; } } cleanup:
*** 3637,3662 **** * 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); } 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) fclose(temp_fp); } else { /* * The menu file doesn't exist so we need to create a --- 3692,3717 ---- * 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);*/ } 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) fclose(temp_fp); } else { /* * The menu file doesn't exist so we need to create a