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