readded this old version as it can become handy over a SSH connection with X; digged...
authorChristian Faulhammer <fauli@gentoo.org>
Wed, 14 Feb 2007 14:46:28 +0000 (14:46 +0000)
committerChristian Faulhammer <fauli@gentoo.org>
Wed, 14 Feb 2007 14:46:28 +0000 (14:46 +0000)
Package-Manager: portage-2.1.2-r9

app-editors/emacs/ChangeLog
app-editors/emacs/Manifest
app-editors/emacs/emacs-18.59-r1.ebuild [new file with mode: 0644]
app-editors/emacs/files/digest-emacs-18.59-r1 [new file with mode: 0644]
app-editors/emacs/files/digest-emacs-22.0.50_pre20050225
app-editors/emacs/files/emacs-18.59-gcc4.patch [new file with mode: 0644]
app-editors/emacs/files/emacs-18.59-gentoo.patch [new file with mode: 0644]
app-editors/emacs/files/emacs-18.59-unexelf.patch [new file with mode: 0644]

index f038c925347f35f814dfb0636bb6aa00884c3e99..eec8e5af7111861f4722fb44de407a444abd0e32 100644 (file)
@@ -1,6 +1,15 @@
 # ChangeLog for app-editors/emacs
 # Copyright 2002-2007 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.118 2007/02/06 06:09:41 opfer Exp $
+# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/ChangeLog,v 1.119 2007/02/14 14:46:28 opfer Exp $
+
+*emacs-18.59-r1 (14 Feb 2007)
+
+  14 Feb 2007; Christian Faulhammer <opfer@gentoo.org>
+  +files/emacs-18.59-gcc4.patch, +files/emacs-18.59-gentoo.patch,
+  +files/emacs-18.59-unexelf.patch, +emacs-18.59-r1.ebuild:
+  readded this old version as it can become handy over a SSH connection with
+  X; digged out some old patches, and made it ready for GCC 4. Provided by
+  Ulrich Mueller <ulm@kph.uni-mainz.de> in bug 44766
 
   06 Feb 2007; Christian Faulhammer <opfer@gentoo.org> emacs-21.4-r6.ebuild:
   made the definition of suffix variable more elegant (thanks to Ulrich
index 41e25e5e4c8228b1ce5e9b85aa8081a8720f22dc..5e6e32f5350d3e82f12ed7945e35cf1387e9a255 100644 (file)
@@ -13,6 +13,18 @@ AUX 60emacs-22.0.50.envd 39 RMD160 6264f1faa5b99e98251be427fd8ef60b52ca1370 SHA1
 MD5 0d61f19c0e6fcdb6657ae1d4d9e69801 files/60emacs-22.0.50.envd 39
 RMD160 6264f1faa5b99e98251be427fd8ef60b52ca1370 files/60emacs-22.0.50.envd 39
 SHA256 5501f5818b4b88a34e93440e5fc6e2a44d2a1c83080358849b811b1d17234f43 files/60emacs-22.0.50.envd 39
+AUX emacs-18.59-gcc4.patch 28314 RMD160 8e89f1371d4e7f1aea83696a5b80561112fd55f1 SHA1 e5ba8aa69651985728fb52348f76e9ebbdec6397 SHA256 1f56fe8e186f0a11ced90fa432f5d717f91cd6d45436d58578a1e6d976c0c13c
+MD5 21889afa26e89127713453aee24bf3f7 files/emacs-18.59-gcc4.patch 28314
+RMD160 8e89f1371d4e7f1aea83696a5b80561112fd55f1 files/emacs-18.59-gcc4.patch 28314
+SHA256 1f56fe8e186f0a11ced90fa432f5d717f91cd6d45436d58578a1e6d976c0c13c files/emacs-18.59-gcc4.patch 28314
+AUX emacs-18.59-gentoo.patch 3901 RMD160 d00d15f69e3c0fa258d5ba0dd4297c25b00c71c5 SHA1 4bbce8130c171db6a4a562418ff49aa3c95c1280 SHA256 f73cd87ac92dc89617b819f41b9c94f680d46653c553d8c3a25255b53629e93a
+MD5 d9a84fa25df38b43cdce07e9ca4f53c0 files/emacs-18.59-gentoo.patch 3901
+RMD160 d00d15f69e3c0fa258d5ba0dd4297c25b00c71c5 files/emacs-18.59-gentoo.patch 3901
+SHA256 f73cd87ac92dc89617b819f41b9c94f680d46653c553d8c3a25255b53629e93a files/emacs-18.59-gentoo.patch 3901
+AUX emacs-18.59-unexelf.patch 30720 RMD160 42f9bc14274fb0f4f6b421e607dd4fffd6f12c5e SHA1 3ba8430b7a65cf5811620f200ab01852b5c6e441 SHA256 dc4538580635977ea8415188585dbfcd88867842495dba144e854f95e16634fb
+MD5 2179ae07d8caf10bdb4e36126353f0b1 files/emacs-18.59-unexelf.patch 30720
+RMD160 42f9bc14274fb0f4f6b421e607dd4fffd6f12c5e files/emacs-18.59-unexelf.patch 30720
+SHA256 dc4538580635977ea8415188585dbfcd88867842495dba144e854f95e16634fb files/emacs-18.59-unexelf.patch 30720
 AUX emacs-21.2-sh.patch 5782 RMD160 4e9f7369d9655a2bdb9cc017ba62e60ef18976a7 SHA1 8ab2b30b3e276f5383c46fad4d9cf9c3d41b8985 SHA256 c06d2f9e435e8059608bea7314ffee7cbbd0b066bb9b1c96598988f2f96fd9e5
 MD5 2f1bf0e4f91897570110704adbaf48dc files/emacs-21.2-sh.patch 5782
 RMD160 4e9f7369d9655a2bdb9cc017ba62e60ef18976a7 files/emacs-21.2-sh.patch 5782
@@ -53,11 +65,17 @@ AUX emacs-subdirs-el-gentoo.diff 1369 RMD160 142e80ab7dc4620275ec9623f646e0b2c4a
 MD5 5f423550e3d32b7c0511eccd93a94750 files/emacs-subdirs-el-gentoo.diff 1369
 RMD160 142e80ab7dc4620275ec9623f646e0b2c4a1c6bf files/emacs-subdirs-el-gentoo.diff 1369
 SHA256 c407b31c785b275f12337e41e58ff8386219b1c94a1c98b69eee82a10eb54074 files/emacs-subdirs-el-gentoo.diff 1369
-DIST emacs--multi-tty--0--patch-301.2005-02-25.patch.gz 150653
+DIST emacs--multi-tty--0--patch-301.2005-02-25.patch.gz 150653 RMD160 4bfcd54884fb0bbb7b3bdafa86eebfab33d60c2f SHA1 cf445a31ea1878ec1e71cea1e45dddbc12d65162 SHA256 e8688a6c2fc4d86b8af91e76cabd01022b6ea0c5271667dd1a55a00afe6fee09
+DIST emacs-18.59-linux22x-elf-glibc21.diff.gz 15671 RMD160 4fab87eead1a66d767d2334d31507695dcf7b4a8 SHA1 075f1c9cf86e9a10fb686ebd04a2f95d6e4c3972 SHA256 fb810d893938883d50a3a8d7c43fbeb1604d5454f760b8f1f700326c8ee659dd
+DIST emacs-18.59.tar.gz 2962652 RMD160 4976d0f0f34b6d54db6774d24a528f74a3bb20dc SHA1 15b25bf130e3eeb91f3eea8c01a3dec9aabf23cc SHA256 1e27e33f91984a91e9b4c1f21433f931aba03670960ecc147bb6d7b0de0f051e
 DIST emacs-21.4a.tar.gz 20403483 RMD160 c312e739935b56d08783bbfe97992297a363cb8a SHA1 cdb33731180fe4a912838af805dd35e3f55394d4 SHA256 1d50ddae117c48d689a3d772e390569edccfdc22168be0112d2093bd2d7c3216
 DIST emacs-22.0.50-20050225.tar.gz 33383930 RMD160 cf882d823cc2ac75b3bcacd83f73654fc05ccb0b SHA1 d258a6d3849d5f0010ad476ae6400ce9e4c7ebaa SHA256 e132ac3975a04f42e810e762283953bfe48eeb7ecafcc56f78ad32b777dbee7f
-DIST inline_patch-20041229.tar.gz 7047
+DIST inline_patch-20041229.tar.gz 7047 RMD160 38e456bdd11a4edcaf952181159a9b98aaf11573 SHA1 c0bdb4d77c986bb8931ed60b89e0becdb78dd402 SHA256 7999d75451e0dbd0e9ea078f0899ba31e475c2d5d28c32e580243eedf5aea09b
 DIST leim-21.4.tar.gz 3291433 RMD160 89e1108bfe06425a0d6b4d941f9c297551bafcca SHA1 dd63f9aca1a58d40d9d426dd410fb627230974f7 SHA256 db24946985dd644bfed18815d6e991dad27f8ab1fd5823dd6dc4eb8dcd04333b
+EBUILD emacs-18.59-r1.ebuild 2934 RMD160 c58003f359b970f445fbcd35a43fa1f29504881c SHA1 272c69cd9c9afa1f25d8a875cb88334071b027e3 SHA256 9f152b4d0937a39a07e70847d512475a5fff16a194a06f72fdacab888308664c
+MD5 34ef95f0991baebedde795e1c642ec44 emacs-18.59-r1.ebuild 2934
+RMD160 c58003f359b970f445fbcd35a43fa1f29504881c emacs-18.59-r1.ebuild 2934
+SHA256 9f152b4d0937a39a07e70847d512475a5fff16a194a06f72fdacab888308664c emacs-18.59-r1.ebuild 2934
 EBUILD emacs-21.4-r4.ebuild 4492 RMD160 571f7409b0f65bad0715aecc91d176af1edd3443 SHA1 fbcb530b08adec024137267b802ea9497e8f7204 SHA256 3914a526e5560e54fd0d670f190b4032f701aa46200570279f100a38841fcb4e
 MD5 317bcb60bc1061bf3794a1a993730405 emacs-21.4-r4.ebuild 4492
 RMD160 571f7409b0f65bad0715aecc91d176af1edd3443 emacs-21.4-r4.ebuild 4492
@@ -70,27 +88,30 @@ EBUILD emacs-22.0.50_pre20050225.ebuild 5557 RMD160 11e3ea0cc9bdad886ce7ecb49469
 MD5 7e17815f1e5c1a8a92e12ce8a4a20951 emacs-22.0.50_pre20050225.ebuild 5557
 RMD160 11e3ea0cc9bdad886ce7ecb4946925dfda0d83ed emacs-22.0.50_pre20050225.ebuild 5557
 SHA256 12629d258f388c211c18ed21bb65cb6479b3375913a921e85305fab8ae9bbd39 emacs-22.0.50_pre20050225.ebuild 5557
-MISC ChangeLog 17214 RMD160 ab79c4d9d10434a8412a1b305841ab8cb83b1d37 SHA1 9403511578db4f1c3da60bff455ef147ee289e97 SHA256 457199c3be9730899ec79b89402bf770fa209cca30a07e344e6d086013b1c116
-MD5 911248848f7d6c177d4bcc68de1dd531 ChangeLog 17214
-RMD160 ab79c4d9d10434a8412a1b305841ab8cb83b1d37 ChangeLog 17214
-SHA256 457199c3be9730899ec79b89402bf770fa209cca30a07e344e6d086013b1c116 ChangeLog 17214
+MISC ChangeLog 17632 RMD160 fafedbe968ab0240e445750a5b4a3a03b1bb9ef2 SHA1 fab7267b7102cb405596fd129a0bb7657bb932a0 SHA256 1b3ab892a3c8fcb94ad4b7ce959af0cedddd420f5e191d0049691d6d919060c1
+MD5 5e806984714dd81367dc7875b78dfd28 ChangeLog 17632
+RMD160 fafedbe968ab0240e445750a5b4a3a03b1bb9ef2 ChangeLog 17632
+SHA256 1b3ab892a3c8fcb94ad4b7ce959af0cedddd420f5e191d0049691d6d919060c1 ChangeLog 17632
 MISC metadata.xml 158 RMD160 415d172437ca754d24fc5ab186ba8e77934d96e4 SHA1 61f6eff9729cd87a725c2a70c81aca4270a17fc4 SHA256 1393bdef3a74343fdb40a112c7096a1af16f67e7a43413250de28dfe73810eab
 MD5 fcd33d07e4ee719b01157946734f4fe8 metadata.xml 158
 RMD160 415d172437ca754d24fc5ab186ba8e77934d96e4 metadata.xml 158
 SHA256 1393bdef3a74343fdb40a112c7096a1af16f67e7a43413250de28dfe73810eab metadata.xml 158
+MD5 c8ac383b70bbc9d6e0203b93246ab54f files/digest-emacs-18.59-r1 536
+RMD160 bfb96b384166f7f4f0830a76f6dd7d0ef6a43f62 files/digest-emacs-18.59-r1 536
+SHA256 854d3d621b4d3038ba37abce197d69dd4dd5d1a50eb2217d769ea7c10c22e9fb files/digest-emacs-18.59-r1 536
 MD5 6276bfdc37e540127a083cc6b979ac37 files/digest-emacs-21.4-r4 473
 RMD160 4f6aee1102af50b44f69f8de5714c901c5b6b15c files/digest-emacs-21.4-r4 473
 SHA256 8dec85daf40abb62a8c6a7232b067f0e5da524b222d2668f8db0f1df9dd7188e files/digest-emacs-21.4-r4 473
 MD5 6276bfdc37e540127a083cc6b979ac37 files/digest-emacs-21.4-r6 473
 RMD160 4f6aee1102af50b44f69f8de5714c901c5b6b15c files/digest-emacs-21.4-r6 473
 SHA256 8dec85daf40abb62a8c6a7232b067f0e5da524b222d2668f8db0f1df9dd7188e files/digest-emacs-21.4-r6 473
-MD5 56b020a4e966468679ce67d99479c7f7 files/digest-emacs-22.0.50_pre20050225 440
-RMD160 bd1c85e484649b0f59d8e862c56464ca05d82540 files/digest-emacs-22.0.50_pre20050225 440
-SHA256 263c0f93c22b5467286e5ff0054a83697b60e25ea6e3c44f38ce61fa181d97b6 files/digest-emacs-22.0.50_pre20050225 440
+MD5 2df1eb628db6afebd06600c89c6b5632 files/digest-emacs-22.0.50_pre20050225 864
+RMD160 6ca2f9e46acf2ab0ef441365fc4943c399c84070 files/digest-emacs-22.0.50_pre20050225 864
+SHA256 101b72de2e3aabbc053bba0963fa2aac03ece43a8654250914eb700f5dea5c19 files/digest-emacs-22.0.50_pre20050225 864
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.6 (GNU/Linux)
 
-iD8DBQFFyBueNQqtfCuFneMRAvLrAJwOpmNyNIo49pZaUYxmhrnusR325wCcDU3D
-RUC0Fd8wHVmKhVzBXvg8CJ8=
-=wfPE
+iD8DBQFF0yCxNQqtfCuFneMRAtshAJ9s5quUKT8h+UQHYvlVhiV9udHlxACeMNBv
+kgOpv0ipAjvTyrOPuSG4NcY=
+=NjOh
 -----END PGP SIGNATURE-----
diff --git a/app-editors/emacs/emacs-18.59-r1.ebuild b/app-editors/emacs/emacs-18.59-r1.ebuild
new file mode 100644 (file)
index 0000000..910df2f
--- /dev/null
@@ -0,0 +1,104 @@
+# Copyright 1999-2007 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-editors/emacs/emacs-18.59-r1.ebuild,v 1.1 2007/02/14 14:46:28 opfer Exp $
+
+inherit eutils toolchain-funcs flag-o-matic alternatives
+
+DESCRIPTION="The extensible self-documenting text editor"
+HOMEPAGE="http://www.gnu.org/software/emacs/"
+SRC_URI="mirror://gnu/old-gnu/emacs/${P}.tar.gz
+       ftp://ftp.splode.com/pub/users/friedman/emacs/${P}-linux22x-elf-glibc21.diff.gz"
+
+LICENSE="GPL-1"
+SLOT="18"
+KEYWORDS="~x86"
+IUSE="X"
+
+DEPEND="sys-libs/ncurses
+       X? ( || ( x11-libs/libX11 virtual/x11 ) )"
+PROVIDE="virtual/emacs virtual/editor"
+
+MY_BASEDIR="/usr/share/emacs/${PV}"
+MY_LOCKDIR="/var/lib/emacs/lock"
+
+src_unpack() {
+       unpack ${A}
+       cd "${S}"
+       epatch "${WORKDIR}/${P}-linux22x-elf-glibc21.diff"
+       epatch "${FILESDIR}/${P}-unexelf.patch"
+       epatch "${FILESDIR}/${P}-gentoo.patch"
+       epatch "${FILESDIR}/${P}-gcc4.patch"
+}
+
+src_compile() {
+       SANDBOX_ON=0
+
+       # autoconf? What's autoconf? We are living in 1992. ;-)
+       local arch
+       case ${ARCH} in
+               x86)   arch=intel386 ;;
+               *)     die "Architecture ${ARCH} not supported" ;;
+       esac
+       local cmd="s/\"s-.*\.h\"/\"s-linux.h\"/;s/\"m-.*\.h\"/\"m-${arch}.h\"/"
+       use X && cmd="${cmd};s/.*\(#define HAVE_X_WINDOWS\).*/\1/"
+       sed -e "${cmd}" src/config.h-dist >src/config.h
+
+       cat <<-END >src/paths.h
+               #define PATH_LOADSEARCH "${MY_BASEDIR}/lisp"
+               #define PATH_EXEC "${MY_BASEDIR}/etc"
+               #define PATH_LOCK "${MY_LOCKDIR}/"
+               #define PATH_SUPERLOCK "${MY_LOCKDIR}/!!!SuperLock!!!"
+       END
+
+       # -O3 and -finline-functions cause segmentation faults at run time.
+       filter-flags -finline-functions
+       replace-flags -O[3-9] -O2
+       strip-flags
+
+       emake -j1 CC="$(tc-getCC)" CFLAGS="${CFLAGS} -Demacs" || die
+}
+
+src_install() {
+       dodir ${MY_BASEDIR}
+       dodir /usr/share/man/man1
+       make install LIBDIR="${D}${MY_BASEDIR}" BINDIR="${D}/usr/bin" \
+               MANDIR="${D}/usr/share/man/man1" || die
+       chmod -R go-w "${D}${MY_BASEDIR}"
+       rmdir "${D}${MY_BASEDIR}/lock"
+
+       dodir ${MY_LOCKDIR%/*}
+       diropts -m0777
+       dodir ${MY_LOCKDIR}
+       keepdir ${MY_LOCKDIR}
+
+       for i in "${D}"/usr/bin/*; do
+               mv ${i}{,.emacs-${SLOT}} || die "mv ${i} failed"
+       done
+       dosym emacs.emacs-${SLOT} /usr/bin/emacs-${SLOT}
+       mv ${D}/usr/share/man/man1/emacs{,.emacs-${SLOT}}.1 || die
+
+       dodoc README PROBLEMS
+}
+
+update-alternatives() {
+       # Extract the suffix of the manpages to determine the correct
+       # compression program.
+       local suffix=$(echo /usr/share/man/man1/emacs.emacs-*.1*|sed 's/.*\.1//')
+
+       # This creates symlinks for binaries and man page, so the correct
+       # ones in a slotted environment can be accessed.
+       for i in emacs emacsclient etags ctags; do
+               alternatives_auto_makesym "/usr/bin/${i}" "/usr/bin/${i}.emacs-*"
+       done
+
+       alternatives_auto_makesym "/usr/share/man/man1/emacs.1${suffix}" \
+               "/usr/share/man/man1/emacs.emacs-*.1${suffix}"
+}
+
+pkg_postinst() {
+       update-alternatives
+}
+
+pkg_postrm() {
+       update-alternatives
+}
diff --git a/app-editors/emacs/files/digest-emacs-18.59-r1 b/app-editors/emacs/files/digest-emacs-18.59-r1
new file mode 100644 (file)
index 0000000..0b6bbff
--- /dev/null
@@ -0,0 +1,6 @@
+MD5 a7a4ed051dc232cdc9cf37208135302a emacs-18.59-linux22x-elf-glibc21.diff.gz 15671
+RMD160 4fab87eead1a66d767d2334d31507695dcf7b4a8 emacs-18.59-linux22x-elf-glibc21.diff.gz 15671
+SHA256 fb810d893938883d50a3a8d7c43fbeb1604d5454f760b8f1f700326c8ee659dd emacs-18.59-linux22x-elf-glibc21.diff.gz 15671
+MD5 ca57ae095ef098faca135bca736e1ca8 emacs-18.59.tar.gz 2962652
+RMD160 4976d0f0f34b6d54db6774d24a528f74a3bb20dc emacs-18.59.tar.gz 2962652
+SHA256 1e27e33f91984a91e9b4c1f21433f931aba03670960ecc147bb6d7b0de0f051e emacs-18.59.tar.gz 2962652
index 044549ed740a8dc42ec5c7b64d8469b91cb77fd7..9956386abf6b70a4ce66360b112ec067a74e4eb4 100644 (file)
@@ -1,5 +1,9 @@
 MD5 9ebc373bbef7ee62e63b15dcca9570fe emacs--multi-tty--0--patch-301.2005-02-25.patch.gz 150653
+RMD160 4bfcd54884fb0bbb7b3bdafa86eebfab33d60c2f emacs--multi-tty--0--patch-301.2005-02-25.patch.gz 150653
+SHA256 e8688a6c2fc4d86b8af91e76cabd01022b6ea0c5271667dd1a55a00afe6fee09 emacs--multi-tty--0--patch-301.2005-02-25.patch.gz 150653
 MD5 be496a1379f0a99af537f02f423c0291 emacs-22.0.50-20050225.tar.gz 33383930
 RMD160 cf882d823cc2ac75b3bcacd83f73654fc05ccb0b emacs-22.0.50-20050225.tar.gz 33383930
 SHA256 e132ac3975a04f42e810e762283953bfe48eeb7ecafcc56f78ad32b777dbee7f emacs-22.0.50-20050225.tar.gz 33383930
 MD5 ca71ae2407325987ea3eacb7665023fe inline_patch-20041229.tar.gz 7047
+RMD160 38e456bdd11a4edcaf952181159a9b98aaf11573 inline_patch-20041229.tar.gz 7047
+SHA256 7999d75451e0dbd0e9ea078f0899ba31e475c2d5d28c32e580243eedf5aea09b inline_patch-20041229.tar.gz 7047
diff --git a/app-editors/emacs/files/emacs-18.59-gcc4.patch b/app-editors/emacs/files/emacs-18.59-gcc4.patch
new file mode 100644 (file)
index 0000000..ce04f39
--- /dev/null
@@ -0,0 +1,1105 @@
+Prereq: 2004-03-09
+diff -ur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog
+--- emacs-18.59-orig/src/ChangeLog     2004-03-09 08:36:49.000000000 +0100
++++ emacs-18.59/src/ChangeLog  2007-01-29 21:47:56.000000000 +0100
+@@ -1,3 +1,11 @@
++2007-01-29  Ulrich Mueller  <ulm@kph.uni-mainz.de>
++
++      * x11term.c (internal_socket_read): Handle XK_BackSpace key.
++
++      * callproc.c, doprnt.c, emacssignal.h, fns.c, lisp.h, lread.c,
++      malloc.c, process.c, s-linux.h, sysdep.c, terminfo.c, x11term.c:
++      Fix GCC 4.1 compilation issues.
++
+ 2004-03-09  Ulrich Mueller  <ulm@kph.uni-mainz.de>
+       * malloc.c (DONT_DEFINE_SIGNAL): Defined.
+diff -ur emacs-18.59-orig/src/alloc.c emacs-18.59/src/alloc.c
+--- emacs-18.59-orig/src/alloc.c       1992-09-21 07:45:30.000000000 +0200
++++ emacs-18.59/src/alloc.c    2007-01-29 21:47:56.000000000 +0100
+@@ -1073,7 +1073,7 @@
+         mark_object (&ptr->contents[i]);
+       }
+       break;
+-#endif 0
++#endif
+     case Lisp_Symbol:
+       {
+@@ -1310,7 +1310,7 @@
+       }
+   }
+-#endif standalone
++#endif /* standalone */
+   /* Free all unmarked vectors */
+   {
+diff -ur emacs-18.59-orig/src/buffer.c emacs-18.59/src/buffer.c
+--- emacs-18.59-orig/src/buffer.c      1992-05-13 21:39:33.000000000 +0200
++++ emacs-18.59/src/buffer.c   2007-01-29 21:47:56.000000000 +0100
+@@ -331,7 +331,7 @@
+     return XBUFFER (buffer)->number;
+   }
+  */
+-#endif NOTDEF
++#endif /* NOTDEF */
+ DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
+   "Return name of file BUFFER is visiting, or NIL if none.\n\
+@@ -601,7 +601,7 @@
+ #ifdef subprocesses
+   kill_buffer_processes (buf);
+-#endif subprocesses
++#endif
+   tem = Vinhibit_quit;
+   Vinhibit_quit = Qt;
+diff -ur emacs-18.59-orig/src/callproc.c emacs-18.59/src/callproc.c
+--- emacs-18.59-orig/src/callproc.c    1992-07-12 05:26:01.000000000 +0200
++++ emacs-18.59/src/callproc.c 2007-01-29 21:47:56.000000000 +0100
+@@ -21,6 +21,7 @@
+ /* This must precede sys/signal.h on certain machines.  */
+ #include <sys/types.h>
+ #include <signal.h>
++#include <unistd.h>
+ #include "config.h"
+@@ -241,7 +242,7 @@
+     {
+ #ifndef subprocesses
+       wait_without_blocking ();
+-#endif subprocesses
++#endif
+       return Qnil;
+     }
+@@ -413,7 +414,7 @@
+ #ifdef vipc
+   something missing here;
+-#endif vipc
++#endif
+   /* execvp does not accept an environment arg so the only way
+      to pass this environment is to set environ.  Our caller
+diff -ur emacs-18.59-orig/src/dispnew.c emacs-18.59/src/dispnew.c
+--- emacs-18.59-orig/src/dispnew.c     1992-07-24 21:31:36.000000000 +0200
++++ emacs-18.59/src/dispnew.c  2007-01-29 21:47:56.000000000 +0100
+@@ -586,15 +586,15 @@
+ {
+ #ifndef COMPILER_REGISTER_BUG
+   register
+-#endif COMPILER_REGISTER_BUG
++#endif
+     struct window *w = XWINDOW (selected_window);
+ #ifndef COMPILER_REGISTER_BUG
+   register
+-#endif COMPILER_REGISTER_BUG
++#endif
+     int hpos = cursor_hpos;
+ #ifndef COMPILER_REGISTER_BUG
+   register
+-#endif COMPILER_REGISTER_BUG
++#endif
+     int vpos = cursor_vpos;
+   /* Give up if about to continue line */
+diff -ur emacs-18.59-orig/src/doprnt.c emacs-18.59/src/doprnt.c
+--- emacs-18.59-orig/src/doprnt.c      1991-01-08 18:26:23.000000000 +0100
++++ emacs-18.59/src/doprnt.c   2007-01-29 21:47:56.000000000 +0100
+@@ -22,6 +22,7 @@
+ #include <stdio.h>
+ #include <ctype.h>
++#include "config.h"
+ doprnt (buffer, bufsize, format, nargs, args)
+      char *buffer;
+diff -ur emacs-18.59-orig/src/editfns.c emacs-18.59/src/editfns.c
+--- emacs-18.59-orig/src/editfns.c     1992-08-08 01:38:16.000000000 +0200
++++ emacs-18.59/src/editfns.c  2007-01-29 21:47:56.000000000 +0100
+@@ -1046,7 +1046,7 @@
+     return Qnil;
+   return build_string (val);
+ }
+-#endif MAINTAIN_ENVIRONMENT
++#endif /* MAINTAIN_ENVIRONMENT */
\f
+ void
+ syms_of_editfns ()
+diff -ur emacs-18.59-orig/src/emacs.c emacs-18.59/src/emacs.c
+--- emacs-18.59-orig/src/emacs.c       1992-10-17 04:51:00.000000000 +0100
++++ emacs-18.59/src/emacs.c    2007-01-29 21:47:56.000000000 +0100
+@@ -314,7 +314,7 @@
+ #ifdef HIGHPRI
+   setpriority (PRIO_PROCESS, getpid (), HIGHPRI);
+   setuid (getuid ());
+-#endif HIGHPRI
++#endif
+   inhibit_window_system = 0;
+@@ -402,7 +402,7 @@
+ #endif
+ #ifdef SIGXFSZ
+       signal (SIGXFSZ, fatal_error_signal);
+-#endif SIGXFSZ
++#endif
+ #ifdef AIX
+       /* This used to run fatal_error_signal,
+@@ -489,7 +489,7 @@
+       syms_of_alloc ();
+ #ifdef MAINTAIN_ENVIRONMENT
+       syms_of_environ ();
+-#endif MAINTAIN_ENVIRONMENT
++#endif /* MAINTAIN_ENVIRONMENT */
+       syms_of_read ();
+       syms_of_print ();
+       syms_of_eval ();
+diff -ur emacs-18.59-orig/src/emacssignal.h emacs-18.59/src/emacssignal.h
+--- emacs-18.59-orig/src/emacssignal.h 1991-12-31 21:52:31.000000000 +0100
++++ emacs-18.59/src/emacssignal.h      2007-01-29 21:47:56.000000000 +0100
+@@ -22,7 +22,8 @@
+ #define sighold(SIG)     ONLY_USED_IN_BSD_4_1
+ #define sigrelse(SIG)    ONLY_USED_IN_BSD_4_1
+-int (*sys_signal (int signal_number, int (*action)())) ();
++typedef void (*signal_handler_t) ();
++signal_handler_t sys_signal (int signal_number, signal_handler_t action);
+ int sys_sigpause (sigset_t new_mask);
+ sigset_t sys_sigblock (sigset_t new_mask);
+ sigset_t sys_sigunblock (sigset_t new_mask);
+diff -ur emacs-18.59-orig/src/fileio.c emacs-18.59/src/fileio.c
+--- emacs-18.59-orig/src/fileio.c      1998-05-31 05:34:39.000000000 +0200
++++ emacs-18.59/src/fileio.c   2007-01-29 21:47:56.000000000 +0100
+@@ -784,7 +784,7 @@
+         if (o == target + 1 && o[-1] == '/' && o[0] == '/')
+           ++o;
+         else
+-#endif APOLLO
++#endif /* APOLLO */
+         if (o == target && *o == '/')
+           ++o;
+         p += 3;
+diff -ur emacs-18.59-orig/src/fns.c emacs-18.59/src/fns.c
+--- emacs-18.59-orig/src/fns.c 1992-10-17 04:54:17.000000000 +0100
++++ emacs-18.59/src/fns.c      2007-01-29 21:47:56.000000000 +0100
+@@ -90,8 +90,6 @@
+   (arg)
+      Lisp_Object arg;
+ {
+-  extern long random ();
+-  extern srandom ();
+   extern long time ();
+   if (EQ (arg, Qt))
+diff -ur emacs-18.59-orig/src/lisp.h emacs-18.59/src/lisp.h
+--- emacs-18.59-orig/src/lisp.h        1992-03-06 00:11:31.000000000 +0100
++++ emacs-18.59/src/lisp.h     2004-05-13 02:56:53.000000000 +0200
+@@ -983,7 +983,6 @@
+ extern void debugger ();
+-extern char *malloc (), *realloc (), *getenv (), *ctime (), *getwd ();
+ extern long *xmalloc (), *xrealloc ();
+ #ifdef MAINTAIN_ENVIRONMENT
+diff -ur emacs-18.59-orig/src/lread.c emacs-18.59/src/lread.c
+--- emacs-18.59-orig/src/lread.c       1992-03-23 05:18:17.000000000 +0100
++++ emacs-18.59/src/lread.c    2007-01-29 21:47:56.000000000 +0100
+@@ -229,7 +229,7 @@
+      Lisp_Object stream;
+ {
+   fclose (*(FILE **) XSTRING (stream));
+-  free (XPNTR (stream));
++  free ((void *)(XPNTR (stream)));
+   if (--load_in_progress < 0) load_in_progress = 0;
+   return Qnil;
+ }
+@@ -465,7 +465,7 @@
+   return Qnil;
+ }
+-#endif standalone
++#endif /* standalone */
\f
+ DEFUN ("read", Fread, Sread, 0, 1, 0,
+   "Read one Lisp expression as text from STREAM, return as Lisp object.\n\
+@@ -1141,7 +1141,7 @@
+   sym = intern (string);
+   XSET (XSYMBOL (sym)->function, Lisp_Subr, sname);
+ }
+-#endif NOTDEF
++#endif /* NOTDEF */
+ /* New replacement for DefIntVar; it ignores the doc string argument
+    on the assumption that make-docfile will handle that.  */
+@@ -1230,7 +1230,7 @@
+     abort ();
+ }
+-#endif standalone
++#endif /* standalone */
\f
+ init_read ()
+ {
+diff -ur emacs-18.59-orig/src/malloc.c emacs-18.59/src/malloc.c
+--- emacs-18.59-orig/src/malloc.c      2004-03-09 08:33:12.000000000 +0100
++++ emacs-18.59/src/malloc.c   2007-01-29 21:47:56.000000000 +0100
+@@ -213,8 +213,6 @@
+ static void getpool ();
+-char *malloc ();
+-
+ /* Cause reinitialization based on job parameters;
+   also declare where the end of pure storage is. */
+ void
+@@ -412,7 +410,7 @@
+     }
+ }
\f
+-char *
++void *
+ malloc (n)            /* get a block */
+      unsigned n;
+ {
+@@ -488,8 +486,9 @@
+   return (char *) p + ((sizeof *p + 7) & ~7);
+ }
++void
+ free (mem)
+-     char *mem;
++     void *mem;
+ {
+   register struct mhead *p;
+   {
+@@ -509,7 +508,7 @@
+     if (p -> mh_alloc != ISALLOC)
+       abort ();
+-#else rcheck
++#else /* rcheck */
+     if (p -> mh_alloc != ISALLOC)
+       {
+       if (p -> mh_alloc == ISFREE)
+@@ -544,9 +543,9 @@
+   }
+ }
+-char *
++void *
+ realloc (mem, n)
+-     char *mem;
++     void *mem;
+      register unsigned n;
+ {
+   register struct mhead *p;
+@@ -606,7 +605,7 @@
+ /* This is in case something linked with Emacs calls calloc.  */
+-char *
++void *
+ calloc (num, size)
+      unsigned num, size;
+ {
+@@ -621,8 +620,9 @@
+ /* This is in case something linked with Emacs calls cfree.  */
++void
+ cfree (mem)
+-     char *mem;
++     void *mem;
+ {
+   return free (mem);
+ }
+@@ -656,8 +656,8 @@
+ #ifndef HPUX
+ /* This runs into trouble with getpagesize on HPUX.
+    Patching out seems cleaner than the ugly fix needed.  */
+-char *
+-valloc (size)
++void *
++valloc (size_t size)
+ {
+   return memalign (getpagesize (), size);
+ }
+diff -ur emacs-18.59-orig/src/mocklisp.c emacs-18.59/src/mocklisp.c
+--- emacs-18.59-orig/src/mocklisp.c    1991-01-08 19:00:01.000000000 +0100
++++ emacs-18.59/src/mocklisp.c 2007-01-29 21:47:56.000000000 +0100
+@@ -193,7 +193,7 @@
+   XSETINT (to, XINT (to) + XINT (from));
+   return Fsubstring (string, from, to);
+ }
+-#endif NOTDEF
++#endif /* NOTDEF */
+ DEFUN ("insert-string", Finsert_string, Sinsert_string, 0, MANY, 0,
+   "Mocklisp-compatibility insert function.\n\
+ Like the function `insert' except that any argument that is a number\n\
+diff -ur emacs-18.59-orig/src/process.c emacs-18.59/src/process.c
+--- emacs-18.59-orig/src/process.c     1998-05-31 05:34:40.000000000 +0200
++++ emacs-18.59/src/process.c  2007-01-29 21:47:56.000000000 +0100
+@@ -1438,7 +1438,7 @@
+   while (1)
+     {
+-      int value = connect (s, &address, sizeof address);
++      int value = connect (s, (struct sockaddr *)&address, sizeof address);
+       /* Continue if successeful.  */
+       if (value != -1)
+       break;
+@@ -1592,7 +1592,8 @@
+   int xerrno;
+   Lisp_Object proc;
+ #ifdef HAVE_TIMEVAL
+-  struct timeval timeout, end_time, garbage;
++  struct timeval timeout, end_time;
++  struct timezone garbage;
+ #else
+   long timeout, end_time, temp;
+ #endif /* not HAVE_TIMEVAL */
+diff -ur emacs-18.59-orig/src/regex.c emacs-18.59/src/regex.c
+--- emacs-18.59-orig/src/regex.c       1992-07-07 17:35:33.000000000 +0200
++++ emacs-18.59/src/regex.c    2007-01-29 21:47:56.000000000 +0100
+@@ -90,7 +90,7 @@
+ #ifndef NFAILURES
+ #define NFAILURES 80
+-#endif NFAILURES
++#endif
+ /* width of a byte in bits */
+@@ -536,7 +536,7 @@
+             PATFETCH (c);
+             PATPUSH (syntax_spec_code[c]);
+             break;
+-#endif emacs
++#endif /* emacs */
+           case 'w':
+             laststart = b;
+@@ -833,7 +833,7 @@
+           if (SYNTAX (j) != (enum syntaxcode) k)
+             fastmap[j] = 1;
+         break;
+-#endif emacs
++#endif /* emacs */
+       case charset:
+         for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+@@ -1475,7 +1475,7 @@
+         PREFETCH;
+         if (SYNTAX (*d++) != 0) goto fail;
+         break;
+-#endif not emacs
++#endif /* not emacs */
+       case begbuf:
+         if (d == string1)     /* Note, d cannot equal string2 */
+@@ -1722,4 +1722,4 @@
+   exit (1);
+ }
+-#endif test
++#endif /* test */
+diff -ur emacs-18.59-orig/src/s-linux.h emacs-18.59/src/s-linux.h
+--- emacs-18.59-orig/src/s-linux.h     2004-03-09 08:34:05.000000000 +0100
++++ emacs-18.59/src/s-linux.h  2007-01-29 21:47:56.000000000 +0100
+@@ -126,6 +126,11 @@
\f
+ /* Special hacks needed to make Emacs run on this system.  */
++#ifdef emacs
++#include <stdlib.h>
++#include <string.h>
++#endif
++
+ /* On USG systems the system calls are interruptable by signals
+  that the user program has elected to catch.  Thus the system call
+  must be retried in these cases.  To handle this without massive
+@@ -224,6 +229,7 @@
+ #define MAXNAMLEN NAME_MAX    /* missing SYSV-ism */
+ #endif
++#undef SIGSYS
+ #define SIGSYS SIGUNUSED      /* rename to harmless work-alike */
+ #define VSWTCH VSWTC          /* mis-spelling in termios.h? */
+@@ -253,7 +259,7 @@
+ #define C_COMPILER gcc
+ #define C_DEBUG_SWITCH -g
+-#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2
++#define C_OPTIMIZE_SWITCH -O2 -falign-loops=2 -falign-jumps=2 -falign-functions=2
+ #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o
+ #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o
+ #define LIBS_DEBUG            /* override in config.h to include -lg */
+diff -ur emacs-18.59-orig/src/sysdep.c emacs-18.59/src/sysdep.c
+--- emacs-18.59-orig/src/sysdep.c      1998-05-31 05:34:43.000000000 +0200
++++ emacs-18.59/src/sysdep.c   2007-01-29 21:47:56.000000000 +0100
+@@ -2051,8 +2051,6 @@
+ #endif
+ }
+-typedef int (*signal_handler_t) ();
+-
+ signal_handler_t
+ sys_signal (int signal_number, signal_handler_t action)
+ {
+@@ -2063,7 +2061,7 @@
+ #else
+   sigemptyset (&new_action.sa_mask);
+   new_action.sa_handler = action;
+-  new_action.sa_flags = NULL;
++  new_action.sa_flags = 0;
+   sigaction (signal_number, &new_action, &old_action);
+   return (old_action.sa_handler);
+ #endif /* DGUX */
+diff -ur emacs-18.59-orig/src/terminfo.c emacs-18.59/src/terminfo.c
+--- emacs-18.59-orig/src/terminfo.c    1991-01-08 19:09:05.000000000 +0100
++++ emacs-18.59/src/terminfo.c 2007-01-29 21:47:56.000000000 +0100
+@@ -17,6 +17,8 @@
+ along with GNU Emacs; see the file COPYING.  If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
++#include "config.h"
++
+ /* Define these variables that serve as global parameters to termcap,
+    so that we do not need to conditionalize the places in Emacs
+    that set them.  */
+diff -ur emacs-18.59-orig/src/x11fns.c emacs-18.59/src/x11fns.c
+--- emacs-18.59-orig/src/x11fns.c      1992-07-15 21:38:49.000000000 +0200
++++ emacs-18.59/src/x11fns.c   2007-01-29 21:47:56.000000000 +0100
+@@ -884,7 +884,7 @@
+               rawshift = (((unsigned) (XINT (shift_mask))) & 15) << 11;
+               XRebindCode (rawkey, rawshift, rawstring, strsize);
+       }
+-#endif notdef
++#endif /* notdef */
+       return Qnil;
+ }
+   
+@@ -918,11 +918,11 @@
+                       XRebindCode (rawkey, i << 11, rawstring, strsize);
+               }
+       }
+-#endif notdef
++#endif /* notdef */
+       return Qnil;
+ }
+-#endif foobar
++#endif /* foobar */
+ XExitWithCoreDump ()
+ {
+@@ -988,7 +988,7 @@
+   defsubr (&Sx_set_font);
+ #ifdef notdef
+   defsubr (&Sx_set_icon);
+-#endif notdef
++#endif
+   defsubr (&Scoordinates_in_window_p);
+   defsubr (&Sx_mouse_events);
+   defsubr (&Sx_proc_mouse_event);
+@@ -1012,7 +1012,7 @@
+ #ifdef notdef
+   defsubr (&Sx_rebind_key);
+   defsubr (&Sx_rebind_keys);
+-#endif notdef
++#endif
+   defsubr (&Sx_debug);
+ }
+diff -ur emacs-18.59-orig/src/x11term.c emacs-18.59/src/x11term.c
+--- emacs-18.59-orig/src/x11term.c     1992-10-24 05:31:56.000000000 +0100
++++ emacs-18.59/src/x11term.c  2007-01-29 21:47:56.000000000 +0100
+@@ -33,1 +33,1 @@
+-#endif        lint
++#endif
+@@ -1482,6 +1482,10 @@
+         strcpy(mapping_buf,"\016");
+         nbytes = 1;
+         break;
++      case XK_BackSpace:
++        strcpy(mapping_buf,"\177");
++        nbytes = 1;
++        break;
+       }
+ #ifndef AIX
+       }
+@@ -1715,7 +1719,6 @@
+       extern char *getenv ();
+       extern XTinterrupt_signal ();
+-      extern char *malloc ();
+       extern Lisp_Object Vxterm, Vxterm1, Qt;
+       extern int XIgnoreError();
+       int  ix;
+diff -ur emacs-18.59-orig/src/xdisp.c emacs-18.59/src/xdisp.c
+--- emacs-18.59-orig/src/xdisp.c       1992-07-24 21:08:13.000000000 +0200
++++ emacs-18.59/src/xdisp.c    2007-01-29 21:47:56.000000000 +0100
+@@ -2107,7 +2107,7 @@
+   Lisp_Object root_window;
+ #ifndef COMPILER_REGISTER_BUG
+   register
+-#endif COMPILER_REGISTER_BUG
++#endif
+     struct window *mini_w;
+   this_line_bufpos = 0;
+diff -ur emacs-18.59-orig/etc/ChangeLog emacs-18.59/etc/ChangeLog
+--- emacs-18.59-orig/etc/ChangeLog     1998-05-31 05:34:34.000000000 +0200
++++ emacs-18.59/etc/ChangeLog  2007-01-29 21:47:56.000000000 +0100
+@@ -1,3 +1,11 @@
++2007-01-29  Ulrich Mueller  <ulm@kph.uni-mainz.de>
++
++      * emacsclient.c, server.c: Check for HAVE_SOCKETS instead of BSD.
++
++      * cvtmail.c, emacsclient.c, env.c, etags.c, fakemail.c,
++      make-docfile.c, movemail.c, server.c, sorted-doc.c,
++      test-distrib.c, wakeup.c, yow.c: Fix GCC 4.1 compilation issues.
++
+ 1998-05-30  Noah Friedman  <friedman@splode.com>
+       * env.c (main): Declare sys_errlist if linux + glibc2.
+diff -ur emacs-18.59-orig/etc/cvtmail.c emacs-18.59/etc/cvtmail.c
+--- emacs-18.59-orig/etc/cvtmail.c     1991-01-08 20:06:08.000000000 +0100
++++ emacs-18.59/etc/cvtmail.c  2007-01-29 21:47:56.000000000 +0100
+@@ -36,7 +36,10 @@
+ #include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++void *xmalloc(), *xrealloc();
+ main (argc, argv)
+      int argc;
+@@ -109,22 +112,22 @@
+     ;
+ }
+-int
++void *
+ xmalloc (size)
+      int size;
+ {
+-  int result = malloc (size);
++  void *result = malloc (size);
+   if (!result)
+     fatal ("virtual memory exhausted", 0);
+   return result;
+ }
+-int
++void *
+ xrealloc (ptr, size)
+      char *ptr;
+      int size;
+ {
+-  int result = realloc (ptr, size);
++  void *result = realloc (ptr, size);
+   if (!result)
+     fatal ("virtual memory exhausted");
+   return result;
+diff -ur emacs-18.59-orig/etc/emacsclient.c emacs-18.59/etc/emacsclient.c
+--- emacs-18.59-orig/etc/emacsclient.c 1992-08-22 09:09:47.000000000 +0200
++++ emacs-18.59/etc/emacsclient.c      2007-01-29 21:47:56.000000000 +0100
+@@ -27,8 +27,10 @@
+ #undef close
+ #endif
++#include <stdlib.h>
++#include <string.h>
+-#if !defined(BSD) && !defined(HAVE_SYSVIPC)
++#if !defined(HAVE_SOCKETS) && !defined(HAVE_SYSVIPC)
+ #include <stdio.h>
+ main (argc, argv)
+@@ -41,9 +43,9 @@
+   exit (1);
+ }
+-#else /* BSD or HAVE_SYSVIPC */
++#else /* HAVE_SOCKETS or HAVE_SYSVIPC */
+-#if defined(BSD) && ! defined (HAVE_SYSVIPC)
++#if defined(HAVE_SOCKETS)
+ /* BSD code is very different from SYSV IPC code */
+ #include <sys/types.h>
+@@ -51,10 +53,10 @@
+ #include <sys/un.h>
+ #include <stdio.h>
+ #include <errno.h>
++#include <unistd.h>
+ #include <sys/stat.h>
+ extern int sys_nerr;
+-extern char *sys_errlist[];
+ extern int errno;
+ main (argc, argv)
+@@ -69,8 +71,6 @@
+   char string[BUFSIZ];
+   struct stat statbfr;
+-  char *getenv (), *getwd ();
+-
+   if (argc < 2)
+     {
+       fprintf (stderr, "Usage: %s filename\n", argv[0]);
+@@ -112,7 +112,8 @@
+   strcat (server.sun_path, "/.emacs_server");
+ #endif
+-  if (connect (s, &server, strlen (server.sun_path) + 2) < 0)
++  if (connect (s, (struct sockaddr *)&server,
++             strlen (server.sun_path) + 2) < 0)
+     {
+       fprintf (stderr, "%s: ", argv[0]);
+       perror ("connect");
+@@ -125,11 +126,11 @@
+       exit (1);
+     }
+-  cwd = getwd (string);
++  cwd = getcwd (string, sizeof string);
+   if (cwd == 0)
+     {
+-      /* getwd puts message in STRING if it fails.  */
+-      fprintf (stderr, "%s: %s (%s)\n", argv[0], string,
++      fprintf (stderr, "%s: %s (%s)\n", argv[0],
++             "Cannot get current working directory",
+              (errno < sys_nerr) ? sys_errlist[errno] : "unknown error");
+       exit (1);
+     }
+@@ -275,4 +276,4 @@
+ #endif /* HAVE_SYSVIPC */
+-#endif /* BSD or HAVE_SYSVIPC */
++#endif /* HAVE_SOCKETS or HAVE_SYSVIPC */
+diff -ur emacs-18.59-orig/etc/env.c emacs-18.59/etc/env.c
+--- emacs-18.59-orig/etc/env.c 1998-05-31 05:34:36.000000000 +0200
++++ emacs-18.59/etc/env.c      2007-01-29 21:47:56.000000000 +0100
+@@ -89,6 +89,8 @@
+ #include <stdio.h>
+ #include <errno.h>
++#include <stdlib.h>
++#include <string.h>
+ extern int execvp ();
+ extern char *index ();
+@@ -102,7 +104,7 @@
+ int nenv_size;
+ char *progname;
+-void setenv ();
++void xsetenv ();
+ void fatal ();
+ main (argc, argv, envp)
+@@ -134,7 +136,7 @@
+       if (tem)
+         {
+           *tem = '\000';
+-          setenv (*envp, tem + 1);
++          xsetenv (*envp, tem + 1);
+         }
+      }
+@@ -145,7 +147,7 @@
+       /* If arg contains a "=" it specifies to set a variable */
+       {
+         *tem = '\000';
+-        setenv (*argv, tem + 1);
++        xsetenv (*argv, tem + 1);
+         argc--; argv++;
+         continue;
+       }
+@@ -161,7 +163,7 @@
+       /* Unset a variable */
+       {
+         argc--; argv++;
+-        setenv (*argv, 0);
++        xsetenv (*argv, 0);
+         argc--; argv++;
+       }
+       else if (!strcmp (*argv, "-s") ||
+@@ -174,7 +176,7 @@
+           fatal ("No value specified for variable \"%s\"",
+                  tem);
+         argc--; argv++;
+-        setenv (tem, *argv);
++        xsetenv (tem, *argv);
+         argc--; argv++;
+       }
+       else if (!strcmp (*argv, "-") || !strcmp (*argv, "--"))
+@@ -216,7 +218,7 @@
+ }
+ void
+-setenv (var, val)
++xsetenv (var, val)
+   register char *var, *val;
+ {
+   register char **e;
+@@ -274,8 +276,6 @@
+ }
\f
+-extern char *malloc (), *realloc ();
+-
+ void
+ memory_fatal ()
+ {
+diff -ur emacs-18.59-orig/etc/etags.c emacs-18.59/etc/etags.c
+--- emacs-18.59-orig/etc/etags.c       1992-08-20 07:11:01.000000000 +0200
++++ emacs-18.59/etc/etags.c    2007-01-29 21:47:56.000000000 +0100
+@@ -21,6 +21,8 @@
+ #include <stdio.h>
+ #include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
+ /* Define the symbol ETAGS to make the program "etags",
+  which makes emacs-style tag tables by default.
+@@ -128,11 +130,10 @@
+ char *savestr();
+ char *savenstr ();
+-char *rindex();
+-char *index();
+ char *concat ();
+ void initbuffer ();
+ long readline ();
++void *xmalloc(), *xrealloc();
+ /* A `struct linebuffer' is a structure which holds a line of text.
+  `readline' reads a line from a stream into a linebuffer
+@@ -1380,7 +1381,6 @@
+      char *defenv;
+ {
+   register char *env, *p;
+-  extern char *savenstr (), *index ();
+   struct TEX_tabent *tab;
+   int size, i;
+@@ -1530,47 +1530,6 @@
+   return dp;
+ }
+-/*
+- * Return the ptr in sp at which the character c last
+- * appears; NULL if not found
+- *
+- * Identical to v7 rindex, included for portability.
+- */
+-
+-char *
+-rindex(sp, c)
+-     register char *sp, c;
+-{
+-  register char *r;
+-
+-  r = NULL;
+-  do
+-    {
+-      if (*sp == c)
+-      r = sp;
+-    } while (*sp++);
+-  return(r);
+-}
+-
+-/*
+- * Return the ptr in sp at which the character c first
+- * appears; NULL if not found
+- *
+- * Identical to v7 index, included for portability.
+- */
+-
+-char *
+-index(sp, c)
+-     register char *sp, c;
+-{
+-  do
+-    {
+-      if (*sp == c)
+-      return (sp);
+-    } while (*sp++);
+-  return (NULL);
+-}
+-
+ /* Print error message and exit.  */
+ fatal (s1, s2)
+@@ -1609,22 +1568,22 @@
+ /* Like malloc but get fatal error if memory is exhausted.  */
+-int
++void *
+ xmalloc (size)
+      int size;
+ {
+-  int result = malloc (size);
++  void *result = malloc (size);
+   if (!result)
+     fatal ("virtual memory exhausted", 0);
+   return result;
+ }
+-int
++void *
+ xrealloc (ptr, size)
+      char *ptr;
+      int size;
+ {
+-  int result = realloc (ptr, size);
++  void *result = realloc (ptr, size);
+   if (!result)
+     fatal ("virtual memory exhausted");
+   return result;
+diff -ur emacs-18.59-orig/etc/fakemail.c emacs-18.59/etc/fakemail.c
+--- emacs-18.59-orig/etc/fakemail.c    1991-01-08 20:08:42.000000000 +0100
++++ emacs-18.59/etc/fakemail.c 2007-01-29 21:47:56.000000000 +0100
+@@ -43,6 +43,7 @@
+ #endif
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <string.h>
+ #include <ctype.h>
+ #include <time.h>
+@@ -123,16 +124,8 @@
+ extern FILE *popen ();
+ extern int fclose (), pclose ();
+-extern char *malloc (), *realloc ();
+-#ifdef CURRENT_USER
+-extern struct passwd *getpwuid ();
+-extern unsigned short geteuid ();
+-static struct passwd *my_entry;
+-#define cuserid(s)                            \
+-(my_entry = getpwuid (((int) geteuid ())),    \
+- my_entry->pw_name)
+-#endif
++#define cuserid(s) (getpwuid (geteuid ())->pw_name)
\f
+ /* Utilities */
+@@ -564,7 +557,6 @@
+   return;
+ }
\f
+-void
+ main (argc, argv)
+      int argc;
+      char **argv;
+diff -ur emacs-18.59-orig/etc/make-docfile.c emacs-18.59/etc/make-docfile.c
+--- emacs-18.59-orig/etc/make-docfile.c        1991-10-25 19:43:28.000000000 +0100
++++ emacs-18.59/etc/make-docfile.c     2007-01-29 21:47:56.000000000 +0100
+@@ -32,6 +32,8 @@
+  */
+ #include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
+ FILE *outfile;
+diff -ur emacs-18.59-orig/etc/movemail.c emacs-18.59/etc/movemail.c
+--- emacs-18.59-orig/etc/movemail.c    1992-05-07 22:11:16.000000000 +0200
++++ emacs-18.59/etc/movemail.c 2007-01-29 21:47:56.000000000 +0100
+@@ -52,6 +52,9 @@
+ #include <sys/stat.h>
+ #include <sys/file.h>
+ #include <errno.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
+ #define NO_SHORTNAMES   /* Tell config not to load remap.h */
+ #include "../src/config.h"
+@@ -81,6 +84,7 @@
+ #undef close
+ char *concat ();
++void *xmalloc ();
+ extern int errno;
+ /* Nonzero means this is name of a lock file to delete on fatal error.  */
+@@ -320,7 +324,6 @@
+      char *name;
+ {
+   extern int errno, sys_nerr;
+-  extern char *sys_errlist[];
+   char *s;
+   if (errno < sys_nerr)
+@@ -334,7 +337,6 @@
+      char *name;
+ {
+   extern int errno, sys_nerr;
+-  extern char *sys_errlist[];
+   char *s;
+   if (errno < sys_nerr)
+@@ -365,11 +367,11 @@
+ /* Like malloc but get fatal error if memory is exhausted.  */
+-int
++void *
+ xmalloc (size)
+      int size;
+ {
+-  int result = malloc (size);
++  void *result = malloc (size);
+   if (!result)
+     fatal ("virtual memory exhausted", 0);
+   return result;
+@@ -704,7 +706,6 @@
+ get_errmsg ()
+ {
+   extern int errno, sys_nerr;
+-  extern char *sys_errlist[];
+   char *s;
+   if (errno < sys_nerr)
+diff -ur emacs-18.59-orig/etc/server.c emacs-18.59/etc/server.c
+--- emacs-18.59-orig/etc/server.c      1992-03-23 05:06:08.000000000 +0100
++++ emacs-18.59/etc/server.c   2007-01-29 21:47:56.000000000 +0100
+@@ -36,8 +36,10 @@
+ #undef open
+ #undef close
++#include <stdlib.h>
++#include <string.h>
+-#if !defined(BSD) && !defined(HAVE_SYSVIPC)
++#if !defined(HAVE_SOCKETS) && !defined(HAVE_SYSVIPC)
+ #include <stdio.h>
+ main ()
+@@ -47,9 +49,9 @@
+   exit (1);
+ }
+-#else /* BSD or HAVE_SYSVIPC */
++#else /* HAVE_SOCKETS or HAVE_SYSVIPC */
+-#if defined (BSD) && ! defined (HAVE_SYSVIPC)
++#if defined (HAVE_SOCKETS)
+ /* BSD code is very different from SYSV IPC code */
+ #include <sys/file.h>
+@@ -110,7 +112,7 @@
+   unlink (server.sun_path);
+ #endif
+-  if (bind (s, &server, strlen (server.sun_path) + 2) < 0)
++  if (bind (s, (struct sockaddr *)&server, strlen (server.sun_path) + 2) < 0)
+     {
+       perror ("bind");
+       exit (1);
+@@ -128,14 +130,18 @@
+   signal (SIGPIPE, SIG_IGN);
+   for (;;)
+     {
+-      int rmask = (1 << s) + 1;
++      fd_set rmask;
++      FD_ZERO (&rmask);
++      FD_SET (0, &rmask);
++      FD_SET (s, &rmask);
+       if (select (s + 1, &rmask, 0, 0, 0) < 0)
+       perror ("select");
+-      if (rmask & (1 << s))   /* client sends list of filenames */
++      if (FD_ISSET (s, &rmask))       /* client sends list of filenames */
+       {
+         fromlen = sizeof (fromunix);
+         fromunix.sun_family = AF_UNIX;
+-        infd = accept (s, &fromunix, &fromlen); /* open socket fd */
++        infd = accept (s, (struct sockaddr *)&fromunix, &fromlen);
++                              /* open socket fd */
+         if (infd < 0)
+           {
+             if (errno == EMFILE || errno == ENFILE)
+@@ -184,7 +190,8 @@
+         fflush (infile);
+         continue;
+       }
+-      else if (rmask & 1) /* emacs sends codeword, fd, and string message */
++      else if (FD_ISSET (0, &rmask))
++                      /* emacs sends codeword, fd, and string message */
+       {
+         /* Read command codeword and fd */
+         clearerr (stdin);
+@@ -325,6 +332,4 @@
+ #endif /* SYSV IPC */
+-#endif /* BSD && IPC */
+-
+-
++#endif /* HAVE_SOCKETS && IPC */
+diff -ur emacs-18.59-orig/etc/sorted-doc.c emacs-18.59/etc/sorted-doc.c
+--- emacs-18.59-orig/etc/sorted-doc.c  1988-06-04 06:22:22.000000000 +0200
++++ emacs-18.59/etc/sorted-doc.c       2007-01-29 21:47:56.000000000 +0100
+@@ -7,8 +7,9 @@
+ #include <stdio.h>
+ #include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
+-extern char *malloc ();
+ char *xmalloc ();
+ #define NUL   '\0'
+diff -ur emacs-18.59-orig/etc/test-distrib.c emacs-18.59/etc/test-distrib.c
+--- emacs-18.59-orig/etc/test-distrib.c        1987-05-22 06:15:12.000000000 +0200
++++ emacs-18.59/etc/test-distrib.c     2007-01-29 21:47:56.000000000 +0100
+@@ -1,4 +1,5 @@
+ #include <stdio.h>
++#include <stdlib.h>
+ /* Break string in two parts to avoid buggy C compilers that ignore characters
+    after nulls in strings.  */
+diff -ur emacs-18.59-orig/etc/wakeup.c emacs-18.59/etc/wakeup.c
+--- emacs-18.59-orig/etc/wakeup.c      1991-07-30 23:03:39.000000000 +0200
++++ emacs-18.59/etc/wakeup.c   2007-01-29 21:47:56.000000000 +0100
+@@ -2,6 +2,7 @@
+ #include <stdio.h>
+ #include <time.h>
++#include <stdlib.h>
+ struct tm *localtime ();
+diff -ur emacs-18.59-orig/etc/yow.c emacs-18.59/etc/yow.c
+--- emacs-18.59-orig/etc/yow.c 1988-04-13 08:13:41.000000000 +0200
++++ emacs-18.59/etc/yow.c      2007-01-29 21:47:56.000000000 +0100
+@@ -1,5 +1,7 @@
+ #include <stdio.h>
+ #include <ctype.h>
++#include <stdlib.h>
++#include <string.h>
+ #include "../src/paths.h"
+ /* zippy.c
diff --git a/app-editors/emacs/files/emacs-18.59-gentoo.patch b/app-editors/emacs/files/emacs-18.59-gentoo.patch
new file mode 100644 (file)
index 0000000..0b6d94a
--- /dev/null
@@ -0,0 +1,96 @@
+Prereq: 2004-03-08
+diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog
+--- emacs-18.59-orig/src/ChangeLog     2004-03-08 09:38:50.000000000 +0100
++++ emacs-18.59/src/ChangeLog  2004-03-09 08:36:49.000000000 +0100
+@@ -1,3 +1,9 @@
++2004-03-09  Ulrich Mueller  <ulm@kph.uni-mainz.de>
++
++      * malloc.c (DONT_DEFINE_SIGNAL): Defined.
++
++      * s-linux.h (TERMINFO): Moved here from ymakefile.
++
+ 2004-03-08  Ulrich Mueller  <ulm@kph.uni-mainz.de>
+       * unexelf.c: Replaced with version from Emacs 21.3.
+diff -Nur emacs-18.59-orig/src/malloc.c emacs-18.59/src/malloc.c
+--- emacs-18.59-orig/src/malloc.c      1992-03-23 05:09:07.000000000 +0100
++++ emacs-18.59/src/malloc.c   2004-03-09 08:33:12.000000000 +0100
+@@ -59,6 +59,9 @@
+  */
+ #ifdef emacs
++/* Inhibit macro definition of "signal" in m-*.h */
++#define DONT_DEFINE_SIGNAL
++
+ /* config.h specifies which kind of system this is.  */
+ #include "config.h"
+diff -Nur emacs-18.59-orig/src/s-linux.h emacs-18.59/src/s-linux.h
+--- emacs-18.59-orig/src/s-linux.h     1999-11-05 09:17:23.000000000 +0100
++++ emacs-18.59/src/s-linux.h  2004-03-09 08:34:05.000000000 +0100
+@@ -164,6 +164,9 @@
+ #define POSIX                 /* affects only getpagesize.h */
+ #define POSIX_SIGNALS         /* uses sigaction from sys_signal */
++/* Use terminfo instead of termcap. */
++#define TERMINFO
++
+ #ifdef HAVE_PTMX
+ /* This change means that we don't loop through allocate_pty too many
+@@ -250,7 +253,7 @@
+ #define C_COMPILER gcc
+ #define C_DEBUG_SWITCH -g
+-#define C_OPTIMIZE_SWITCH -O3 -malign-loops=2 -malign-jumps=2 -malign-functions=2
++#define C_OPTIMIZE_SWITCH -O2 -malign-loops=2 -malign-jumps=2 -malign-functions=2
+ #define OLDXMENU_OPTIONS CFLAGS=-O2 EXTRA=insque.o
+ #define START_FILES pre-crt0.o /usr/lib/crt1.o /usr/lib/crti.o
+ #define LIBS_DEBUG            /* override in config.h to include -lg */
+diff -Nur emacs-18.59-orig/src/ymakefile emacs-18.59/src/ymakefile
+--- emacs-18.59-orig/src/ymakefile     1999-11-05 09:19:47.000000000 +0100
++++ emacs-18.59/src/ymakefile  2003-11-13 08:35:38.000000000 +0100
+@@ -191,7 +191,7 @@
+ SHORT= shortnames
+ #endif /* SHORTNAMES */
+-CFLAGS= C_DEBUG_SWITCH C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
++CFLAGS= C_OPTIMIZE_SWITCH -Demacs $(MYCPPFLAG) C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM
+ /* DO NOT use -R.  There is a special hack described in lastfile.c
+    which is used instead.  Some initialized data areas are modified
+    at initial startup, then labeled as part of the text area when
+@@ -284,7 +284,6 @@
+       process.o callproc.o $(environobj) \
+       doprnt.o
+-#define TERMINFO
+ #ifdef TERMINFO
+ /* Used to be -ltermcap here.  If your machine needs that,
+    define LIBS_TERMCAP in the m- file.  */
+diff -Nur emacs-18.59-orig/lisp/ChangeLog emacs-18.59/lisp/ChangeLog
+--- emacs-18.59-orig/lisp/ChangeLog    1992-10-31 01:32:00.000000000 +0100
++++ emacs-18.59/lisp/ChangeLog 2004-03-08 09:37:21.000000000 +0100
+@@ -1,3 +1,9 @@
++2004-03-08  Ulrich Mueller  <ulm@kph.uni-mainz.de>
++
++      * term/linux.el: New file.
++
++      * term/xterm.el: Load vt200.el.
++
+ Fri Oct 30 19:36:38 1992  Richard Stallman  (rms@mole.gnu.ai.mit.edu)
+       * Version 18.59 released.
+diff -Nur emacs-18.59-orig/lisp/term/linux.el emacs-18.59/lisp/term/linux.el
+--- emacs-18.59-orig/lisp/term/linux.el        1970-01-01 01:00:00.000000000 +0100
++++ emacs-18.59/lisp/term/linux.el     2003-11-29 21:37:15.000000000 +0100
+@@ -0,0 +1,2 @@
++(load (concat term-file-prefix "vt200") nil t)
++(enable-arrow-keys)
+diff -Nur emacs-18.59-orig/lisp/term/xterm.el emacs-18.59/lisp/term/xterm.el
+--- emacs-18.59-orig/lisp/term/xterm.el        1989-04-27 03:52:39.000000000 +0200
++++ emacs-18.59/lisp/term/xterm.el     2003-11-29 21:37:15.000000000 +0100
+@@ -1,2 +1,2 @@
+-;; Don't send the `ti' string when screen is cleared.
+-(setq reset-terminal-on-clear nil)
++(load (concat term-file-prefix "vt200") nil t)
++(enable-arrow-keys)
diff --git a/app-editors/emacs/files/emacs-18.59-unexelf.patch b/app-editors/emacs/files/emacs-18.59-unexelf.patch
new file mode 100644 (file)
index 0000000..66aa78a
--- /dev/null
@@ -0,0 +1,878 @@
+Prereq: 1999-11-05
+diff -Nur emacs-18.59-orig/src/ChangeLog emacs-18.59/src/ChangeLog
+--- emacs-18.59-orig/src/ChangeLog     1999-11-05 09:19:56.000000000 +0100
++++ emacs-18.59/src/ChangeLog  2004-03-08 09:38:50.000000000 +0100
+@@ -1,3 +1,7 @@
++2004-03-08  Ulrich Mueller  <ulm@kph.uni-mainz.de>
++
++      * unexelf.c: Replaced with version from Emacs 21.3.
++
+ 1999-11-05  Noah Friedman  <friedman@splode.com>
+       * ymakefile [LIBS_TERMCAP]: Use -lncurses, not -lcurses.
+diff -Nur emacs-18.59-orig/src/unexelf.c emacs-18.59/src/unexelf.c
+--- emacs-18.59-orig/src/unexelf.c     1998-05-31 04:35:54.000000000 +0200
++++ emacs-18.59/src/unexelf.c  2004-03-08 01:18:54.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992
++/* Copyright (C) 1985, 1986, 1987, 1988, 1990, 1992, 1999, 2000, 01, 02
+    Free Software Foundation, Inc.
+ This file is part of GNU Emacs.
+@@ -33,14 +33,14 @@
+  * Modified heavily since then.
+  *
+  * Synopsis:
+- *    unexec (new_name, a_name, data_start, bss_start, entry_address)
+- *    char *new_name, *a_name;
++ *    unexec (new_name, old_name, data_start, bss_start, entry_address)
++ *    char *new_name, *old_name;
+  *    unsigned data_start, bss_start, entry_address;
+  *
+  * Takes a snapshot of the program and makes an a.out format file in the
+  * file named by the string argument new_name.
+- * If a_name is non-NULL, the symbol table will be taken from the given file.
+- * On some machines, an existing a_name file is required.
++ * If old_name is non-NULL, the symbol table will be taken from the given file.
++ * On some machines, an existing old_name file is required.
+  *
+  * The boundaries within the a.out file may be adjusted with the data_start
+  * and bss_start arguments.  Either or both may be given as 0 for defaults.
+@@ -52,11 +52,6 @@
+  * The value you specify may be rounded down to a suitable boundary
+  * as required by the machine you are using.
+  *
+- * Specifying zero for data_start means the boundary between text and data
+- * should not be the same as when the program was loaded.
+- * If NO_REMAP is defined, the argument data_start is ignored and the
+- * segment boundaries are never changed.
+- *
+  * Bss_start indicates how much of the data segment is to be saved in the
+  * a.out file and restored when the program is executed.  It gives the lowest
+  * unsaved address, and is rounded up to a page boundary.  The default when 0
+@@ -66,9 +61,6 @@
+  *
+  * The new file is set up to start at entry_address.
+  *
+- * If you make improvements I'd like to get them too.
+- * harpo!utah-cs!thomas, thomas@Utah-20
+- *
+  */
+ /* Even more heavily modified by james@bigtex.cactus.org of Dell Computer Co.
+@@ -412,22 +404,159 @@
+  */
\f
++/*
++ * Modified by rdh@yottayotta.com of Yotta Yotta Incorporated.
++ * 
++ * The code originally used mmap() to create a memory image of the new
++ * and old object files.  This had a few handy features: (1) you get
++ * to use a cool system call like mmap, (2) no need to explicitly
++ * write out the new file before the close, and (3) no swap space
++ * requirements.  Unfortunately, mmap() often fails to work with
++ * nfs-mounted file systems.
++ *
++ * So, instead of relying on the vm subsystem to do the file i/o for
++ * us, it's now done explicitly.  A buffer of the right size for the
++ * file is dynamically allocated, and either the old_name is read into
++ * it, or it is initialized with the correct new executable contents,
++ * and then written to new_name.
++ */
++\f
++#ifndef emacs
++#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
++#include <string.h>
++#else
++#include "config.h"
++extern void fatal (char *, ...);
++#endif
++
+ #include <sys/types.h>
+ #include <stdio.h>
+ #include <sys/stat.h>
+ #include <memory.h>
+-#include <string.h>
+ #include <errno.h>
+ #include <unistd.h>
+ #include <fcntl.h>
++#if !defined (__NetBSD__) && !defined (__OpenBSD__)
+ #include <elf.h>
++#endif
+ #include <sys/mman.h>
+-
+-#ifndef emacs
+-#define fatal(a, b, c) fprintf (stderr, a, b, c), exit (1)
++#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
++#include <sys/elf_mips.h>
++#include <sym.h>
++#endif /* __sony_news && _SYSTYPE_SYSV */
++#if __sgi
++#include <syms.h> /* for HDRR declaration */
++#endif /* __sgi */
++
++#ifndef MAP_ANON
++#ifdef MAP_ANONYMOUS
++#define MAP_ANON MAP_ANONYMOUS
+ #else
+-#include "config.h"
+-extern void fatal (char *, ...);
++#define MAP_ANON 0
++#endif
++#endif
++
++#ifndef MAP_FAILED
++#define MAP_FAILED ((void *) -1)
++#endif
++
++#if defined (__alpha__) && !defined (__NetBSD__) && !defined (__OpenBSD__)
++/* Declare COFF debugging symbol table.  This used to be in
++   /usr/include/sym.h, but this file is no longer included in Red Hat
++   5.0 and presumably in any other glibc 2.x based distribution.  */
++typedef struct {
++      short magic;
++      short vstamp;
++      int ilineMax;
++      int idnMax;
++      int ipdMax;
++      int isymMax;
++      int ioptMax;
++      int iauxMax;
++      int issMax;
++      int issExtMax;
++      int ifdMax;
++      int crfd;
++      int iextMax;
++      long cbLine;
++      long cbLineOffset;
++      long cbDnOffset;
++      long cbPdOffset;
++      long cbSymOffset;
++      long cbOptOffset;
++      long cbAuxOffset;
++      long cbSsOffset;
++      long cbSsExtOffset;
++      long cbFdOffset;
++      long cbRfdOffset;
++      long cbExtOffset;
++} HDRR, *pHDRR; 
++#define cbHDRR sizeof(HDRR)
++#define hdrNil ((pHDRR)0)
++#endif
++
++#ifdef __NetBSD__
++/*
++ * NetBSD does not have normal-looking user-land ELF support.
++ */
++# if defined __alpha__ || defined __sparc_v9__
++#  define ELFSIZE     64
++# else
++#  define ELFSIZE     32
++# endif
++# include <sys/exec_elf.h>
++
++# ifndef PT_LOAD
++#  define PT_LOAD     Elf_pt_load
++#  if 0                                               /* was in pkgsrc patches for 20.7 */
++#   define SHT_PROGBITS Elf_sht_progbits
++#  endif
++#  define SHT_SYMTAB  Elf_sht_symtab
++#  define SHT_DYNSYM  Elf_sht_dynsym
++#  define SHT_NULL    Elf_sht_null
++#  define SHT_NOBITS  Elf_sht_nobits
++#  define SHT_REL     Elf_sht_rel
++#  define SHT_RELA    Elf_sht_rela
++
++#  define SHN_UNDEF   Elf_eshn_undefined
++#  define SHN_ABS     Elf_eshn_absolute
++#  define SHN_COMMON  Elf_eshn_common
++# endif /* !PT_LOAD */
++
++# ifdef __alpha__
++#  include <sys/exec_ecoff.h>
++#  define HDRR                struct ecoff_symhdr
++#  define pHDRR               HDRR *
++# endif /* __alpha__ */
++
++#ifdef __mips__                       /* was in pkgsrc patches for 20.7 */
++# define SHT_MIPS_DEBUG       DT_MIPS_FLAGS
++# define HDRR         struct Elf_Shdr
++#endif /* __mips__ */
++#endif /* __NetBSD__ */
++
++#ifdef __OpenBSD__
++# include <sys/exec_elf.h>
++#endif
++
++#if __GNU_LIBRARY__ - 0 >= 6
++# include <link.h>    /* get ElfW etc */
++#endif
++
++#ifndef ElfW
++# ifdef __STDC__
++#  define ElfBitsW(bits, type) Elf##bits##_##type
++# else
++#  define ElfBitsW(bits, type) Elf/**/bits/**/_/**/type
++# endif
++# ifdef _LP64
++#  define ELFSIZE 64
++# else
++#  define ELFSIZE 32
++# endif
++  /* This macro expands `bits' before invoking ElfBitsW.  */
++# define ElfExpandBitsW(bits, type) ElfBitsW (bits, type)
++# define ElfW(type) ElfExpandBitsW (ELFSIZE, type)
+ #endif
+ #ifndef ELF_BSS_SECTION_NAME
+@@ -462,13 +591,13 @@
+    */
+ #define OLD_SECTION_H(n) \
+-     (*(Elf32_Shdr *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
++     (*(ElfW(Shdr) *) ((byte *) old_section_h + old_file_h->e_shentsize * (n)))
+ #define NEW_SECTION_H(n) \
+-     (*(Elf32_Shdr *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
++     (*(ElfW(Shdr) *) ((byte *) new_section_h + new_file_h->e_shentsize * (n)))
+ #define OLD_PROGRAM_H(n) \
+-     (*(Elf32_Phdr *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
++     (*(ElfW(Phdr) *) ((byte *) old_program_h + old_file_h->e_phentsize * (n)))
+ #define NEW_PROGRAM_H(n) \
+-     (*(Elf32_Phdr *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
++     (*(ElfW(Phdr) *) ((byte *) new_program_h + new_file_h->e_phentsize * (n)))
+ #define PATCH_INDEX(n) \
+   do { \
+@@ -478,9 +607,9 @@
+ /* Round X up to a multiple of Y.  */
+-int
++static ElfW(Addr)
+ round_up (x, y)
+-     int x, y;
++     ElfW(Addr) x, y;
+ {
+   int rem = x % y;
+   if (rem == 0)
+@@ -488,6 +617,45 @@
+   return x - rem + y;
+ }
++/* Return the index of the section named NAME.
++   SECTION_NAMES, FILE_NAME and FILE_H give information
++   about the file we are looking in.
++
++   If we don't find the section NAME, that is a fatal error
++   if NOERROR is 0; we return -1 if NOERROR is nonzero.  */
++
++static int
++find_section (name, section_names, file_name, old_file_h, old_section_h, noerror)
++     char *name;
++     char *section_names;
++     char *file_name;
++     ElfW(Ehdr) *old_file_h;
++     ElfW(Shdr) *old_section_h;
++     int noerror;
++{
++  int idx;
++
++  for (idx = 1; idx < old_file_h->e_shnum; idx++)
++    {
++#ifdef DEBUG
++      fprintf (stderr, "Looking for %s - found %s\n", name,
++             section_names + OLD_SECTION_H (idx).sh_name);
++#endif
++      if (!strcmp (section_names + OLD_SECTION_H (idx).sh_name,
++                 name))
++      break;
++    }
++  if (idx == old_file_h->e_shnum)
++    {
++      if (noerror)
++      return -1;
++      else
++      fatal ("Can't find %s in %s.\n", name, file_name);
++    }
++
++  return idx;
++}
++
+ /* ****************************************************************
+  * unexec
+  *
+@@ -507,25 +675,36 @@
+   /* Pointers to the base of the image of the two files. */
+   caddr_t old_base, new_base;
++#if MAP_ANON == 0
++  int mmap_fd;
++#else
++# define mmap_fd -1
++#endif
++
+   /* Pointers to the file, program and section headers for the old and new
+    * files.
+    */
+-  Elf32_Ehdr *old_file_h, *new_file_h;
+-  Elf32_Phdr *old_program_h, *new_program_h;
+-  Elf32_Shdr *old_section_h, *new_section_h;
++  ElfW(Ehdr) *old_file_h, *new_file_h;
++  ElfW(Phdr) *old_program_h, *new_program_h;
++  ElfW(Shdr) *old_section_h, *new_section_h;
+   /* Point to the section name table in the old file */
+   char *old_section_names;
+-  Elf32_Addr old_bss_addr, new_bss_addr;
+-  Elf32_Word old_bss_size, new_data2_size;
+-  Elf32_Off  new_data2_offset;
+-  Elf32_Addr new_data2_addr;
+-
+-  int n, nn, old_bss_index, old_data_index, new_data2_index;
++  ElfW(Addr) old_bss_addr, new_bss_addr;
++  ElfW(Word) old_bss_size, new_data2_size;
++  ElfW(Off)  new_data2_offset;
++  ElfW(Addr) new_data2_addr;
++
++  int n, nn;
++  int old_bss_index, old_sbss_index;
++  int old_data_index, new_data2_index;
++  int old_mdebug_index;
+   struct stat stat_buf;
++  int old_file_size;
+-  /* Open the old file & map it into the address space. */
++  /* Open the old file, allocate a buffer of the right size, and read
++   * in the file contents. */
+   old_file = open (old_name, O_RDONLY);
+@@ -535,52 +714,80 @@
+   if (fstat (old_file, &stat_buf) == -1)
+     fatal ("Can't fstat (%s): errno %d\n", old_name, errno);
+-  old_base = mmap (0, stat_buf.st_size, PROT_READ, MAP_SHARED, old_file, 0);
++#if MAP_ANON == 0
++  mmap_fd = open ("/dev/zero", O_RDONLY);
++  if (mmap_fd < 0)
++    fatal ("Can't open /dev/zero for reading: errno %d\n", errno);
++#endif
+-  if (old_base == (caddr_t) -1)
+-    fatal ("Can't mmap (%s): errno %d\n", old_name, errno);
++  /* We cannot use malloc here because that may use sbrk.  If it does,
++     we'd dump our temporary buffers with Emacs, and we'd have to be
++     extra careful to use the correct value of sbrk(0) after
++     allocating all buffers in the code below, which we aren't.  */
++  old_file_size = stat_buf.st_size;
++  old_base = mmap (NULL, old_file_size, PROT_READ | PROT_WRITE,
++                 MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++  if (old_base == MAP_FAILED)
++    fatal ("Can't allocate buffer for %s\n", old_name);
+-#ifdef DEBUG
+-  fprintf (stderr, "mmap (%s, %x) -> %x\n", old_name, stat_buf.st_size,
+-         old_base);
+-#endif
++  if (read (old_file, old_base, stat_buf.st_size) != stat_buf.st_size)
++    fatal ("Didn't read all of %s: errno %d\n", old_name, errno);
+   /* Get pointers to headers & section names */
+-  old_file_h = (Elf32_Ehdr *) old_base;
+-  old_program_h = (Elf32_Phdr *) ((byte *) old_base + old_file_h->e_phoff);
+-  old_section_h = (Elf32_Shdr *) ((byte *) old_base + old_file_h->e_shoff);
++  old_file_h = (ElfW(Ehdr) *) old_base;
++  old_program_h = (ElfW(Phdr) *) ((byte *) old_base + old_file_h->e_phoff);
++  old_section_h = (ElfW(Shdr) *) ((byte *) old_base + old_file_h->e_shoff);
+   old_section_names = (char *) old_base
+     + OLD_SECTION_H (old_file_h->e_shstrndx).sh_offset;
++  /* Find the mdebug section, if any.  */
++
++  old_mdebug_index = find_section (".mdebug", old_section_names,
++                                 old_name, old_file_h, old_section_h, 1);
++
+   /* Find the old .bss section.  Figure out parameters of the new
+    * data2 and bss sections.
+    */
+-  for (old_bss_index = 1; old_bss_index < (int) old_file_h->e_shnum;
+-       old_bss_index++)
++  old_bss_index = find_section (".bss", old_section_names,
++                              old_name, old_file_h, old_section_h, 0);
++
++  old_sbss_index = find_section (".sbss", old_section_names,
++                               old_name, old_file_h, old_section_h, 1);
++  if (old_sbss_index != -1)
++    if (OLD_SECTION_H (old_sbss_index).sh_type == SHT_PROGBITS)
++      old_sbss_index = -1;
++
++  if (old_sbss_index == -1)
+     {
+-#ifdef DEBUG
+-      fprintf (stderr, "Looking for .bss - found %s\n",
+-             old_section_names + OLD_SECTION_H (old_bss_index).sh_name);
+-#endif
+-      if (!strcmp (old_section_names + OLD_SECTION_H (old_bss_index).sh_name,
+-                 ELF_BSS_SECTION_NAME))
+-      break;
++      old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
++      old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
++      new_data2_index = old_bss_index;
++    }
++  else
++    {
++      old_bss_addr = OLD_SECTION_H (old_sbss_index).sh_addr;
++      old_bss_size = OLD_SECTION_H (old_bss_index).sh_size
++      + OLD_SECTION_H (old_sbss_index).sh_size;
++      new_data2_index = old_sbss_index;
+     }
+-  if (old_bss_index == old_file_h->e_shnum)
+-    fatal ("Can't find .bss in %s.\n", old_name, 0);
+-  old_bss_addr = OLD_SECTION_H (old_bss_index).sh_addr;
+-  old_bss_size = OLD_SECTION_H (old_bss_index).sh_size;
+-#if defined(emacs) || !defined(DEBUG)
+-  new_bss_addr = (Elf32_Addr) sbrk (0);
++  /* Find the old .data section.  Figure out parameters of
++     the new data2 and bss sections.  */
++
++  old_data_index = find_section (".data", old_section_names,
++                               old_name, old_file_h, old_section_h, 0);
++
++#if defined (emacs) || !defined (DEBUG)
++  new_bss_addr = (ElfW(Addr)) sbrk (0);
+ #else
+   new_bss_addr = old_bss_addr + old_bss_size + 0x1234;
+ #endif
+   new_data2_addr = old_bss_addr;
+   new_data2_size = new_bss_addr - old_bss_addr;
+-  new_data2_offset = OLD_SECTION_H (old_bss_index).sh_offset;
++  new_data2_offset  = OLD_SECTION_H (old_data_index).sh_offset +
++    (new_data2_addr - OLD_SECTION_H (old_data_index).sh_addr);
+ #ifdef DEBUG
+   fprintf (stderr, "old_bss_index %d\n", old_bss_index);
+@@ -595,9 +802,9 @@
+   if ((unsigned) new_bss_addr < (unsigned) old_bss_addr + old_bss_size)
+     fatal (".bss shrank when undumping???\n", 0, 0);
+-  /* Set the output file to the right size and mmap it.  Set
+-   * pointers to various interesting objects.  stat_buf still has
+-   * old_file data.
++  /* Set the output file to the right size.  Allocate a buffer to hold
++   * the image of the new file.  Set pointers to various interesting
++   * objects.  stat_buf still has old_file data.
+    */
+   new_file = open (new_name, O_RDWR | O_CREAT, 0666);
+@@ -609,20 +816,14 @@
+   if (ftruncate (new_file, new_file_size))
+     fatal ("Can't ftruncate (%s): errno %d\n", new_name, errno);
+-#ifdef UNEXEC_USE_MAP_PRIVATE
+-  new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_PRIVATE,
+-                 new_file, 0);
+-#else
+-  new_base = mmap (0, new_file_size, PROT_READ | PROT_WRITE, MAP_SHARED,
+-                 new_file, 0);
+-#endif
+-
+-  if (new_base == (caddr_t) -1)
+-    fatal ("Can't mmap (%s): errno %d\n", new_name, errno);
+-
+-  new_file_h = (Elf32_Ehdr *) new_base;
+-  new_program_h = (Elf32_Phdr *) ((byte *) new_base + old_file_h->e_phoff);
+-  new_section_h = (Elf32_Shdr *)
++  new_base = mmap (NULL, new_file_size, PROT_READ | PROT_WRITE,
++                 MAP_ANON | MAP_PRIVATE, mmap_fd, 0);
++  if (new_base == MAP_FAILED)
++    fatal ("Can't allocate buffer for %s\n", old_name);
++
++  new_file_h = (ElfW(Ehdr) *) new_base;
++  new_program_h = (ElfW(Phdr) *) ((byte *) new_base + old_file_h->e_phoff);
++  new_section_h = (ElfW(Shdr) *)
+     ((byte *) new_base + old_file_h->e_shoff + new_data2_size);
+   /* Make our new file, program and section headers as copies of the
+@@ -661,12 +862,22 @@
+   for (n = new_file_h->e_phnum - 1; n >= 0; n--)
+     {
+       /* Compute maximum of all requirements for alignment of section.  */
+-      int alignment = (NEW_PROGRAM_H (n)).p_align;
++      ElfW(Word) alignment = (NEW_PROGRAM_H (n)).p_align;
+       if ((OLD_SECTION_H (old_bss_index)).sh_addralign > alignment)
+       alignment = OLD_SECTION_H (old_bss_index).sh_addralign;
+-      if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz > old_bss_addr)
+-      fatal ("Program segment above .bss in %s\n", old_name, 0);
++#ifdef __sgi
++        /* According to r02kar@x4u2.desy.de (Karsten Kuenne)
++           and oliva@gnu.org (Alexandre Oliva), on IRIX 5.2, we
++           always get "Program segment above .bss" when dumping
++           when the executable doesn't have an sbss section.  */
++      if (old_sbss_index != -1)
++#endif /* __sgi */
++      if (NEW_PROGRAM_H (n).p_vaddr + NEW_PROGRAM_H (n).p_filesz
++        > (old_sbss_index == -1
++           ? old_bss_addr
++           : round_up (old_bss_addr, alignment)))
++        fatal ("Program segment above .bss in %s\n", old_name, 0);
+       if (NEW_PROGRAM_H (n).p_type == PT_LOAD
+         && (round_up ((NEW_PROGRAM_H (n)).p_vaddr
+@@ -678,7 +889,9 @@
+   if (n < 0)
+     fatal ("Couldn't find segment next to .bss in %s\n", old_name, 0);
+-  NEW_PROGRAM_H (n).p_filesz += new_data2_size;
++  /* Make sure that the size includes any padding before the old .bss
++     section.  */
++  NEW_PROGRAM_H (n).p_filesz = new_bss_addr - NEW_PROGRAM_H (n).p_vaddr;
+   NEW_PROGRAM_H (n).p_memsz = NEW_PROGRAM_H (n).p_filesz;
+ #if 0 /* Maybe allow section after data2 - does this ever happen? */
+@@ -712,12 +925,14 @@
+   for (n = 1, nn = 1; n < (int) old_file_h->e_shnum; n++, nn++)
+     {
+       caddr_t src;
+-      /* If it is bss section, insert the new data2 section before it. */
+-      if (n == old_bss_index)
++      /* If it is (s)bss section, insert the new data2 section before it.  */
++      /* new_data2_index is the index of either old_sbss or old_bss, that was
++       chosen as a section for new_data2.   */
++      if (n == new_data2_index)
+       {
+         /* Steal the data section header for this data2 section. */
+         memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (old_data_index),
+-        new_file_h->e_shentsize);
++                new_file_h->e_shentsize);
+         NEW_SECTION_H (nn).sh_addr = new_data2_addr;
+         NEW_SECTION_H (nn).sh_offset = new_data2_offset;
+@@ -737,13 +952,17 @@
+       memcpy (&NEW_SECTION_H (nn), &OLD_SECTION_H (n),
+             old_file_h->e_shentsize);
+-      /* The new bss section's size is zero, and its file offset and virtual
+-       address should be off by NEW_DATA2_SIZE. */
+-      if (n == old_bss_index)
++      if (n == old_bss_index
++        /* The new bss and sbss section's size is zero, and its file offset
++           and virtual address should be off by NEW_DATA2_SIZE.  */
++        || n == old_sbss_index
++        )
+       {
+-        /* NN should be `old_bss_index + 1' at this point. */
+-        NEW_SECTION_H (nn).sh_offset += new_data2_size;
+-        NEW_SECTION_H (nn).sh_addr += new_data2_size;
++        /* NN should be `old_s?bss_index + 1' at this point. */
++        NEW_SECTION_H (nn).sh_offset =
++          NEW_SECTION_H (new_data2_index).sh_offset + new_data2_size;
++        NEW_SECTION_H (nn).sh_addr =
++          NEW_SECTION_H (new_data2_index).sh_addr + new_data2_size;
+         /* Let the new bss section address alignment be the same as the
+            section address alignment followed the old bss section, so
+            this section will be placed in exactly the same place. */
+@@ -767,7 +986,9 @@
+             >= OLD_SECTION_H (old_bss_index-1).sh_offset)
+           NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #else
+-        if (NEW_SECTION_H (nn).sh_offset >= new_data2_offset)
++        if (round_up (NEW_SECTION_H (nn).sh_offset,
++                      OLD_SECTION_H (old_bss_index).sh_addralign)
++            >= new_data2_offset)
+           NEW_SECTION_H (nn).sh_offset += new_data2_size;
+ #endif
+         /* Any section that was originally placed after the section
+@@ -787,18 +1008,54 @@
+       if (NEW_SECTION_H (nn).sh_type != SHT_SYMTAB
+         && NEW_SECTION_H (nn).sh_type != SHT_DYNSYM)
+       PATCH_INDEX (NEW_SECTION_H (nn).sh_info);
++      
++      if (old_sbss_index != -1)
++      if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".sbss"))
++        {
++          NEW_SECTION_H (nn).sh_offset = 
++            round_up (NEW_SECTION_H (nn).sh_offset,
++                      NEW_SECTION_H (nn).sh_addralign);
++          NEW_SECTION_H (nn).sh_type = SHT_PROGBITS;
++        }
+       /* Now, start to copy the content of sections.  */
+       if (NEW_SECTION_H (nn).sh_type == SHT_NULL
+         || NEW_SECTION_H (nn).sh_type == SHT_NOBITS)
+       continue;
+-  /* Write out the sections. .data and .data1 (and data2, called
++      /* Write out the sections. .data and .data1 (and data2, called
+        ".data" in the strings table) get copied from the current process
+        instead of the old file.  */
+       if (!strcmp (old_section_names + NEW_SECTION_H (n).sh_name, ".data")
+         || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
+-                    ".data1"))
++                    ".sdata")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".lit4")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".lit8")
++        /* The conditional bit below was in Oliva's original code
++           (1999-08-25) and seems to have been dropped by mistake
++           subsequently.  It prevents a crash at startup under X in
++           `IRIX64 6.5 6.5.17m' with c_dev 7.3.1.3m.  It causes no
++           trouble on the other ELF platforms I could test (Irix
++           6.5.15m, Solaris 8, Debian Potato x86, Debian Woody
++           SPARC); however, it's reported to cause crashes under
++           some version of GNU/Linux.  It's not yet clear what's
++           changed in that Irix version to cause the problem, or why
++           the fix sometimes fails under GNU/Linux.  There's
++           probably no good reason to have something Irix-specific
++           here, but this will have to do for now.  IRIX6_5 is the
++           most specific macro we have to test.  -- fx 2002-10-01  */
++#ifdef IRIX6_5
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".got")
++#endif
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".sdata1")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".data1")
++        || !strcmp ((old_section_names + NEW_SECTION_H (n).sh_name),
++                    ".sbss"))
+       src = (caddr_t) OLD_SECTION_H (n).sh_addr;
+       else
+       src = old_base + OLD_SECTION_H (n).sh_offset;
+@@ -806,13 +1063,114 @@
+       memcpy (NEW_SECTION_H (nn).sh_offset + new_base, src,
+             NEW_SECTION_H (nn).sh_size);
++#ifdef __alpha__
++      /* Update Alpha COFF symbol table: */
++      if (strcmp (old_section_names + OLD_SECTION_H (n).sh_name, ".mdebug")
++        == 0)
++      {
++        pHDRR symhdr = (pHDRR) (NEW_SECTION_H (nn).sh_offset + new_base);
++
++        symhdr->cbLineOffset += new_data2_size;
++        symhdr->cbDnOffset += new_data2_size;
++        symhdr->cbPdOffset += new_data2_size;
++        symhdr->cbSymOffset += new_data2_size;
++        symhdr->cbOptOffset += new_data2_size;
++        symhdr->cbAuxOffset += new_data2_size;
++        symhdr->cbSsOffset += new_data2_size;
++        symhdr->cbSsExtOffset += new_data2_size;
++        symhdr->cbFdOffset += new_data2_size;
++        symhdr->cbRfdOffset += new_data2_size;
++        symhdr->cbExtOffset += new_data2_size;
++      }
++#endif /* __alpha__ */
++
++#if defined (__sony_news) && defined (_SYSTYPE_SYSV)
++      if (NEW_SECTION_H (nn).sh_type == SHT_MIPS_DEBUG
++        && old_mdebug_index != -1) 
++        {
++        int diff = NEW_SECTION_H(nn).sh_offset 
++              - OLD_SECTION_H(old_mdebug_index).sh_offset;
++        HDRR *phdr = (HDRR *)(NEW_SECTION_H (nn).sh_offset + new_base);
++
++        if (diff)
++          {
++            phdr->cbLineOffset += diff;
++            phdr->cbDnOffset   += diff;
++            phdr->cbPdOffset   += diff;
++            phdr->cbSymOffset  += diff;
++            phdr->cbOptOffset  += diff;
++            phdr->cbAuxOffset  += diff;
++            phdr->cbSsOffset   += diff;
++            phdr->cbSsExtOffset += diff;
++            phdr->cbFdOffset   += diff;
++            phdr->cbRfdOffset  += diff;
++            phdr->cbExtOffset  += diff;
++          }
++      }
++#endif /* __sony_news && _SYSTYPE_SYSV */
++
++#if __sgi
++      /* Adjust  the HDRR offsets in .mdebug and copy the 
++       line data if it's in its usual 'hole' in the object.
++       Makes the new file debuggable with dbx.
++       patches up two problems: the absolute file offsets
++       in the HDRR record of .mdebug (see /usr/include/syms.h), and
++       the ld bug that gets the line table in a hole in the
++       elf file rather than in the .mdebug section proper.
++       David Anderson. davea@sgi.com  Jan 16,1994.  */
++      if (n == old_mdebug_index)
++      {
++#define MDEBUGADJUST(__ct,__fileaddr)         \
++  if (n_phdrr->__ct > 0)                      \
++    {                                         \
++      n_phdrr->__fileaddr += movement;                \
++    }
++
++        HDRR * o_phdrr = (HDRR *)((byte *)old_base + OLD_SECTION_H (n).sh_offset);
++        HDRR * n_phdrr = (HDRR *)((byte *)new_base + NEW_SECTION_H (nn).sh_offset);
++        unsigned movement = new_data2_size;
++
++        MDEBUGADJUST (idnMax, cbDnOffset);
++        MDEBUGADJUST (ipdMax, cbPdOffset);
++        MDEBUGADJUST (isymMax, cbSymOffset);
++        MDEBUGADJUST (ioptMax, cbOptOffset);
++        MDEBUGADJUST (iauxMax, cbAuxOffset);
++        MDEBUGADJUST (issMax, cbSsOffset);
++        MDEBUGADJUST (issExtMax, cbSsExtOffset);
++        MDEBUGADJUST (ifdMax, cbFdOffset);
++        MDEBUGADJUST (crfd, cbRfdOffset);
++        MDEBUGADJUST (iextMax, cbExtOffset);
++        /* The Line Section, being possible off in a hole of the object,
++           requires special handling.  */
++        if (n_phdrr->cbLine > 0)
++          {
++            if (o_phdrr->cbLineOffset > (OLD_SECTION_H (n).sh_offset
++                                         + OLD_SECTION_H (n).sh_size))
++              {
++                /* line data is in a hole in elf. do special copy and adjust
++                   for this ld mistake.
++                   */
++                n_phdrr->cbLineOffset += movement;
++
++                memcpy (n_phdrr->cbLineOffset + new_base,
++                        o_phdrr->cbLineOffset + old_base, n_phdrr->cbLine);
++              }
++            else
++              {
++                /* somehow line data is in .mdebug as it is supposed to be.  */
++                MDEBUGADJUST (cbLine, cbLineOffset);
++              }
++          }
++      }
++#endif /* __sgi */
++
+       /* If it is the symbol table, its st_shndx field needs to be patched.  */
+       if (NEW_SECTION_H (nn).sh_type == SHT_SYMTAB
+         || NEW_SECTION_H (nn).sh_type == SHT_DYNSYM)
+       {
+-        Elf32_Shdr *spt = &NEW_SECTION_H (nn);
++        ElfW(Shdr) *spt = &NEW_SECTION_H (nn);
+         unsigned int num = spt->sh_size / spt->sh_entsize;
+-        Elf32_Sym * sym = (Elf32_Sym *) (NEW_SECTION_H (nn).sh_offset +
++        ElfW(Sym) * sym = (ElfW(Sym) *) (NEW_SECTION_H (nn).sh_offset +
+                                          new_base);
+         for (; num--; sym++)
+           {
+@@ -830,7 +1188,7 @@
+   for (n = new_file_h->e_shnum - 1; n; n--)
+     {
+       byte *symnames;
+-      Elf32_Sym *symp, *symendp;
++      ElfW(Sym) *symp, *symendp;
+       if (NEW_SECTION_H (n).sh_type != SHT_DYNSYM
+         && NEW_SECTION_H (n).sh_type != SHT_SYMTAB)
+@@ -838,12 +1196,14 @@
+       symnames = ((byte *) new_base
+                 + NEW_SECTION_H (NEW_SECTION_H (n).sh_link).sh_offset);
+-      symp = (Elf32_Sym *) (NEW_SECTION_H (n).sh_offset + new_base);
+-      symendp = (Elf32_Sym *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
++      symp = (ElfW(Sym) *) (NEW_SECTION_H (n).sh_offset + new_base);
++      symendp = (ElfW(Sym) *) ((byte *)symp + NEW_SECTION_H (n).sh_size);
+       for (; symp < symendp; symp ++)
+       if (strcmp ((char *) (symnames + symp->st_name), "_end") == 0
+-          || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0)
++          || strcmp ((char *) (symnames + symp->st_name), "end") == 0
++          || strcmp ((char *) (symnames + symp->st_name), "_edata") == 0
++          || strcmp ((char *) (symnames + symp->st_name), "edata") == 0)
+         memcpy (&symp->st_value, &new_bss_addr, sizeof (new_bss_addr));
+     }
+@@ -851,7 +1211,7 @@
+      that it can undo relocations performed by the runtime linker.  */
+   for (n = new_file_h->e_shnum - 1; n; n--)
+     {
+-      Elf32_Shdr section = NEW_SECTION_H (n);
++      ElfW(Shdr) section = NEW_SECTION_H (n);
+       switch (section.sh_type) {
+       default:
+       break;
+@@ -863,37 +1223,65 @@
+       nn = section.sh_info;
+       if (!strcmp (old_section_names + NEW_SECTION_H (nn).sh_name, ".data")
+           || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".sdata")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".lit4")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".lit8")
++#ifdef IRIX6_5                        /* see above */
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".got")
++#endif
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
++                      ".sdata1")
++          || !strcmp ((old_section_names + NEW_SECTION_H (nn).sh_name),
+                       ".data1"))
+         {
+-          Elf32_Addr offset = NEW_SECTION_H (nn).sh_addr -
++          ElfW(Addr) offset = NEW_SECTION_H (nn).sh_addr -
+             NEW_SECTION_H (nn).sh_offset;
+           caddr_t reloc = old_base + section.sh_offset, end;
+           for (end = reloc + section.sh_size; reloc < end;
+                reloc += section.sh_entsize)
+             {
+-              Elf32_Addr addr = ((Elf32_Rel *) reloc)->r_offset - offset;
+-              memcpy (new_base + addr, old_base + addr, 4);
+-    }
++              ElfW(Addr) addr = ((ElfW(Rel) *) reloc)->r_offset - offset;
++#ifdef __alpha__
++              /* The Alpha ELF binutils currently have a bug that
++                 sometimes results in relocs that contain all
++                 zeroes.  Work around this for now...  */
++              if (((ElfW(Rel) *) reloc)->r_offset == 0)
++                  continue;
++#endif
++              memcpy (new_base + addr, old_base + addr, sizeof(ElfW(Addr)));
++            }
+         }
+       break;
+       }
+     }
+-#ifdef UNEXEC_USE_MAP_PRIVATE
+-  if (lseek (new_file, 0, SEEK_SET) == -1)
+-    fatal ("Can't rewind (%s): errno %d\n", new_name, errno);
++  /* Write out new_file, close it, and free the buffer containing its
++   * contents */
+   if (write (new_file, new_base, new_file_size) != new_file_size)
+-    fatal ("Can't write (%s): errno %d\n", new_name, errno);
+-#endif
++    fatal ("Didn't write %d bytes to %s: errno %d\n", 
++         new_file_size, new_base, errno);
++
++  if (close (new_file))
++    fatal ("Can't close (%s): errno %d\n", new_name, errno);
++
++  munmap (new_base, new_file_size);
+-  /* Close the files and make the new file executable.  */
++  /* Close old_file, and free the corresponding buffer */
++
++#if MAP_ANON == 0
++  close (mmap_fd);
++#endif
+   if (close (old_file))
+     fatal ("Can't close (%s): errno %d\n", old_name, errno);
+-  if (close (new_file))
+-    fatal ("Can't close (%s): errno %d\n", new_name, errno);
++  munmap (old_base, old_file_size);
++
++  /* Make the new file executable */
+   if (stat (new_name, &stat_buf) == -1)
+     fatal ("Can't stat (%s): errno %d\n", new_name, errno);