Description: Misc fixes for 32-bit builds.
 This contains fixes that are required to build 32-bit packages on a 64-bit
 kernel. This patch has been applied upstream.
Author: Kapil Arya <kapil@ccs.neu.edu>
The information above should follow the Patch Tagging Guidelines, please
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
are templates for supplementary fields that you might want to add:

Reviewed-By: <name and email of someone who approved the patch>
Applied-Upstream: commit:1479
Last-Update: 2012-02-13

--- dmtcp-1.2.4.orig/test/autotest.py
+++ dmtcp-1.2.4/test/autotest.py
@@ -199,6 +199,8 @@ def launch(cmd):
       os.close(fd1); os.close(fd2)
     (pid, fd) = pty.fork()
     if pid == 0:
+      # Close all fds except stdin/stdout/stderr
+      os.closerange(3,1024)
       signal.alarm(300) # pending alarm inherited across exec, but not a fork
       # Problem:  pty.spawn invokes fork.  alarm() will have no effect.
       pty.spawn(cmd, master_read)
--- dmtcp-1.2.4.orig/dmtcp/src/mtcpinterface.cpp
+++ dmtcp-1.2.4/dmtcp/src/mtcpinterface.cpp
@@ -44,13 +44,6 @@
 #include "../jalib/jassert.h"
 #include "../jalib/jalloc.h"
 
-#ifdef __x86_64__
-# define MTCP_RESTORE_STACK_BASE ((char*)0x7FFFFFFFF000L)
-#else
-# define MTCP_RESTORE_STACK_BASE \
-    (strcmp("#CONFIG_M32","yes") == 0 ? ((char *)NULL) : ((char*)0xC0000000L))
-#endif
-
 #ifdef DEBUG
 static int debugEnabled = 1;
 #else
@@ -467,12 +460,14 @@ static void restoreArgvAfterRestart(char
   long page_size = sysconf(_SC_PAGESIZE);
   long page_mask = ~(page_size - 1);
   char *startAddr = (char*) ((unsigned long) mtcpRestoreArgvStartAddr & page_mask);
-  char *endAddr = MTCP_RESTORE_STACK_BASE;
-  size_t len = endAddr - startAddr;
+  //char *endAddr = MTCP_RESTORE_STACK_BASE;
+  //size_t len = 0;// endAddr - startAddr;
 #ifdef CONFIG_M32
   return;
 #endif
 
+  size_t len = (dmtcp::DmtcpWorker::argvSize() + page_size) & page_mask;
+
   // Check to verify if any page in the given range is already mmap()'d.
   // It assumes that the given addresses may belong to stack only and if
   // mapped, will have read+write permissions.
@@ -496,7 +491,7 @@ static void restoreArgvAfterRestart(char
     // Do NOT change restarted process's /proc/self/cmdline.
     //args[0] = DMTCP_PRGNAME_PREFIX + args[0];
     for ( size_t i=0; i< args.size(); ++i ) {
-      if (addr + args[i].length() >= endAddr)
+      if (addr + args[i].length() >= startAddr + len)
         break;
       strcpy(addr, args[i].c_str());
       addr += args[i].length() + 1;
@@ -511,10 +506,13 @@ static void restoreArgvAfterRestart(char
 
 static void unmapRestoreArgv()
 {
+  long page_size = sysconf(_SC_PAGESIZE);
+  long page_mask = ~(page_size - 1);
   if (_mtcpRestoreArgvStartAddr != NULL) {
     JTRACE("Unmapping previously mmap()'d pages (that were mmap()'d for restoring argv");
-    char *endAddr = MTCP_RESTORE_STACK_BASE;
-    size_t len = endAddr - _mtcpRestoreArgvStartAddr;
+    //char *endAddr = MTCP_RESTORE_STACK_BASE;
+    //size_t len = endAddr - _mtcpRestoreArgvStartAddr;
+    size_t len = (dmtcp::DmtcpWorker::argvSize() + page_size) & page_mask;
     JASSERT(_real_munmap(_mtcpRestoreArgvStartAddr, len) == 0)
       (_mtcpRestoreArgvStartAddr) (len)
       .Text ("Failed to munmap extra pages that were mapped during restart");
--- dmtcp-1.2.4.orig/dmtcp/src/pidwrappers.cpp
+++ dmtcp-1.2.4/dmtcp/src/pidwrappers.cpp
@@ -321,6 +321,7 @@ int tgkill(int tgid, int tid, int sig)
 
 //long sys_tgkill (int tgid, int pid, int sig)
 
+#ifdef PTRACE
 typedef td_err_e (*td_thr_get_info_funcptr_t)(const td_thrhandle_t *,
                                               td_thrinfo_t *);
 static td_thr_get_info_funcptr_t _td_thr_get_info_funcptr = NULL;
@@ -354,6 +355,7 @@ extern "C" void *dlsym ( void *handle, c
   else
     return _real_dlsym ( handle, symbol );
 }
+#endif
 
 /*
  * TODO: Add the wrapper protection for wait() family of system calls.
