2013-08-21 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / inf-child.c
index 5531102314bcc15ff3caf22973eb63136828abbf..f5992bb1f1615e18301c73d44a6210401a9edcdf 100644 (file)
@@ -1,8 +1,7 @@
 /* Default child (native) target interface, for GDB when running under
    Unix.
 
-   Copyright (C) 1988-1996, 1998-2002, 2004-2005, 2007-2012 Free
-   Software Foundation, Inc.
+   Copyright (C) 1988-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "inf-child.h"
 #include "gdb/fileio.h"
 #include "agent.h"
+#include "gdb_wait.h"
+#include "filestuff.h"
 
-#ifdef HAVE_SYS_PARAM_H
-#include <sys/param.h>         /* for MAXPATHLEN */
-#endif
 #include <sys/types.h>
 #include <fcntl.h>
 #include <unistd.h>
 
+/* Helper function for child_wait and the derivatives of child_wait.
+   HOSTSTATUS is the waitstatus from wait() or the equivalent; store our
+   translation of that in OURSTATUS.  */
+void
+store_waitstatus (struct target_waitstatus *ourstatus, int hoststatus)
+{
+  if (WIFEXITED (hoststatus))
+    {
+      ourstatus->kind = TARGET_WAITKIND_EXITED;
+      ourstatus->value.integer = WEXITSTATUS (hoststatus);
+    }
+  else if (!WIFSTOPPED (hoststatus))
+    {
+      ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
+      ourstatus->value.sig = gdb_signal_from_host (WTERMSIG (hoststatus));
+    }
+  else
+    {
+      ourstatus->kind = TARGET_WAITKIND_STOPPED;
+      ourstatus->value.sig = gdb_signal_from_host (WSTOPSIG (hoststatus));
+    }
+}
+
 /* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
    for all registers.  */
 
@@ -222,7 +243,7 @@ inf_child_fileio_open (const char *filename, int flags, int mode,
 
   /* We do not need to convert MODE, since the fileio protocol uses
      the standard values.  */
-  fd = open (filename, nat_flags, mode);
+  fd = gdb_open_cloexec (filename, nat_flags, mode);
   if (fd == -1)
     *target_errno = inf_child_errno_to_fileio_error (errno);
 
@@ -241,10 +262,15 @@ inf_child_fileio_pwrite (int fd, const gdb_byte *write_buf, int len,
 #ifdef HAVE_PWRITE
   ret = pwrite (fd, write_buf, len, (long) offset);
 #else
-  ret = lseek (fd, (long) offset, SEEK_SET);
-  if (ret != -1)
-    ret = write (fd, write_buf, len);
+  ret = -1;
 #endif
+  /* If we have no pwrite or it failed for this file, use lseek/write.  */
+  if (ret == -1)
+    {
+      ret = lseek (fd, (long) offset, SEEK_SET);
+      if (ret != -1)
+       ret = write (fd, write_buf, len);
+    }
 
   if (ret == -1)
     *target_errno = inf_child_errno_to_fileio_error (errno);
@@ -264,10 +290,15 @@ inf_child_fileio_pread (int fd, gdb_byte *read_buf, int len,
 #ifdef HAVE_PREAD
   ret = pread (fd, read_buf, len, (long) offset);
 #else
-  ret = lseek (fd, (long) offset, SEEK_SET);
-  if (ret != -1)
-    ret = read (fd, read_buf, len);
+  ret = -1;
 #endif
+  /* If we have no pread or it failed for this file, use lseek/read.  */
+  if (ret == -1)
+    {
+      ret = lseek (fd, (long) offset, SEEK_SET);
+      if (ret != -1)
+       ret = read (fd, read_buf, len);
+    }
 
   if (ret == -1)
     *target_errno = inf_child_errno_to_fileio_error (errno);
@@ -310,9 +341,9 @@ static char *
 inf_child_fileio_readlink (const char *filename, int *target_errno)
 {
   /* We support readlink only on systems that also provide a compile-time
-     maximum path length (MAXPATHLEN), at least for now.  */
-#if defined (HAVE_READLINK) && defined (MAXPATHLEN)
-  char buf[MAXPATHLEN];
+     maximum path length (PATH_MAX), at least for now.  */
+#if defined (HAVE_READLINK) && defined (PATH_MAX)
+  char buf[PATH_MAX];
   int len;
   char *ret;
 
This page took 0.02612 seconds and 4 git commands to generate.