diff options
-rw-r--r-- | app-editors/emacs/ChangeLog | 11 | ||||
-rw-r--r-- | app-editors/emacs/Manifest | 45 | ||||
-rw-r--r-- | app-editors/emacs/emacs-18.59-r1.ebuild | 104 | ||||
-rw-r--r-- | app-editors/emacs/files/digest-emacs-18.59-r1 | 6 | ||||
-rw-r--r-- | app-editors/emacs/files/digest-emacs-22.0.50_pre20050225 | 4 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-gcc4.patch | 1105 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-gentoo.patch | 96 | ||||
-rw-r--r-- | app-editors/emacs/files/emacs-18.59-unexelf.patch | 878 |
8 files changed, 2236 insertions, 13 deletions
diff --git a/app-editors/emacs/ChangeLog b/app-editors/emacs/ChangeLog index f038c925347f..eec8e5af7111 100644 --- a/app-editors/emacs/ChangeLog +++ b/app-editors/emacs/ChangeLog @@ -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 diff --git a/app-editors/emacs/Manifest b/app-editors/emacs/Manifest index 41e25e5e4c82..5e6e32f5350d 100644 --- a/app-editors/emacs/Manifest +++ b/app-editors/emacs/Manifest @@ -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 index 000000000000..910df2f424cd --- /dev/null +++ b/app-editors/emacs/emacs-18.59-r1.ebuild @@ -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 index 000000000000..0b6bbff1ba52 --- /dev/null +++ b/app-editors/emacs/files/digest-emacs-18.59-r1 @@ -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 diff --git a/app-editors/emacs/files/digest-emacs-22.0.50_pre20050225 b/app-editors/emacs/files/digest-emacs-22.0.50_pre20050225 index 044549ed740a..9956386abf6b 100644 --- a/app-editors/emacs/files/digest-emacs-22.0.50_pre20050225 +++ b/app-editors/emacs/files/digest-emacs-22.0.50_pre20050225 @@ -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 index 000000000000..ce04f397910a --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-gcc4.patch @@ -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 */ + + 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 */ + + 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 */ + + 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 @@ + } + } + +-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 @@ + + /* 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 @@ + } + + +-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) + + /* Utilities */ + +@@ -564,7 +557,6 @@ + return; + } + +-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 index 000000000000..0b6d94acd981 --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-gentoo.patch @@ -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 index 000000000000..66aa78a7f01b --- /dev/null +++ b/app-editors/emacs/files/emacs-18.59-unexelf.patch @@ -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 @@ + + */ + ++/* ++ * 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. ++ */ ++ ++#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); |