diff --git a/src/BACKEND_DIRS b/src/BACKEND_DIRS
index 371dc0243385d9275ac56d8365893449e0091a08..d61efea704a7c435b627e125fbe48f2f9edda126 100644
--- a/src/BACKEND_DIRS
+++ b/src/BACKEND_DIRS
@@ -52,13 +52,12 @@ port/BSD44_derived
 port/aix
 port/alpha
 port/bsdi
-port/bsdi_2_1
 port/dgux
 port/hpux
 port/i386_solaris
 port/irix5
 port/linux
-port/sparc
+port/sunos4
 port/sparc_solaris
 port/svr4
 port/ultrix4
diff --git a/src/Makefile.global b/src/Makefile.global
index 828673fe2e82c99c33bb697b9ae70e7eec969d61..9af08a442719cd1cb8612597fb9437bc5b421d20 100644
--- a/src/Makefile.global
+++ b/src/Makefile.global
@@ -7,7 +7,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/Attic/Makefile.global,v 1.75 1996/11/27 08:13:44 bryanh Exp $
+#    $Header: /cvsroot/pgsql/src/Attic/Makefile.global,v 1.76 1996/12/04 03:05:45 bryanh Exp $
 #
 # NOTES
 #    Essentially all Postgres make files include this file and use the 
@@ -42,7 +42,7 @@
 #   hpux           HP PA-RISC on HP-UX 9.0
 #   i386_solaris   i386 Solaris
 #   sparc_solaris  SUN SPARC on Solaris 2.4
-#   sparc          SUN SPARC on SunOS 4.1.3
+#   sunos4          SUN SPARC on SunOS 4.1.3
 #   ultrix4        DEC MIPS on Ultrix 4.4
 #   linux          Intel x86 on Linux 1.2 and Linux ELF
 #                  (For non-ELF Linux, see LINUX_ELF below).
@@ -582,7 +582,7 @@ endif
 
 #---------------------------------------------------------------------------
 
-ifeq ($(PORTNAME), sparc)
+ifeq ($(PORTNAME), sunos4)
 # cc won't work!
 CC= gcc
 
diff --git a/src/backend/access/common/heaptuple.c b/src/backend/access/common/heaptuple.c
index b516e5beaba7bdd6183dc6ef88a129b5f7e749e8..ccaaba603339fe2b1f8064cbdfcd1e517099a383 100644
--- a/src/backend/access/common/heaptuple.c
+++ b/src/backend/access/common/heaptuple.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.16 1996/11/10 02:56:41 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.17 1996/12/04 03:05:55 bryanh Exp $
  *
  * NOTES
  *    The old interface functions have been converted to macros
@@ -35,9 +35,9 @@
 
 /* this is so the sparcstation debugger works */
 
-#if !defined(NO_ASSERT_CHECKING) && defined(sparc)
+#if !defined(NO_ASSERT_CHECKING) && defined(sparc) && defined(sunos4)
 #define register
-#endif /* !NO_ASSERT_CHECKING && sparc */
+#endif /* !NO_ASSERT_CHECKING && sparc && sunos4 */
 
 /* ----------------------------------------------------------------
  *			misc support routines
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index d112c989f73dcadbd945889e58bf4e2644582ea9..d02ffcf19f9f20895a039a46d884b9d6de1e98f7 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -6,7 +6,7 @@
  * Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *    $Id: fd.c,v 1.9 1996/11/08 05:58:21 momjian Exp $
+ *    $Id: fd.c,v 1.10 1996/12/04 03:05:58 bryanh Exp $
  *
  * NOTES:
  *
@@ -52,24 +52,20 @@
 #include "utils/palloc.h"
 #include "storage/fd.h"
 
-#ifdef sparc
+#if defined(NEED_NOFILE_KLUDGE)
 /*
  * the SunOS 4 NOFILE is a lie, because the default limit is *not* the
  * maximum number of file descriptors you can have open.
  *
  * we have to either use this number (the default dtablesize) or
  * explicitly call setrlimit(RLIMIT_NOFILE, NOFILE).
+ *
+ * this braindamage apparently also affects solaris 2.X as well
  */
 #include <sys/user.h>
 #undef NOFILE
 #define NOFILE NOFILE_IN_U
