Subject: Re: install/10935: update install should remember which X you use
To: None <dmcmahill@netbsd.org>
From: Hubert Feyrer <feyrer@rfhs8012.fh-regensburg.de>
List: tech-x11
Date: 09/02/2000 14:58:23
On Fri, 1 Sep 2000 dmcmahill@netbsd.org wrote:
> I just used sysinst to update a i386 from 1.4.2 to 1.5_ALPHA2. It would be nice if the link
> from /usr/X11R6/bin/X to Xwhatever_is_was_I_had_before was remembered. Doesn't have to be remade,
> but at least recorded somewhere (like the way /etc is saved to /etc.old
Here is a patch that moves X aside, and back.
It's untested. I also don't know what "X" is installed on non-i386.
Someone please tell me if this is ok!!!
Index: msg.mi.en
===================================================================
RCS file: /cvsroot/basesrc/distrib/utils/sysinst/msg.mi.en,v
retrieving revision 1.65
diff -u -r1.65 msg.mi.en
--- msg.mi.en 2000/08/15 01:08:00 1.65
+++ msg.mi.en 2000/09/02 12:54:27
@@ -625,6 +625,20 @@
Aborting upgrade.}
+message X_oldexists
+{I cannot save /usr/X11R6/bin/X as /usr/X11R6/bin/X.old, because the
+target disk already has an /usr/X11R6/bin/X.old. Please fix this before
+continuing.
+
+One way is to start a shell from the Utilities menu, examine the
+target /usr/X11R6/bin/X and /usr/X11R6/bin/X.old. If
+/usr/X11R6/bin/X.old is from a completed upgrade, you can rm -f
+/usr/X11R6/bin/X.old and restart. Or if /usr/X11R6/bin/X.old is from
+a recent, incomplete upgrade, you can rm -f /usr/X11R6/bin/X and mv
+/usr/X11R6/bin/X.old to /usr/X11R6/bin/X.
+
+Aborting upgrade.}
+
message netnotup
{There was a problem in setting up the network. Either your gateway
or your nameserver was not reachable by a ping. Do you want to
Index: target.c
===================================================================
RCS file: /cvsroot/basesrc/distrib/utils/sysinst/target.c,v
retrieving revision 1.22
diff -u -r1.22 target.c
--- target.c 1999/06/20 06:08:15 1.22
+++ target.c 2000/09/02 12:54:29
@@ -541,7 +541,8 @@
/*
* Do a mv where both pathnames are within the target filesystem.
*/
-void mv_within_target_or_die(frompath, topath)
+void
+mv_within_target_or_die(frompath, topath)
const char *frompath;
const char *topath;
{
@@ -724,6 +725,14 @@
return target_test("-f", path);
}
+int
+target_test_symlink(path)
+ const char *path;
+{
+
+ return target_test("-h", path);
+}
+
int target_file_exists_p(path)
const char *path;
{
@@ -736,4 +745,11 @@
{
return (target_test_dir(path) == 0);
+}
+
+int target_symlink_exists_p(path)
+ const char *path;
+{
+
+ return (target_test_symlink(path) == 0);
}
Index: upgrade.c
===================================================================
RCS file: /cvsroot/basesrc/distrib/utils/sysinst/upgrade.c,v
retrieving revision 1.20
diff -u -r1.20 upgrade.c
--- upgrade.c 1999/06/22 06:57:01 1.20
+++ upgrade.c 2000/09/02 12:54:29
@@ -51,6 +51,8 @@
void check_prereqs __P((void));
int save_etc __P((void));
int merge_etc __P((void));
+int save_X __P((void));
+int merge_X __P((void));
/*
* Do the system upgrade.
@@ -88,6 +90,11 @@
if (save_etc())
return;
+ /*
+ * Save X symlink, ...
+ */
+ if (save_X())
+ return;
/* Do any md updating of the file systems ... e.g. bootblocks,
copy file systems ... */
@@ -106,6 +113,7 @@
/* Copy back any files we should restore after the upgrade.*/
merge_etc();
+ merge_X();
sanity_check();
}
@@ -169,6 +177,32 @@
}
/*
+ * Save X symlink to X.old so it can be recovered later
+ */
+int
+save_X()
+{
+ /* Only care for X if it's a symlink */
+ if (target_symlink_exists_p("/usr/X11R6/bin/X")) {
+ if (target_symlink_exists_p("/usr/X11R6/bin/X.old")) {
+ msg_display(MSG_X_oldexists);
+ process_menu(MENU_ok);
+ return EEXIST;
+ }
+
+#ifdef DEBUG
+ printf("saving /usr/X11R6/bin/X as .../X.old ...");
+#endif
+
+ /* Move target .../X to .../X.old. Abort on error. */
+ mv_within_target_or_die("/usr/X11R6/bin/X",
+ "/usr/X11R6/bin/X.old");
+ }
+
+ return 0;
+}
+
+/*
* Merge back saved target /etc files after unpacking the new
* sets has completed.
*/
@@ -178,6 +212,23 @@
/* just move back fstab, so we can boot cleanly. */
cp_within_target("/etc.old/fstab", "/etc/");
+
+ return 0;
+}
+
+/*
+ * Merge back saved target X files after unpacking the new
+ * sets has completed.
+ */
+int
+merge_X()
+{
+ if (target_symlink_exists_p("/usr/X11R6/bin/X.old")) {
+ /* Only move back X if it's a symlink - we don't want
+ * to restore old binaries */
+ mv_within_target_or_die("/usr/X11R6/bin/X.old",
+ "/usr/X11R6/bin/X");
+ }
return 0;
}
> write it down your self, or have sysinst save it somewhere. Also, the Xservers file
> gets stomped on.
Which file is this, I'm not familiar with it.
- Hubert
--
NetBSD - because Unix isn't just #include <linux.h>, i386, ILP32, ELF, ...!