First try to bring evbarm installation closer to current reality.

This commit is contained in:
martin 2020-01-20 21:26:35 +00:00
parent ddd8630944
commit 249ed7a6e5
9 changed files with 357 additions and 124 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: README.md_defs,v 1.3 2019/12/10 06:25:50 isaki Exp $ */
/* $NetBSD: README.md_defs,v 1.4 2020/01/20 21:26:35 martin Exp $ */
The following is trying to document the most important machine dependent
defines used in the sysinst code.
@ -71,6 +71,24 @@ used like:
returns true if this setup needs boot blocks. Used for example on x86
when UEFI installs do not need any bootblocks, but BIOS ones do.
MD_MAY_SWAP_TO may be undefined
used like:
bool MD_MAY_SWAP_TO(const char *disk_name)
returns true if the disk is usable as a swap device. Typical implementation
in utils.c:may_swap_if_not_sdmmc.
MD_SET_EXTRACT_FINALIZE may be undefined
used like:
int MD_SET_EXTRACT_FINALIZE(int update)
extracts any additional parts of the distribution. Returns an error code
if something fails.
HAVE_PLAIN_DISKLABEL_BOOT may be undefined, only used on architectures
that have MBR as primary with disklabel as
@ -90,3 +108,9 @@ If defined, do not verify the presence of on-disk disklabels before
offering the disklabel partitioning scheme. This allows ports to use
kernel translation for the disklabel ioctls (e.g. x68k uses Human68k
partitions this way).
HAVE_GPT_BOOT defined if the architecture can boot from GPT
NO_DISKLABEL_BOOT defined if the architecture can NOT boot
from a disklabel partitioned disk

View File

