Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/distrib/utils/sysinst/arch/sparc Try to upgrade a.out librar...
details: https://anonhg.NetBSD.org/src/rev/56e9834e757e
branches: trunk
changeset: 499305:56e9834e757e
user: abs <abs%NetBSD.org@localhost>
date: Thu Nov 16 15:02:46 2000 +0000
description:
Try to upgrade a.out libraries. Currently just cut & pasted from the i386 port
diffstat:
distrib/utils/sysinst/arch/sparc/md.c | 225 +++++++++++++++++++++++++++++++++-
distrib/utils/sysinst/arch/sparc/md.h | 5 +-
2 files changed, 228 insertions(+), 2 deletions(-)
diffs (281 lines):
diff -r 1320abd63a55 -r 56e9834e757e distrib/utils/sysinst/arch/sparc/md.c
--- a/distrib/utils/sysinst/arch/sparc/md.c Thu Nov 16 13:21:05 2000 +0000
+++ b/distrib/utils/sysinst/arch/sparc/md.c Thu Nov 16 15:02:46 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: md.c,v 1.21 2000/10/11 23:48:00 fvdl Exp $ */
+/* $NetBSD: md.c,v 1.22 2000/11/16 15:02:46 abs Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -45,11 +45,13 @@
#include <sys/disklabel.h>
#include <sys/ioctl.h>
#include <sys/param.h>
+#include <sys/exec.h>
#include <stdio.h>
#include <curses.h>
#include <unistd.h>
#include <fcntl.h>
#include <util.h>
+#include <dirent.h>
#include "defs.h"
#include "md.h"
@@ -57,6 +59,11 @@
#include "menu_defs.h"
#include "bsddisklabel.c"
+static int move_aout_libs __P((void));
+static int handle_aout_libs(const char *dir, int op, const void *arg);
+static int is_aout_shared_lib __P((const char *));
+static void handle_aout_x_libs __P((const char *, const char *));
+
int
md_get_info(void)
{
@@ -182,6 +189,7 @@
int
md_update(void)
{
+ move_aout_libs();
endwin();
md_copy_filesystem();
md_post_newfs();
@@ -226,3 +234,218 @@
md_init()
{
}
+
+/*
+ * a.out X libraries to move. These have not changed since 1.3.x
+ */
+static const char *x_libs[] = {
+ "libICE.so.6.3",
+ "libPEX5.so.6.0",
+ "libSM.so.6.0",
+ "libX11.so.6.1",
+ "libXIE.so.6.0",
+ "libXaw.so.6.1",
+ "libXext.so.6.3",
+ "libXi.so.6.0",
+ "libXmu.so.6.0",
+ "libXp.so.6.2",
+ "libXt.so.6.0",
+ "libXtst.so.6.1",
+ "liboldX.so.6.0",
+};
+
+static int
+is_aout_shared_lib(const char *name)
+{
+ struct exec ex;
+ struct stat st;
+ int fd;
+
+ if (stat(name, &st) < 0)
+ return 0;
+ if ((st.st_mode & (S_IFREG|S_IFLNK)) == 0)
+ return 0;
+
+ fd = open(name, O_RDONLY);
+ if (fd < 0) {
+ close(fd);
+ return 0;
+ }
+ if (read(fd, &ex, sizeof ex) < sizeof ex) {
+ close(fd);
+ return 0;
+ }
+ close(fd);
+ if (N_GETMAGIC(ex) != ZMAGIC ||
+ (N_GETFLAG(ex) & EX_DYNAMIC) == 0)
+ return 0;
+
+ return 1;
+}
+
+static void
+handle_aout_x_libs(const char *srcdir, const char *tgtdir)
+{
+ char src[MAXPATHLEN];
+ int i;
+
+ for (i = 0; i < (sizeof x_libs / sizeof (const char *)); i++) {
+ snprintf(src, MAXPATHLEN, "%s/%s", srcdir, x_libs[i]);
+ if (!is_aout_shared_lib(src))
+ continue;
+ run_prog(0, NULL, "mv -f %s %s", src, tgtdir);
+ }
+
+ /*
+ * Don't care if it fails; X may not have been installed.
+ */
+}
+
+/*
+ * Function to count or move a.out shared libraries.
+ */
+static int
+handle_aout_libs(const char *dir, int op, const void *arg)
+{
+ DIR *dd;
+ struct dirent *dp;
+ char *fullname;
+ const char *destdir;
+ int n;
+
+ dd = opendir(dir);
+ if (dd == NULL)
+ return -1;
+
+ n = 0;
+
+ switch (op) {
+ case LIB_COUNT:
+ break;
+ case LIB_MOVE:
+ destdir = (const char *)arg;
+ break;
+ default:
+ return -1;
+ }
+
+ while ((dp = readdir(dd)) != NULL) {
+ /*
+ * strlen("libX.so")
+ */
+ if (dp->d_namlen < 7)
+ continue;
+ if (strncmp(dp->d_name, "lib", 3) != 0)
+ continue;
+
+ asprintf(&fullname, "%s/%s", dir, dp->d_name);
+
+ if (!is_aout_shared_lib(fullname))
+ goto endloop;
+
+ switch (op) {
+ case LIB_COUNT:
+ n++;
+ break;
+ case LIB_MOVE:
+ run_prog(0, NULL, "mv -f %s %s/%s",
+ fullname, destdir, dp->d_name);
+ break;
+ }
+
+endloop:
+ free(fullname);
+ }
+
+ closedir(dd);
+
+ return n;
+}
+
+static int
+move_aout_libs()
+{
+ int n;
+ char prefix[MAXPATHLEN], src[MAXPATHLEN];
+ struct stat st;
+
+ n = handle_aout_libs(target_expand("/usr/lib"), LIB_COUNT, NULL);
+ if (n <= 0)
+ return n;
+
+ /*
+ * See if /emul/aout already exists, taking symlinks into
+ * account. If so, no need to create it, just use it.
+ */
+ if (target_realpath("/emul/aout", prefix) != NULL && stat(prefix, &st) == 0)
+ goto domove;
+
+ /*
+ * See if /emul exists. If not, create it.
+ */
+ if (target_realpath("/emul", prefix) == NULL || stat(prefix, &st) < 0) {
+ strcpy(prefix, target_expand("/emul"));
+ if (scripting)
+ fprintf(script, "mkdir %s\n", prefix);
+ mkdir(prefix, 0755);
+ }
+
+ /*
+ * Can use strcpy, target_expand has made sure it fits into
+ * MAXPATHLEN. XXX all this copying is because concat_paths
+ * returns a pointer to a static buffer.
+ *
+ * If an old aout link exists (apparently pointing to nowhere),
+ * move it out of the way.
+ */
+ strcpy(src, concat_paths(prefix, "aout"));
+ run_prog(0, NULL, "mv -f %s %s", src,
+ concat_paths(prefix, "aout.old"));
+
+ /*
+ * We have created /emul if needed. Since no previous /emul/aout
+ * existed, we'll use a symbolic link in /emul to /usr/aout, to
+ * avoid overflowing the root partition.
+ */
+ strcpy(prefix, target_expand("/usr/aout"));
+ run_prog(RUN_FATAL, MSG_aoutfail, "mkdir -p %s", prefix);
+ run_prog(RUN_FATAL, MSG_aoutfail, "ln -s %s %s",
+ "/usr/aout", src);
+
+domove:
+ /*
+ * Rename etc and usr/lib if they already existed, so that we
+ * do not overwrite old files.
+ *
+ * Then, move /etc/ld.so.conf to /emul/aout/etc/ld.so.conf,
+ * and all a.out dynamic libraries from /usr/lib to
+ * /emul/aout/usr/lib. This is where the a.out code in ldconfig
+ * and ld.so respectively will find them.
+ */
+ strcpy(src, concat_paths(prefix, "usr/lib"));
+ run_prog(0, NULL, "mv -f %s %s", src,
+ concat_paths(prefix, "usr/lib.old"));
+ strcpy(src, concat_paths(prefix, "etc/ld.so.conf"));
+ run_prog(0, NULL, "mv -f %s %s", src,
+ concat_paths(prefix, "etc/ld.so.conf.old"));
+ run_prog(RUN_FATAL, MSG_aoutfail, "mkdir -p %s ",
+ concat_paths(prefix, "usr/lib"));
+ run_prog(RUN_FATAL, MSG_aoutfail, "mkdir -p %s ",
+ concat_paths(prefix, "etc"));
+
+ strcpy(src, target_expand("/etc/ld.so.conf"));
+ run_prog(RUN_FATAL, MSG_aoutfail, "mv -f %s %s", src,
+ concat_paths(prefix, "etc/ld.so.conf"));
+
+ strcpy(src, target_expand("/usr/lib"));
+ n = handle_aout_libs(src, LIB_MOVE,
+ concat_paths(prefix, "usr/lib"));
+
+ run_prog(RUN_FATAL, MSG_aoutfail, "mkdir -p %s ",
+ concat_paths(prefix, "usr/X11R6/lib"));
+
+ strcpy(src, target_expand("/usr/X11R6/lib"));
+ handle_aout_x_libs(src, concat_paths(prefix, "usr/X11R6/lib"));
+
+ return n;
+}
diff -r 1320abd63a55 -r 56e9834e757e distrib/utils/sysinst/arch/sparc/md.h
--- a/distrib/utils/sysinst/arch/sparc/md.h Thu Nov 16 13:21:05 2000 +0000
+++ b/distrib/utils/sysinst/arch/sparc/md.h Thu Nov 16 15:02:46 2000 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: md.h,v 1.6 2000/10/01 22:57:18 thorpej Exp $ */
+/* $NetBSD: md.h,v 1.7 2000/11/16 15:02:46 abs Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -55,6 +55,9 @@
#define STDNEEDMB 110 /* Min space for non X install */
#define XNEEDMB 35 /* Extra megs for full X installation */
+#define LIB_COUNT 0
+#define LIB_MOVE 1
+
/*
* Default filesets to fetch and install during installation
* or upgrade.
Home |
Main Index |
Thread Index |
Old Index