-#endif /* sparc */
-
-#if defined(sparc_solaris) || defined(i386_solaris)
-#include <sys/user.h>
-#undef NOFILE
-#define NOFILE 64
-#endif /* sparc_solaris || i386_solaris */
+#endif /* NEED_NOFILE_KLUDGE */
 
 /*
  * Problem: Postgres does a system(ld...) to do dynamic loading.  This
diff --git a/src/backend/storage/ipc/s_lock.c b/src/backend/storage/ipc/s_lock.c
index 76e4ea7cc683a66b1702d44250fc5a52b4733856..68cda57674339851e85883a9c71748975a5002c6 100644
--- a/src/backend/storage/ipc/s_lock.c
+++ b/src/backend/storage/ipc/s_lock.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/s_lock.c,v 1.8 1996/11/10 03:02:26 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/storage/ipc/Attic/s_lock.c,v 1.9 1996/12/04 03:06:04 bryanh Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -266,7 +266,7 @@ S_LOCK_FREE(slock_t *lock)
  * sun3
  */
  
-#if (defined(sun3) && ! defined(sparc))
+#if defined(sun3)
 
 void    
 S_LOCK(slock_t *lock)
@@ -307,13 +307,13 @@ tas_dummy()
     asm("	.data");
 }
 
-#endif
+#endif /* sun3 */
 
 /*
- * SPARC (SunOS 4)
+ * sparc machines
  */
 
-#if defined(sparc) && !defined(sparc_solaris)
+#if defined(NEED_SPARC_TAS_ASM)
 
 /* if we're using -ansi w/ gcc, use __asm__ instead of asm */
 #if defined(__STRICT_ANSI__)
@@ -375,18 +375,14 @@ S_INIT_LOCK(unsigned char *addr)
     *addr = 0;
 }
 
-#endif /* sparc */
+#endif /* NEED_SPARC_TAS_ASM */
 
 /*
- * Linux and friends
+ * i386 based things
  */
 
-#if defined(BSD44_derived) || \
-    defined(bsdi) || \
-    defined(bsdi_2_1) || \
-    defined(linux)
+#if defined(NEED_I386_TAS_ASM)
 
-    
 int
 tas(slock_t *m)
 {
@@ -414,7 +410,7 @@ S_INIT_LOCK(slock_t *lock)
     S_UNLOCK(lock);
 }
 
-#endif /* linux and friends */
+#endif /* NEED_I386_TAS_ASM */
 
 
 #endif /* HAS_TEST_AND_SET */
diff --git a/src/backend/utils/cache/catcache.c b/src/backend/utils/cache/catcache.c
index aa3616390c45025f9214d39dc0f8ce37e2c7103f..6cba6487512bdb21f49177d5058675fe9069c503 100644
--- a/src/backend/utils/cache/catcache.c
+++ b/src/backend/utils/cache/catcache.c
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.5 1996/11/13 20:50:04 scrappy Exp $
+ *    $Header: /cvsroot/pgsql/src/backend/utils/cache/catcache.c,v 1.6 1996/12/04 03:06:09 bryanh Exp $
  *
  * Notes:
  *	XXX This needs to use exception.h to handle recovery when
