diff --git a/src/main.c b/src/main.c
index 7041adbb198a408933984b4c7364d3e1ce54333a..eaa105ac3ffb865beb794c8fec1f6194a471ef2b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: main.c,v 1.57 1998/08/10 23:33:30 hubbe Exp $");
+RCSID("$Id: main.c,v 1.58 1998/09/02 01:05:45 grubba Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include "module.h"
@@ -323,6 +323,24 @@ int dbm_main(int argc, char **argv)
 #define RLIMIT_NOFILE RLIMIT_OFILE
 #endif
 
+  stack_top = (char *)&argv;
+
+  /* Adjust for anything already pushed on the stack.
+   * We align on a 64 KB boundary.
+   * Thus we at worst, lose 64 KB stack.
+   *
+   * We have to do it this way since some compilers don't like
+   * & and | on pointers, and casting to an integer type is
+   * too unsafe (consider 64-bit systems).
+   */
+#if STACK_DIRECTION < 0
+  /* Equvivalent with |= 0xffff */
+  stack_top += (~((unsigned long)stack_top)) & 0xffff;
+#else /* STACK_DIRECTION >= 0 */
+  /* Equvivalent with &= ~0xffff */
+  stack_top -= ( ((unsigned long)stack_top)) & 0xffff;
+#endif /* STACK_DIRECTION < 0 */
+
 #if defined(HAVE_GETRLIMIT) && defined(RLIMIT_STACK)
   {
     struct rlimit lim;
@@ -332,14 +350,22 @@ int dbm_main(int argc, char **argv)
       if(lim.rlim_cur == RLIM_INFINITY)
 	lim.rlim_cur=1024*1024*128;
 #endif
-      stack_top= ((char *) &argv) + 
-	STACK_DIRECTION * (lim.rlim_cur - 8192 * sizeof(char *));
+      stack_top += STACK_DIRECTION * (lim.rlim_cur - 8192 * sizeof(char *));
+
+#ifdef STACK_DEBUG
+      fprintf(stderr, "1: C-stack: 0x%08p - 0x%08p, direction:%d\n",
+	      &argv, stack_top, STACK_DIRECTION);
+#endif /* STACK_DEBUG */
     }
   }
-#else
-  stack_top= ((char *) &argv) + 
-    STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *));
-#endif
+#else /* !HAVE_GETRLIMIT || !RLIMIT_STACK */
+  /* 128 MB seems a bit extreme, most OS's seem to have their limit at ~8MB */
+  stack_top += STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *));
+#ifdef STACK_DEBUG
+  fprintf(stderr, "2: C-stack: 0x%08p - 0x%08p, direction:%d\n",
+	  &argv, stack_top, STACK_DIRECTION);
+#endif /* STACK_DEBUG */
+#endif /* HAVE_GETRLIMIT && RLIMIT_STACK */
 
 #if defined(HAVE_SETRLIMIT) && defined(RLIMIT_NOFILE)
   {