Module Name:    src
Committed By:   martin
Date:           Tue Jul 23 18:13:40 UTC 2019

Modified Files:
        src/usr.sbin/sysinst: configmenu.c defs.h disks.c install.c msg.mi.de
            msg.mi.en msg.mi.es msg.mi.fr msg.mi.pl partman.c target.c
            upgrade.c

Log Message:
For upgrade / re-install allow the currently running system as a target
in the "disk" selection.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/usr.sbin/sysinst/configmenu.c
cvs rdiff -u -r1.40 -r1.41 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.39 -r1.40 src/usr.sbin/sysinst/disks.c \
    src/usr.sbin/sysinst/partman.c
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/sysinst/install.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/msg.mi.de
cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/sysinst/msg.mi.en
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/sysinst/msg.mi.es
cvs rdiff -u -r1.16 -r1.17 src/usr.sbin/sysinst/msg.mi.fr
cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/sysinst/msg.mi.pl
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/target.c
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/sysinst/upgrade.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/sysinst/configmenu.c
diff -u src/usr.sbin/sysinst/configmenu.c:1.9 src/usr.sbin/sysinst/configmenu.c:1.10
--- src/usr.sbin/sysinst/configmenu.c:1.9	Sat Jun 22 20:46:07 2019
+++ src/usr.sbin/sysinst/configmenu.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: configmenu.c,v 1.9 2019/06/22 20:46:07 christos Exp $ */
+/* $NetBSD: configmenu.c,v 1.10 2019/07/23 18:13:40 martin Exp $ */
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -446,7 +446,7 @@ do_configmenu(struct install_partition_d
 	/* if the target isn't mounted already, figure it out. */
 	if (install != NULL && target_mounted() == 0) {
 		partman_go = 0;
-		if (find_disks(msg_string(MSG_configure_prior)) < 0)
+		if (find_disks(msg_string(MSG_configure_prior), true) < 0)
 			return;
 
 		if (mount_disks(install) != 0)

Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.40 src/usr.sbin/sysinst/defs.h:1.41
--- src/usr.sbin/sysinst/defs.h:1.40	Tue Jul 23 16:02:32 2019
+++ src/usr.sbin/sysinst/defs.h	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.40 2019/07/23 16:02:32 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.41 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -324,6 +324,7 @@ struct single_part_fs_edit {
 struct install_partition_desc {
 	size_t num;				/* how many entries in infos */
 	struct part_usage_info *infos;		/* individual partitions */
+	bool cur_system;			/* target is the life system */
 };
 
 /* variables */
@@ -384,6 +385,12 @@ struct pm_devs {
 	 */
 	bool no_part;
 
+	/*
+	 * This is a pseudo-device representing the currently running
+	 * system (i.e. all mounted file systems).
+	 */
+	bool cur_system;
+
 	/* Actual values for current disk - set by find_disks() or
 	   md_get_info() */
 	int sectorsize, dlcyl, dlhead, dlsec, dlcylsize, current_cylsize;
@@ -592,7 +599,7 @@ void	toplevel(void);
 
 /* from disks.c */
 bool	get_default_cdrom(char *, size_t);
-int	find_disks(const char *);
+int	find_disks(const char *, bool);
 bool enumerate_disks(void *state,bool (*func)(void *state, const char *dev));
 bool is_cdrom_device(const char *dev, bool as_target);
 bool is_bootable_device(const char *dev);

Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.39 src/usr.sbin/sysinst/disks.c:1.40
--- src/usr.sbin/sysinst/disks.c:1.39	Tue Jul 23 15:23:14 2019
+++ src/usr.sbin/sysinst/disks.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: disks.c,v 1.39 2019/07/23 15:23:14 martin Exp $ */
+/*	$NetBSD: disks.c,v 1.40 2019/07/23 18:13:40 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -761,11 +761,32 @@ convert_scheme(struct pm_devs *p, bool i
 	return true;
 }
 
+static struct pm_devs *
+dummy_whole_system_pm(void)
+{
+	static struct pm_devs whole_system = {
+		.diskdev = "/",
+		.no_mbr = true,
+		.no_part = true,
+		.cur_system = true,
+	};
+	static bool init = false;
+
+	if (!init) {
+		strlcpy(whole_system.diskdev_descr,
+		    msg_string(MSG_running_system),
+		    sizeof whole_system.diskdev_descr);
+	}
+
+	return &whole_system;
+}
+
 int
-find_disks(const char *doingwhat)
+find_disks(const char *doingwhat, bool allow_cur_system)
 {
 	struct disk_desc disks[MAX_DISKS];
-	menu_ent dsk_menu[__arraycount(disks) + 1]; // + 1 for extended partitioning entry
+	/* need two more menu entries: current system + extended partitioning */
+	menu_ent dsk_menu[__arraycount(disks) + 2];
 	struct disk_desc *disk;
 	int i = 0, skipped = 0;
 	int already_found, numdisks, selected_disk = -1;
@@ -790,16 +811,23 @@ find_disks(const char *doingwhat)
 	 *                  all disks
 	 */
 	if (partman_go <= 0) {
-		if (numdisks == 0) {
+		if (numdisks == 0 && !allow_cur_system) {
 			/* No disks found! */
 			hit_enter_to_continue(MSG_nodisk, NULL);
 			/*endwin();*/
 			return -1;
 		} else {
-			/* One or more disks found! */
-			for (i = 0; i < numdisks; i++) {
+			/* One or more disks found or current system allowed */
+			i = 0;
+			if (allow_cur_system) {
+				dsk_menu[i].opt_name = MSG_running_system;
+				dsk_menu[i].opt_flags = OPT_EXIT;
+				dsk_menu[i].opt_action = set_menu_select;
+				i++;
+			}
+			for (; i < numdisks; i++) {
 				dsk_menu[i].opt_name =
-				    disks[i].dd_descr;
+				    disks[i-allow_cur_system].dd_descr;
 				dsk_menu[i].opt_flags = OPT_EXIT;
 				dsk_menu[i].opt_action = set_menu_select;
 			}
@@ -807,10 +835,10 @@ find_disks(const char *doingwhat)
 				dsk_menu[i].opt_name = MSG_partman;
 				dsk_menu[i].opt_flags = OPT_EXIT;
 				dsk_menu[i].opt_action = set_menu_select;
+				i++;
 			}
 			menu_no = new_menu(MSG_Available_disks,
-				dsk_menu, numdisks
-				 + ((partman_go<0)?1:0), -1,
+				dsk_menu, i, -1,
 				 4, 0, 0, MC_SCROLL,
 				NULL, NULL, NULL, NULL, NULL);
 			if (menu_no == -1)
@@ -818,6 +846,14 @@ find_disks(const char *doingwhat)
 			msg_fmt_display(MSG_ask_disk, "%s", doingwhat);
 			process_menu(menu_no, &selected_disk);
 			free_menu(menu_no);
+			if (allow_cur_system) {
+				if (selected_disk == 0) {
+					pm = dummy_whole_system_pm();
+					return 1;
+				} else {
+					selected_disk--;
+				}
+			}
 		}
 		if (partman_go < 0 && selected_disk == numdisks) {
 			partman_go = 1;
@@ -1020,6 +1056,9 @@ make_filesystems(struct install_partitio
 	struct disk_partitions *parts;
 	const char *mnt_opts = NULL, *fsname = NULL;
 
+	if (pm->cur_system)
+		return 1;
+
 	if (pm->no_part) {
 		/* check if this target device already has a ffs */
 		snprintf(rdev, sizeof rdev, _PATH_DEV "/r%s", pm->diskdev);
@@ -1171,6 +1210,9 @@ make_fstab(struct install_partition_desc
 	const char *dev;
 	char dev_buf[PATH_MAX], swap_dev[PATH_MAX];
 
+	if (pm->cur_system)
+		return 1;
+
 	swap_dev[0] = 0;
 
 	/* Create the fstab. */
@@ -1516,6 +1558,9 @@ mount_disks(struct install_partition_des
 	char devdev[PATH_MAX];
 	size_t i;
 
+	if (install->cur_system)
+		return 0;
+
 	static struct lookfor fstabbuf[] = {
 		{"/dev/", "/dev/%s %s ffs %s", "c", NULL, 0, 0, foundffs},
 		{"/dev/", "/dev/%s %s ufs %s", "c", NULL, 0, 0, foundffs},
Index: src/usr.sbin/sysinst/partman.c
diff -u src/usr.sbin/sysinst/partman.c:1.39 src/usr.sbin/sysinst/partman.c:1.40
--- src/usr.sbin/sysinst/partman.c:1.39	Mon Jul 15 17:17:59 2019
+++ src/usr.sbin/sysinst/partman.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: partman.c,v 1.39 2019/07/15 17:17:59 martin Exp $ */
+/*	$NetBSD: partman.c,v 1.40 2019/07/23 18:13:40 martin Exp $ */
 
 /*
  * Copyright 2012 Eugene Lozovoy
@@ -2793,7 +2793,7 @@ pm_upddevlist(menudesc *m, void *arg)
 	}
 
 	/* Detect all present devices */
-	(void)find_disks("partman");
+	(void)find_disks("partman", false);
 	if (have_lvm)
 		pm_lvm_find();
 	pm_clean();

Index: src/usr.sbin/sysinst/install.c
diff -u src/usr.sbin/sysinst/install.c:1.8 src/usr.sbin/sysinst/install.c:1.9
--- src/usr.sbin/sysinst/install.c:1.8	Thu Jun 20 00:43:55 2019
+++ src/usr.sbin/sysinst/install.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: install.c,v 1.8 2019/06/20 00:43:55 christos Exp $	*/
+/*	$NetBSD: install.c,v 1.9 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -119,7 +119,7 @@ do_install(void)
 {
 	int find_disks_ret;
 	int retcode = 0;
-	struct install_partition_desc install;
+	struct install_partition_desc install = {};
 	struct disk_partitions *parts;
 
 #ifndef NO_PARTMAN
@@ -139,7 +139,7 @@ do_install(void)
 	get_ramsize();
 
 	/* Create and mount partitions */
-	find_disks_ret = find_disks(msg_string(MSG_install));
+	find_disks_ret = find_disks(msg_string(MSG_install), false);
 	if (partman_go == 1) {
 		if (partman() < 0) {
 			hit_enter_to_continue(MSG_abort_part, NULL);

Index: src/usr.sbin/sysinst/msg.mi.de
diff -u src/usr.sbin/sysinst/msg.mi.de:1.12 src/usr.sbin/sysinst/msg.mi.de:1.13
--- src/usr.sbin/sysinst/msg.mi.de:1.12	Wed Jun 12 06:20:18 2019
+++ src/usr.sbin/sysinst/msg.mi.de	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.de,v 1.12 2019/06/12 06:20:18 martin Exp $	*/
+/*	$NetBSD: msg.mi.de,v 1.13 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1470,3 +1470,5 @@ message	gpt_flag_desc	{, (S)tart}
  *  $0 = file system type		FFSv2
  */
 message size_ptn_not_mounted		{(Sonstige: $0)}
+
+message running_system			{aktuelles System}

Index: src/usr.sbin/sysinst/msg.mi.en
diff -u src/usr.sbin/sysinst/msg.mi.en:1.18 src/usr.sbin/sysinst/msg.mi.en:1.19
--- src/usr.sbin/sysinst/msg.mi.en:1.18	Fri Jun 21 15:53:16 2019
+++ src/usr.sbin/sysinst/msg.mi.en	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.en,v 1.18 2019/06/21 15:53:16 pgoyette Exp $	*/
+/*	$NetBSD: msg.mi.en,v 1.19 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1409,3 +1409,6 @@ message	gpt_flag_desc	{, (B)ootable}
  *  $0 = file system type		FFSv2
  */
 message size_ptn_not_mounted		{(Other: $0)}
+
+message running_system			{current system}
+

Index: src/usr.sbin/sysinst/msg.mi.es
diff -u src/usr.sbin/sysinst/msg.mi.es:1.13 src/usr.sbin/sysinst/msg.mi.es:1.14
--- src/usr.sbin/sysinst/msg.mi.es:1.13	Fri Jun 21 15:59:14 2019
+++ src/usr.sbin/sysinst/msg.mi.es	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.es,v 1.13 2019/06/21 15:59:14 pgoyette Exp $	*/
+/*	$NetBSD: msg.mi.es,v 1.14 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1457,3 +1457,6 @@ message	gpt_flag_desc	{, (B)ootable}
  *  $0 = file system type		FFSv2
  */
 message size_ptn_not_mounted		{(Other: $0)}
+
+message running_system			{current system}
+

Index: src/usr.sbin/sysinst/msg.mi.fr
diff -u src/usr.sbin/sysinst/msg.mi.fr:1.16 src/usr.sbin/sysinst/msg.mi.fr:1.17
--- src/usr.sbin/sysinst/msg.mi.fr:1.16	Fri Jun 21 15:59:14 2019
+++ src/usr.sbin/sysinst/msg.mi.fr	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.fr,v 1.16 2019/06/21 15:59:14 pgoyette Exp $	*/
+/*	$NetBSD: msg.mi.fr,v 1.17 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -1503,3 +1503,6 @@ message	gpt_flag_desc	{, (B)ootable}
  *  $0 = file system type		FFSv2
  */
 message size_ptn_not_mounted		{(Other: $0)}
+
+message running_system			{current system}
+

Index: src/usr.sbin/sysinst/msg.mi.pl
diff -u src/usr.sbin/sysinst/msg.mi.pl:1.19 src/usr.sbin/sysinst/msg.mi.pl:1.20
--- src/usr.sbin/sysinst/msg.mi.pl:1.19	Sun Jul 14 16:04:03 2019
+++ src/usr.sbin/sysinst/msg.mi.pl	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.pl,v 1.19 2019/07/14 16:04:03 kamil Exp $	*/
+/*	$NetBSD: msg.mi.pl,v 1.20 2019/07/23 18:13:40 martin Exp $	*/
 /*	Based on english version: */
 /*	NetBSD: msg.mi.pl,v 1.36 2004/04/17 18:55:35 atatat Exp       */
 
@@ -1392,3 +1392,6 @@ message	gpt_flag_desc	{, (R)ozruchowa}
  *  $0 = file system type		FFSv2
  */
 message size_ptn_not_mounted		{(Inna: $0)}
+
+message running_system			{current system}
+

Index: src/usr.sbin/sysinst/target.c
diff -u src/usr.sbin/sysinst/target.c:1.7 src/usr.sbin/sysinst/target.c:1.8
--- src/usr.sbin/sysinst/target.c:1.7	Tue Jul 23 15:23:14 2019
+++ src/usr.sbin/sysinst/target.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: target.c,v 1.7 2019/07/23 15:23:14 martin Exp $	*/
+/*	$NetBSD: target.c,v 1.8 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Jonathan Stone
@@ -71,7 +71,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: target.c,v 1.7 2019/07/23 15:23:14 martin Exp $");
+__RCSID("$NetBSD: target.c,v 1.8 2019/07/23 18:13:40 martin Exp $");
 #endif
 
 /*
@@ -163,6 +163,9 @@ target_already_root(void)
 	if (pm == last_pm)
 		return last_res;
 
+	if (pm->cur_system)
+		return 1;
+
 	last_pm = pm;
 	last_res = 0;
 

Index: src/usr.sbin/sysinst/upgrade.c
diff -u src/usr.sbin/sysinst/upgrade.c:1.11 src/usr.sbin/sysinst/upgrade.c:1.12
--- src/usr.sbin/sysinst/upgrade.c:1.11	Tue Jul 23 16:02:32 2019
+++ src/usr.sbin/sysinst/upgrade.c	Tue Jul 23 18:13:40 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: upgrade.c,v 1.11 2019/07/23 16:02:32 martin Exp $	*/
+/*	$NetBSD: upgrade.c,v 1.12 2019/07/23 18:13:40 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -54,7 +54,7 @@ static int merge_X(const char *);
 void
 do_upgrade(void)
 {
-	struct install_partition_desc install;
+	struct install_partition_desc install = {};
 	int retcode = 0;
 	partman_go = 0;
 
@@ -64,20 +64,24 @@ do_upgrade(void)
 
 	get_ramsize();
 
-	if (find_disks(msg_string(MSG_upgrade)) < 0)
+	if (find_disks(msg_string(MSG_upgrade), true) < 0)
 		return;
 
-	if (pm->parts == NULL) {
+	if (pm->parts == NULL && !pm->cur_system) {
 		hit_enter_to_continue(MSG_noroot, NULL);
 		return;
 	}
 
-	if (pm->parts->pscheme->pre_update_verify) {
-		if (pm->parts->pscheme->pre_update_verify(pm->parts))
-			pm->parts->pscheme->write_to_disk(pm->parts);
-	}
+	if (!pm->cur_system) {
+		if (pm->parts->pscheme->pre_update_verify) {
+			if (pm->parts->pscheme->pre_update_verify(pm->parts))
+				pm->parts->pscheme->write_to_disk(pm->parts);
+		}
 
-	install_desc_from_parts(&install, pm->parts);
+		install_desc_from_parts(&install, pm->parts);
+	} else {
+		install.cur_system = true;
+	}
 
 	if (set_swap_if_low_ram(&install) < 0)
 		return;
@@ -195,7 +199,7 @@ merge_X(const char *xroot)
 void
 do_reinstall_sets()
 {
-	struct install_partition_desc install;
+	struct install_partition_desc install = {};
 	int retcode = 0;
 	partman_go = 0;
 
@@ -204,15 +208,19 @@ do_reinstall_sets()
 	if (!ask_noyes(NULL))
 		return;
 
-	if (find_disks(msg_string(MSG_reinstall)) < 0)
+	if (find_disks(msg_string(MSG_reinstall), true) < 0)
 		return;
 
-	if (pm->parts == NULL) {
-		hit_enter_to_continue(MSG_noroot, NULL);
-		return;
-	}
+	if (!pm->cur_system) {
+		if (pm->parts == NULL) {
+			hit_enter_to_continue(MSG_noroot, NULL);
+			return;
+		}
 
-	install_desc_from_parts(&install, pm->parts);
+		install_desc_from_parts(&install, pm->parts);
+	} else {
+		install.cur_system = true;
+	}
 
 	if (mount_disks(&install) != 0)
 		goto free_install;

Reply via email to