@@ -740,7 +740,7 @@ SearchSysCache(struct catcache *cache,
 	       Datum v4)
 {
     unsigned	hash;
-    CatCTup	*ct; 
+    CatCTup	*ct = NULL; 
     CatCTup	*nct; 
     CatCTup	*nct2; 
     Dlelem      *elt;
diff --git a/src/bin/psql/Makefile b/src/bin/psql/Makefile
index d67aade69ba89a69b88d819124ba80894878584b..24a202173002cdfb47b265c10c42ec7183ac314b 100644
--- a/src/bin/psql/Makefile
+++ b/src/bin/psql/Makefile
@@ -7,7 +7,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/psql/Makefile,v 1.15 1996/11/26 07:38:24 bryanh Exp $
+#    $Header: /cvsroot/pgsql/src/bin/psql/Makefile,v 1.16 1996/12/04 03:06:16 bryanh Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -32,7 +32,7 @@ ifeq ($(USE_READLINE), true)
    ifeq ($(PORTNAME), ultrix4)
    LD_ADD+= -ltermcap
    else
-   ifeq ($(PORTNAME), sparc)
+   ifeq ($(PORTNAME), sunos4)
    LD_ADD+= -ltermcap
    else
    ifeq ($(PORTNAME), linux)
diff --git a/src/include/c.h b/src/include/c.h
index a4ba01ad3b97bf3a3a9cd63b11ecd3107b224b6c..1ba94d04a6cf538f2dbef9bd7b2aa00ae679d88c 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -7,7 +7,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: c.h,v 1.4 1996/11/14 06:06:39 bryanh Exp $
+ * $Id: c.h,v 1.5 1996/12/04 03:06:21 bryanh Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -747,7 +747,7 @@ extern char *form(char *fmt, ...);
 #include "port/hpux/fixade.h"		/* for 8.07 unaligned access fixup */
 #endif /* hpux */
 
-#if defined(sparc) && !defined(sparc_solaris)
+#if defined(sunos4)
 #define	memmove(d, s, l)	bcopy(s, d, l)
 #endif
 
diff --git a/src/include/config.h b/src/include/config.h
index b51e4b0ae70a34ae1cc06921c14001161a8f78e2..f28a51c012710193c8274f9db31b6521d4664b30 100644
--- a/src/include/config.h
+++ b/src/include/config.h
@@ -25,6 +25,9 @@
 #  define NEED_SYS_SELECT_H
 #  define HAVE_TZSET
 #  define HAVE_ANSI_CPP
+#  define SB_PAD 44
+#  define HAS_TEST_AND_SET
+   typedef unsigned int slock_t;
 #endif
 
 #if defined(alpha)
@@ -34,18 +37,44 @@
 #  define NEED_ISINF 
 #  define HAS_LONG_LONG
 #  define NEED_UNION_SEMUN 
+#  define SB_PAD 40
+#  define HAS_TEST_AND_SET
+   typedef msemaphore slock_t;
 #endif
 
-#if defined(BSD44_derived) || \
-    defined(bsdi)
+#if defined(BSD44_derived)
 #  define USE_LIMITS_H
 #  define USE_POSIX_TIME
 #  define NEED_CBRT
+#  define NEED_I386_TAS_ASM
+#  define SB_PAD 56
+#  define HAS_TEST_AND_SET
+#  if defined(__mips__)
+#    undef HAS_TEST_AND_SET
+#  endif
+   typedef unsigned char slock_t;
+#endif
+
+#if defined(bsdi)
+#  if defined(i386)
+#    define NEED_I386_TAS_ASM
+#    define SB_PAD 56
+#  endif
+#  if defined(sparc)
+#    define NEED_SPARC_TAS_ASM
+#    define SB_PAD 56
+#  endif
 #  if defined(PRE_BSDI_2_1)
 #    define NEED_UNION_SEMUN 
 #  endif
+#  define USE_LIMITS_H
+#  define USE_POSIX_TIME
+#  define NEED_CBRT
+#  define HAS_TEST_AND_SET
+   typedef unsigned char slock_t;
 #endif
 
+
 #if defined(dgux)
 #  define LINUX_ELF
 #  define NEED_UNION_SEMUN 
@@ -60,6 +89,9 @@
 #  define NEED_CBRT
 #  define NEED_RINT
 #  define NEED_UNION_SEMUN 
+#  define SB_PAD 44
+#  define HAS_TEST_AND_SET
+   typedef struct { int sem[4]; } slock_t;
 #endif
 
 #if defined(i386_solaris) 
@@ -71,6 +103,10 @@
 #  define HAVE_TZSET
 #  define NEED_UNION_SEMUN 
 #  define SYSV_DIRENT
+#  define NEED_NOFILE_KLUDGE
+#  define SB_PAD 56
+#  define HAS_TEST_AND_SET
+   typedef unsigned char slock_t;
 #endif
 
 #if defined(irix5)
@@ -81,6 +117,9 @@
 #  define NO_VFORK
 #  define HAVE_TZSET
 #  define SYSV_DIRENT
+#  define SB_PAD 44
+#  define HAS_TEST_AND_SET
+   typedef abilock_t slock_t;
 #endif
 
 #if defined(linux)
@@ -94,22 +133,24 @@
 #  define USE_POSIX_TIME
 #  define HAVE_TZSET
 #  define NEED_CBRT
+#  define NEED_I386_TAS_ASM
+#  define SB_PAD 56
+#  define HAS_TEST_AND_SET
+   typedef unsigned char slock_t;
 #endif
 
+/* does anybody use this? */
 #if defined(next)
 #  define SIGJMP_BUF
 #  define NEED_SIG_JMP
+#  define SB_PAD 56
+   typedef struct mutex    slock_t;
 #endif
 
 #if defined(sequent) 
 #  define NEED_UNION_SEMUN 
 #endif
 
-#if defined(sparc) && !defined(sparc_solaris)
-#  define USE_POSIX_TIME
-#  undef HAVE_MEMMOVE
-#endif
-
 #if defined(sparc_solaris)
 #  define USE_POSIX_TIME 
 #  define USE_POSIX_SIGNALS
@@ -120,6 +161,15 @@
 #  define HAVE_TZSET
 #  define NEED_UNION_SEMUN 
 #  define SYSV_DIRENT
+#  define NEED_NOFILE_KLUDGE
+#  define SB_PAD 56
+#endif
+
+#if defined(sunos4)
+#  define USE_POSIX_TIME
+#  define NEED_NOFILE_KLUDGE
+#  define SB_PAD 56
+#  undef HAVE_MEMMOVE
 #endif
 
 #if defined(svr4) 
@@ -150,6 +200,7 @@
 #  define USE_POSIX_TIME
 #  define NEED_UNION_SEMUN 
 #  define NEED_STRDUP
+#  define SB_PAD 60
 #endif
 
 
diff --git a/src/include/storage/buf_internals.h b/src/include/storage/buf_internals.h
index af7a57d0d9a5e241743a45bc80a7febbd12a1555..963c887ebc896b31750ed30fd940904247656b55 100644
--- a/src/include/storage/buf_internals.h
+++ b/src/include/storage/buf_internals.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: buf_internals.h,v 1.6 1996/11/10 03:05:53 momjian Exp $
+ * $Id: buf_internals.h,v 1.7 1996/12/04 03:06:27 bryanh Exp $
  *
  * NOTE
  *	If BUFFERPAGE0 is defined, then 0 will be used as a
@@ -130,40 +130,11 @@ struct sbufdesc {
      * going to make some of these types bigger soon anyway... -pma 1/2/93
      */
 
-/* NO spinlock */
-
-#if defined(ultrix4)
-    char		sb_pad[60];	/* no slock_t */
-#endif /* mips */
-
-/* HAS_TEST_AND_SET -- platform dependent size */
-
-#if defined(aix)
-    char		sb_pad[44];	/* typedef unsigned int slock_t; */
-#endif /* aix */
-#if defined(alpha)
-    char		sb_pad[40];	/* typedef msemaphore slock_t; */
-#endif /* alpha */
-#if defined(hpux)
-    char		sb_pad[44];	/* typedef struct { int sem[4]; } slock_t; */
-#endif /* hpux */
-#if defined(irix5)
-    char		sb_pad[44];	/* typedef abilock_t slock_t; */
-#endif /* irix5 */
-#if defined(next)
-    char		sb_pad[56];	/* typedef struct mutex slock_t; */
-#endif /* next */
-
-/* HAS_TEST_AND_SET -- default 1 byte spinlock */
-
-#if defined(BSD44_derived) || \
-    defined(bsdi) || \
-    defined(i386_solaris) || \
-    defined(linux) || \
-    defined(sparc) || \
-    defined(sparc_solaris)
-    char		sb_pad[56];	/* has slock_t */
-#endif /* 1 byte slock_t */
+    /*
+     * NOTE: This is now defined in the ..../include/config.h file!
+     */
+
+    char		sb_pad[SB_PAD];
 };
 
 /*
diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h
index 1fc38b81b82d8c4f018cdeac2b38974409b31011..85f24cecb271d9ab382f799606cc84750e0adf93 100644
--- a/src/include/storage/ipc.h
+++ b/src/include/storage/ipc.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: ipc.h,v 1.10 1996/11/27 08:16:38 bryanh Exp $
+ * $Id: ipc.h,v 1.11 1996/12/04 03:06:29 bryanh Exp $
  *
  * NOTES
  *    This file is very architecture-specific.  This stuff should actually
@@ -24,78 +24,10 @@
 #include <sys/types.h>
 #include <sys/ipc.h>   /* For IPC_PRIVATE */
 
-/*
- * Many architectures have support for user-level spinlocks (i.e., an
- * atomic test-and-set instruction).  However, we have only written
- * spinlock code for the architectures listed.
- * NB: for operating systems like NetBSD (covered by BSD44_derived),
- *     we may in fact have different architectures, thus make the tests
- *     based on portnames somewhat misleading.
- */
-#if defined(aix) || \
-    defined(alpha) || \
-    defined(BSD44_derived) || \
-    defined(bsdi) || \
-    defined(hpux) || \
-    defined(i386_solaris) || \
-    defined(irix5) || \
-    defined(linux) || \
-    defined(next) || \
-    defined(sparc) || \
-    defined(sparc_solaris)
-#define HAS_TEST_AND_SET
-#endif
-
-#if defined(BSD44_derived) && defined(__mips__)
-#undef HAS_TEST_AND_SET
-#endif
+#include <config.h>
 
 #if defined(HAS_TEST_AND_SET)
 
-#if defined(aix)
-/*
- * The AIX C library has the cs(3) builtin for compare-and-set that 
- * operates on ints.
- */
-typedef unsigned int	slock_t;
-#else /* aix */
-
-#if defined(alpha)
-typedef msemaphore	slock_t;
-#else /* alpha */
-
-#if defined(hpux)
-/*
- * The PA-RISC "semaphore" for the LDWCX instruction is 4 bytes aligned
- * to a 16-byte boundary.
- */
-typedef struct { int sem[4]; } slock_t;
-#else /* hpux */
-
-#if defined(irix5)
-typedef abilock_t	slock_t;
-#else /* irix5 */
-
-#if defined(next)
-/*
- * Use Mach mutex routines since these are, in effect, test-and-set
- * spinlocks.
- */
-#undef NEVER	/* definition in cthreads.h conflicts with parse.h */
-typedef struct mutex	slock_t;
-#else /* next */
-
-/*
- * On all other architectures spinlocks are a single byte.
- */
-typedef unsigned char   slock_t;
-
-#endif /* next */
-#endif /* irix5 */
-#endif /* hpux */
-#endif /* alpha */
-#endif /* aix */
-
 extern void S_LOCK(slock_t *lock);
 extern void S_UNLOCK(slock_t *lock);
 extern void S_INIT_LOCK(slock_t *lock);
diff --git a/src/interfaces/libpq/libpq-fe.h b/src/interfaces/libpq/libpq-fe.h
index 518414b5061874f9d124199fc4ae6fdfc5035779..b781e580060428df10992d805d48f9ac7ce15cc8 100644
--- a/src/interfaces/libpq/libpq-fe.h
+++ b/src/interfaces/libpq/libpq-fe.h
@@ -6,7 +6,7 @@
  *
  * Copyright (c) 1994, Regents of the University of California
  *
- * $Id: libpq-fe.h,v 1.13 1996/11/22 04:39:53 bryanh Exp $
+ * $Id: libpq-fe.h,v 1.14 1996/12/04 03:06:33 bryanh Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -298,10 +298,10 @@ typedef void *TUPLE;
 #define palloc malloc
 #define pfree free
 
-#if defined(sparc)
+#if defined(sunos4)
 extern char *sys_errlist[];
 #define strerror(A) (sys_errlist[(A)])
-#endif /* sparc */
+#endif /* sunos4 */
 
 #ifdef __cplusplus
 };