@ -1,4 +1,4 @@
/* $NetBSD: md.c,v 1.12 2020/01/09 17:06:46 martin Exp $ */
/* $NetBSD: md.c,v 1.13 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -81,8 +81,13 @@ md_init(void)
void
md_init_set_status(int flags)
{
if (boardtype == BOARD_TYPE_RPI)
set_kernel_set(SET_KERNEL_RPI);
/*
* we will extract kernel variants and DTB files piecwise
* manually later, just fetch the kernel set, do not
* unpack it.
*/
set_noextract_set(SET_KERNEL_1);
}
bool
@ -111,10 +116,7 @@ md_get_info(struct install_partition_desc *install)
pm->dlsize = ps->size_limit;
}
if (boardtype == BOARD_TYPE_RPI)
return set_bios_geom_with_mbr_guess(pm->parts);
return true;
return edit_outer_parts(pm->parts);
}
/*
@ -134,16 +136,13 @@ md_check_partitions(struct install_partition_desc *install)
{
size_t i;
if (boardtype == BOARD_TYPE_NORMAL)
return true;
if (boardtype == BOARD_TYPE_RPI) {
for (i = 0; i < install->num; i++)
if (install->infos[i].fs_type == FS_MSDOS)
return true;
for (i = 0; i < install->num; i++)
if (install->infos[i].fs_type == FS_MSDOS)
return true;
msg_display(MSG_nomsdospart);
process_menu(MENU_ok, NULL);
msg_display(MSG_nomsdospart);
process_menu(MENU_ok, NULL);
}
return false;
}
@ -195,13 +194,43 @@ md_post_newfs(struct install_partition_desc *install)
}
int
md_post_extract(struct install_partition_desc *install)
evbarm_extract_finalize(int update)
{
distinfo *dist;
char kernelbin[100];
int (*saved_fetch_fn)(const char *);
#ifdef _LP64
#define EFIBOOT "/usr/mdec/bootaa64.efi"
#else
#define EFIBOOT "/usr/mdec/bootarm.efi"
#endif
if (boardtype == BOARD_TYPE_NORMAL)
dist = get_set_distinfo(SET_KERNEL_1);
if (dist == NULL)
return 0;
saved_fetch_fn = fetch_fn;
extract_file_to(dist, false, "/", "./netbsd", false);
fetch_fn = NULL;
make_target_dir("/boot/EFI/boot");
if (target_file_exists_p(EFIBOOT))
cp_within_target(EFIBOOT, "/boot/EFI/boot", 0);
if (boardtype == BOARD_TYPE_ACPI) {
fetch_fn = saved_fetch_fn;
return 0;
}
if (boardtype == BOARD_TYPE_NORMAL) {
make_target_dir("/boot/dtb");
extract_file_to(dist, false, "/boot/dtb", "*.dt*", false);
extract_file_to(dist, false, "/boot", "./netbsd.ub", false);
fetch_fn = saved_fetch_fn;
return 0;
}
if (boardtype == BOARD_TYPE_RPI) {
extract_file_to(dist, false, "/boot", "./netbsd.img", false);
extract_file_to(dist, false, "/boot", "./bcm*.dtb", false);
fetch_fn = saved_fetch_fn;
snprintf(kernelbin, 100, "%s/netbsd.img", targetroot_mnt);
if (file_exists_p(kernelbin)) {
run_program(RUN_DISPLAY,
@ -212,6 +241,14 @@ md_post_extract(struct install_partition_desc *install)
return 1;
}
}
fetch_fn = saved_fetch_fn;
return 0;
}
int
md_post_extract(struct install_partition_desc *install)
{
return 0;
}
@ -252,86 +289,36 @@ md_check_mbr(struct disk_partitions *parts, mbr_info_t *mbri, bool quiet)
struct mbr_partition *part;
int i, hasboot=0;
if (boardtype == BOARD_TYPE_NORMAL)
return 2;
/* raspi code */
if (boardtype == BOARD_TYPE_RPI) {
for (ext = mbri; ext; ext = ext->extended) {
part = ext->mbr.mbr_parts;
for (i=0, hasboot=0; i < MBR_PART_COUNT; part++, i++) {
if (part->mbrp_type != MBR_PTYPE_FAT16L &&
part->mbrp_type != MBR_PTYPE_FAT32L)
continue;
hasboot = 1;
break;
}
}
if (!hasboot) {
if (quiet)
return 2;
msg_display(MSG_nomsdospart);
return ask_reedit(parts);
for (ext = mbri; ext; ext = ext->extended) {
part = ext->mbr.mbr_parts;
for (i=0, hasboot=0; i < MBR_PART_COUNT; part++, i++) {
if (part->mbrp_type != MBR_PTYPE_FAT16L &&
part->mbrp_type != MBR_PTYPE_FAT32L)
continue;
hasboot = 1;
break;
}
}
if (!hasboot) {
if (quiet)
return 2;
msg_display(MSG_nomsdospart);
return ask_reedit(parts);
}
return 2;
}
bool
md_parts_use_wholedisk(struct disk_partitions *parts)
{
part_id nbsd, boot;
struct disk_part_info info;
daddr_t offset;
struct disk_part_info boot_part = {
.size = boardtype == BOARD_TYPE_NORMAL ?
PART_BOOT_LARGE/512 : PART_BOOT/512,
.fs_type = PART_BOOT_TYPE, .fs_sub_type = MBR_PTYPE_FAT16L,
};
/*
* XXX - set (U)EFI install depending on boardtype
*/
if (boardtype == BOARD_TYPE_NORMAL) {
/* this keeps it from creating /boot as msdos */
pm->bootsize = 0;
return parts_use_wholedisk(parts, 0, NULL);
}
/* raspi code */
if (boardtype == BOARD_TYPE_RPI) {
for (boot = 0; boot < parts->num_part; boot++) {
if (!parts->pscheme->get_part_info(parts, boot, &info))
continue;
if (info.nat_type == NULL)
continue;
if (info.nat_type->generic_ptype == PT_FAT)
break;
}
if (boot >= parts->num_part) {
/* It's hopelessly corrupt, punt for now */
msg_display(MSG_nomsdospart);
process_menu(MENU_ok, NULL);
return false;
}
pm->bootstart = info.start;
pm->bootsize = info.size;
offset = info.start + info.size + 1;
memset(&info, 0, sizeof info);
info.start = offset;
info.size = parts->pscheme->max_free_space_at(parts, offset);
info.nat_type = parts->pscheme->get_generic_part_type(PT_root);
info.fs_type = FS_BSDFFS;
info.fs_sub_type = 2;
nbsd = parts->pscheme->add_partition(parts, &info, NULL);
if (nbsd == NO_PART)
return false;
parts->pscheme->get_part_info(parts, nbsd, &info);
pm->ptstart = info.start;
pm->ptsize = info.size;
return true;
}
return parts_use_wholedisk(parts, 0, NULL);
return parts_use_wholedisk(parts, 1, &boot_part);
}
/* returns false if no write-back of parts is required */
@ -353,3 +340,23 @@ md_gpt_post_write(struct disk_partitions *parts, part_id root_id,
return true;
}
#endif
void
evbarm_part_defaults(struct pm_devs *my_pm, struct part_usage_info *infos,
size_t num_usage_infos)
{
size_t i;
if (boardtype != BOARD_TYPE_NORMAL)
return;
for (i = 0; i < num_usage_infos; i++) {
if (infos[i].fs_type == PART_BOOT_TYPE &&
infos[i].mount != NULL &&
strcmp(infos[i].mount, PART_BOOT_MOUNT) == 0) {
infos[i].size = PART_BOOT_LARGE;
return;
}
}
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: md.h,v 1.4 2020/01/09 17:06:46 martin Exp $ */
/* $NetBSD: md.h,v 1.5 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -39,19 +39,30 @@
/* Constants and defines */
#define PART_BOOT (16*MEG)
#define PART_BOOT_LARGE (32*MEG)
#define PART_BOOT_TYPE FS_MSDOS
#define PART_BOOT_SUBT MBR_PTYPE_FAT16L
#define PART_BOOT_MOUNT "/boot"
/* Megs required for a full X installation. */
#define XNEEDMB 60
#define DEFSWAPSIZE (-1)
/* use UFS2 by default for ffs */
#define DEFAULT_UFS2
#define HAVE_UFS2_BOOT
/* allow using tmpfs for /tmp instead of mfs */
#define HAVE_TMPFS
/*
* Default filesets to fetch and install during installation
* or upgrade. The standard sets are:
* base etc comp games man misc rescue tests text xbase xcomp xetc xfont xserver
*/
#if 0 /* XXX */
#define SET_KERNEL_1_NAME "kern-ADI_BRH"
#define SET_KERNEL_2_NAME "kern-INTEGRATOR"
#define SET_KERNEL_3_NAME "kern-IQ80310"
@ -61,7 +72,13 @@
#define SET_KERNEL_7_NAME "kern-TS7200"
#define SET_KERNEL_8_NAME "kern-RPI"
#define SET_KERNEL_9_NAME "kern-KUROBOX_PRO"
#define SET_KERNEL_RPI SET_KERNEL_8
#endif
#ifdef _LP64
#define SET_KERNEL_1_NAME "kern-GENERIC64"
#else
#define SET_KERNEL_1_NAME "kern-GENERIC"
#endif
#define MD_SETS_SELECTED SET_SYSTEM
@ -87,3 +104,17 @@ int boardtype;
*/
#define MD_GPT_INITIAL_SIZE (8*1024)
#define HAVE_GPT_BOOT /* yes, u-boot can boot us from GPT */
#define NO_DISKLABEL_BOOT /* ... but not directly from disklabel */
#define MD_MAY_SWAP_TO(DISK) may_swap_if_not_sdmmc(DISK)
int evbarm_extract_finalize(int);
#define MD_SET_EXTRACT_FINALIZE(UP) evbarm_extract_finalize(UP)
void evbarm_part_defaults(struct pm_devs*, struct part_usage_info*,
size_t num_usage_infos);
#define MD_PART_DEFAULTS(A,B,C) evbarm_part_defaults(A,B,C)

View File

@ -1,4 +1,4 @@
/* $NetBSD: bsddisklabel.c,v 1.35 2020/01/16 16:47:19 martin Exp $ */
/* $NetBSD: bsddisklabel.c,v 1.36 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -949,10 +949,28 @@ fill_defaults(struct partition_usage_set *wanted, struct disk_partitions *parts,
for (i = 0; i < wanted->num; i++) {
wanted->infos[i].parts = parts;
wanted->infos[i].cur_part_id = NO_PART;
if (wanted->infos[i].type == PT_undef &&
wanted->infos[i].fs_type != FS_UNUSED) {
const struct part_type_desc *pt =
parts->pscheme->get_fs_part_type(PT_undef,
wanted->infos[i].fs_type,
wanted->infos[i].fs_version);
if (pt != NULL)
wanted->infos[i].type = pt->generic_ptype;
}
if (wanted->parts->parent != NULL &&
wanted->infos[i].fs_type == FS_MSDOS)
wanted->infos[i].flags |=
PUIFLG_ADD_INNER|PUIFLAG_ADD_OUTER;
#if DEFSWAPSIZE == -1
if (wanted->infos[i].type == PT_swap)
wanted->infos[i].size = get_ramsize() * (MEG / 512);
if (wanted->infos[i].type == PT_swap) {
#ifdef MD_MAY_SWAP_TO
if (MD_MAY_SWAP_TO(wanted->parts->disk))
#endif
wanted->infos[i].size =
get_ramsize() * (MEG / 512);
}
#endif
if (wanted->infos[i].type == PT_swap && swap > wanted->num)
swap = i;
@ -988,7 +1006,8 @@ fill_defaults(struct partition_usage_set *wanted, struct disk_partitions *parts,
* empty disk. Merge the partitions in target range that are already
* there (match with wanted) or are there additionaly.
* The only thing outside of target range that we care for
* is a potential swap partition - we assume one is enough.
* are FAT partitions and a potential swap partition - we assume one
* is enough.
*/
size_t num = wanted->num;
if (parts->parent) {
@ -998,7 +1017,8 @@ fill_defaults(struct partition_usage_set *wanted, struct disk_partitions *parts,
if (!parts->parent->pscheme->get_part_info(
parts->parent, pno, &info))
continue;
if (info.nat_type->generic_ptype != PT_swap)
if (info.nat_type->generic_ptype != PT_swap &&
info.fs_type != FS_MSDOS)
continue;
merge_part_with_wanted(parts->parent, pno, &info,
wanted, num, true);
@ -1297,16 +1317,16 @@ apply_settings_to_partitions(struct pm_devs *p, struct disk_partitions *parts,
if ((wanted->infos[i].flags & PUIFLAG_EXTEND) &&
exp_ndx == ~0U)
exp_ndx = i;
if (wanted->infos[i].flags &
(PUIFLG_JUST_MOUNTPOINT|PUIFLG_IS_OUTER))
if (wanted->infos[i].flags & PUIFLG_JUST_MOUNTPOINT)
continue;
nsp = wanted->infos[i].size;
if (wanted->infos[i].cur_part_id != NO_PART) {
ps = wanted->infos[i].flags & PUIFLG_IS_OUTER ?
parts->parent : parts;
if (ps->pscheme->get_part_info(ps,
wanted->infos[i].cur_part_id, &infos[i]))
ps->pscheme->get_part_info(ps,
wanted->infos[i].cur_part_id, &infos[i]);
if (!(wanted->infos[i].flags & PUIFLG_IS_OUTER))
nsp -= infos[i].size;
}
if (nsp > 0)
@ -1343,9 +1363,11 @@ apply_settings_to_partitions(struct pm_devs *p, struct disk_partitions *parts,
infos[i].start);
if (free_size < wanted->infos[i].size)
continue;
infos[i].size = wanted->infos[i].size;
ps->pscheme->set_part_info(ps, want->cur_part_id,
&infos[i], NULL);
if (infos[i].size != wanted->infos[i].size) {
infos[i].size = wanted->infos[i].size;
ps->pscheme->set_part_info(ps, want->cur_part_id,
&infos[i], NULL);
}
}
from = -1;
@ -1488,7 +1510,7 @@ apply_settings_to_partitions(struct pm_devs *p, struct disk_partitions *parts,
for (i = 0; i < wanted->num; i++) {
struct part_usage_info *want = &wanted->infos[i];
if (want->cur_part_id != NO_PART)
if (want->cur_part_id == NO_PART)
continue;
if (want->flags & PUIFLG_JUST_MOUNTPOINT)
continue;
@ -1522,6 +1544,13 @@ apply_settings_to_partitions(struct pm_devs *p, struct disk_partitions *parts,
wanted->parts->pscheme->get_part_info(
wanted->parts, new_part_id, &infos[i]);
want->parts = wanted->parts;
if (want->fs_type != FS_UNUSED &&
want->type != PT_swap) {
want->instflags |= PUIINST_NEWFS;
if (want->mount[0] != 0)
want->instflags |= PUIINST_MOUNT;
}
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: defs.h,v 1.51 2020/01/16 16:47:19 martin Exp $ */
/* $NetBSD: defs.h,v 1.52 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -789,6 +789,7 @@ int get_via_localdir(void);
void show_cur_distsets(void);
void make_ramdisk_dir(const char *);
void set_kernel_set(unsigned int);
void set_noextract_set(unsigned int);
unsigned int get_kernel_set(void);
unsigned int set_X11_selected(void);
int get_and_unpack_sets(int, msg, msg, msg);
@ -811,7 +812,10 @@ const char *set_dir_for_set(const char *);
const char *ext_dir_for_set(const char *);
void replace(const char *, const char *, ...) __printflike(2, 3);
void get_tz_default(void);
distinfo* get_set_distinfo(int);
int extract_file(distinfo *, int);
int extract_file_to(distinfo *dist, int update, const char *dest_dir,
const char *extr_pattern, bool do_stats);
void do_coloring (unsigned int, unsigned int);
int set_menu_select(menudesc *, void *);
const char *safectime(time_t *);
@ -823,6 +827,7 @@ void free_usage_set(struct partition_usage_set*);
bool install_desc_from_parts(struct install_partition_desc *,
struct disk_partitions*);
void free_install_desc(struct install_partition_desc*);
bool may_swap_if_not_sdmmc(const char*);
/* from target.c */
#if defined(DEBUG) || defined(DEBUG_ROOT)

View File

@ -1,4 +1,4 @@
/* $NetBSD: disklabel.c,v 1.30 2020/01/15 19:36:30 martin Exp $ */
/* $NetBSD: disklabel.c,v 1.31 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@ -123,6 +123,13 @@ disklabel_cylinder_size(const struct disk_partitions *arg)
return parts->l.d_secpercyl;
}
static bool
disklabel_non_bootable(const char *disk)
{
return false;
}
static struct disk_partitions *
disklabel_parts_new(const char *dev, daddr_t start, daddr_t len,
daddr_t total_size, bool is_boot_drive, struct disk_partitions *parent)
@ -1221,6 +1228,9 @@ disklabel_parts = {
.write_to_disk = disklabel_write_to_disk,
.read_from_disk = disklabel_parts_read,
.create_new_for_disk = disklabel_parts_new,
#ifdef NO_DISKLABEL_BOOT
.have_boot_support = disklabel_non_bootable,
#endif
.change_disk_geom = disklabel_change_geom,
.get_cylinder_size = disklabel_cylinder_size,
.find_by_name = disklabel_find_by_name,

View File

@ -1,4 +1,4 @@
/* $NetBSD: mbr.c,v 1.28 2020/01/18 18:39:55 martin Exp $ */
/* $NetBSD: mbr.c,v 1.29 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -1017,6 +1017,10 @@ mbr_map_part_type(unsigned int t)
switch (t) {
case MBR_PTYPE_FAT32:
case MBR_PTYPE_FAT32L:
case MBR_PTYPE_FAT16S:
case MBR_PTYPE_FAT16B:
case MBR_PTYPE_FAT16L:
case MBR_PTYPE_FAT12:
case MBR_PTYPE_FT_FAT32:
case MBR_PTYPE_FT_FAT32_EXT:
return PT_FAT;

View File

@ -1,4 +1,4 @@
/* $NetBSD: part_edit.c,v 1.14 2020/01/09 13:22:30 martin Exp $ */
/* $NetBSD: part_edit.c,v 1.15 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@ -973,6 +973,10 @@ parts_use_wholedisk(struct disk_partitions *parts,
1, info.size, align, -1, -1) != 1)
return false;
info.start = space.start;
if (info.nat_type == NULL)
info.nat_type = parts->pscheme->
get_fs_part_type(PT_undef, info.fs_type,
info.fs_sub_type);
if (parts->pscheme->add_partition(parts, &info, NULL)
== NO_PART)
return false;

View File

@ -1,4 +1,4 @@
/* $NetBSD: util.c,v 1.40 2019/11/16 21:25:14 martin Exp $ */
/* $NetBSD: util.c,v 1.41 2020/01/20 21:26:35 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@ -59,6 +59,9 @@
#include "defsizes.h"
#include "msg_defs.h"
#include "menu_defs.h"
#ifdef MD_MAY_SWAP_TO
#include <sys/drvctlio.h>
#endif
#define MAX_CD_DEVS 256 /* how many cd drives do we expect to attach */
#define ISO_BLKSIZE ISO_DEFAULT_BLOCK_SIZE
@ -71,6 +74,7 @@ static uint8_t set_status[SET_GROUP_END];
#define SET_SELECTED 0x02
#define SET_SKIPPED 0x04
#define SET_INSTALLED 0x08
#define SET_NO_EXTRACT 0x10
struct tarstats {
int nselected;
@ -721,6 +725,13 @@ set_kernel_set(unsigned int kernel_set)
set_status[kernel_set] |= SET_SELECTED;
}
void
set_noextract_set(unsigned int set)
{
set_status[set] |= SET_NO_EXTRACT;
}
static int
set_toggle(menudesc *menu, void *arg)
{
@ -906,6 +917,23 @@ customise_sets(void)
int
extract_file(distinfo *dist, int update)
{
const char *dest_dir = NULL;
if (update && (dist->set == SET_ETC || dist->set == SET_X11_ETC)) {
dest_dir = "/.sysinst";
make_target_dir(dest_dir);
} else if (dist->set == SET_PKGSRC)
dest_dir = "/usr";
else
dest_dir = "/";
return extract_file_to(dist, update, dest_dir, NULL, true);
}
int
extract_file_to(distinfo *dist, int update, const char *dest_dir,
const char *extr_pattern, bool do_stats)
{
char path[STRSIZE];
char *owd;
@ -942,7 +970,8 @@ extract_file(distinfo *dist, int update)
if (!file_exists_p(path)) {
#endif /* SUPPORT_8_3_SOURCE_FILESYSTEM */
tarstats.nnotfound++;
if (do_stats)
tarstats.nnotfound++;
char *err = str_arg_subst(msg_string(MSG_notarfile),
1, &dist->name);
@ -955,15 +984,10 @@ extract_file(distinfo *dist, int update)
}
#endif /* SUPPORT_8_3_SOURCE_FILESYSTEM */
tarstats.nfound++;
if (do_stats)
tarstats.nfound++;
/* cd to the target root. */
if (update && (dist->set == SET_ETC || dist->set == SET_X11_ETC)) {
make_target_dir("/.sysinst");
target_chdir_or_die("/.sysinst");
} else if (dist->set == SET_PKGSRC)
target_chdir_or_die("/usr");
else
target_chdir_or_die("/");
target_chdir_or_die(dest_dir);
/*
* /usr/X11R7/lib/X11/xkb/symbols/pc was a directory in 5.0
@ -974,16 +998,24 @@ extract_file(distinfo *dist, int update)
run_program(0, "rm -rf usr/X11R7/lib/X11/xkb/symbols/pc");
/* now extract set files into "./". */
rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
"progress -zf %s tar --chroot "
TAR_EXTRACT_FLAGS " -", path);
if (extr_pattern != NULL) {
rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
"progress -zf %s tar --chroot "
TAR_EXTRACT_FLAGS " - '%s'",
path, extr_pattern);
} else {
rval = run_program(RUN_DISPLAY | RUN_PROGRESS,
"progress -zf %s tar --chroot "
TAR_EXTRACT_FLAGS " -", path);
}
chdir(owd);
free(owd);
/* Check rval for errors and give warning. */
if (rval != 0) {
tarstats.nerror++;
if (do_stats)
tarstats.nerror++;
msg_fmt_display(MSG_tarerror, "%s", path);
hit_enter_to_continue(NULL, NULL);
return SET_RETRY;
@ -995,7 +1027,8 @@ extract_file(distinfo *dist, int update)
}
set_status[dist->set] |= SET_INSTALLED;
tarstats.nsuccess++;
if (do_stats)
tarstats.nsuccess++;
return SET_OK;
}
@ -1020,6 +1053,27 @@ skip_set(distinfo *dist, int skip_type)
}
}
distinfo*
get_set_distinfo(int opt)
{
distinfo *dist;
int set;
for (dist = dist_list; (set = dist->set) != SET_LAST; dist++) {
if (set != opt)
continue;
if (dist->name == NULL)
continue;
if ((set_status[set] & (SET_VALID | SET_SELECTED))
!= (SET_VALID | SET_SELECTED))
continue;
return dist;
}
return NULL;
}
/*
* Get and unpack the distribution.
* Show success_msg if installation completes.
@ -1047,6 +1101,8 @@ get_and_unpack_sets(int update, msg setupdone_msg, msg success_msg, msg failure_
for (dist = dist_list; (set = dist->set) != SET_LAST; dist++) {
if (dist->name == NULL)
continue;
if (set_status[set] & SET_NO_EXTRACT)
continue;
if ((set_status[set] & (SET_VALID | SET_SELECTED))
== (SET_VALID | SET_SELECTED))
tarstats.nselected++;
@ -1090,12 +1146,19 @@ get_and_unpack_sets(int update, msg setupdone_msg, msg success_msg, msg failure_
}
}
if (set_status[set] & SET_NO_EXTRACT)
continue;
/* Try to extract this set */
status = extract_file(dist, update);
if (status == SET_RETRY)
dist--;
}
#ifdef MD_SET_EXTRACT_FINALIZE
MD_SET_EXTRACT_FINALIZE(update);
#endif
if (tarstats.nerror == 0 && tarstats.nsuccess == tarstats.nselected) {
msg_display(MSG_endtarok);
/* Give user a chance to see the success message */
@ -2126,3 +2189,59 @@ free_install_desc(struct install_partition_desc *install)
free(install->infos);
}
#ifdef MD_MAY_SWAP_TO
bool
may_swap_if_not_sdmmc(const char *disk)
{
int fd, res;
prop_dictionary_t command_dict, args_dict, results_dict, data_dict;
prop_string_t string;
prop_number_t number;
const char *parent = "";
fd = open(DRVCTLDEV, O_RDONLY, 0);
if (fd == -1)
return true;
command_dict = prop_dictionary_create();
args_dict = prop_dictionary_create();
string = prop_string_create_cstring_nocopy("get-properties");
prop_dictionary_set(command_dict, "drvctl-command", string);
prop_object_release(string);
string = prop_string_create_cstring(disk);
prop_dictionary_set(args_dict, "device-name", string);
prop_object_release(string);
prop_dictionary_set(command_dict, "drvctl-arguments",
args_dict);
prop_object_release(args_dict);
res = prop_dictionary_sendrecv_ioctl(command_dict, fd,
DRVCTLCOMMAND, &results_dict);
prop_object_release(command_dict);
close(fd);
if (res)
return true;
number = prop_dictionary_get(results_dict, "drvctl-error");
if (prop_number_integer_value(number) == 0) {
data_dict = prop_dictionary_get(results_dict,
"drvctl-result-data");
if (data_dict != NULL) {
string = prop_dictionary_get(data_dict,
"device-parent");
if (string != NULL)
parent = prop_string_cstring_nocopy(string);
}
}
prop_object_release(results_dict);
if (parent == NULL)
return true;
return strncmp(parent, "sdmmc", 5) != 0;
}
#endif