* gdb.threads/gcore-thread.exp: Use gdb_gcore_cmd.
[deliverable/binutils-gdb.git] / gdb / inf-child.c
index 0dda33151876d82e2d9e426cdf34b11171cd0c51..ae2dd1e10128165ed92e1ec2107da0dd455c491f 100644 (file)
 #include "target.h"
 #include "inferior.h"
 #include "gdb_string.h"
+#include "gdb_stat.h"
 #include "inf-child.h"
 #include "gdb/fileio.h"
+#include "agent.h"
+#include "gdb_wait.h"
 
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>         /* for MAXPATHLEN */
+#endif
 #include <sys/types.h>
-#include <sys/stat.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.  */
 
@@ -237,10 +265,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);
@@ -260,10 +293,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);
@@ -299,6 +337,53 @@ inf_child_fileio_unlink (const char *filename, int *target_errno)
   return ret;
 }
 
+/* Read value of symbolic link FILENAME on the target.  Return a
+   null-terminated string allocated via xmalloc, or NULL if an error
+   occurs (and set *TARGET_ERRNO).  */
+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];
+  int len;
+  char *ret;
+
+  len = readlink (filename, buf, sizeof buf);
+  if (len < 0)
+    {
+      *target_errno = inf_child_errno_to_fileio_error (errno);
+      return NULL;
+    }
+
+  ret = xmalloc (len + 1);
+  memcpy (ret, buf, len);
+  ret[len] = '\0';
+  return ret;
+#else
+  *target_errno = FILEIO_ENOSYS;
+  return NULL;
+#endif
+}
+
+static int
+inf_child_use_agent (int use)
+{
+  if (agent_loaded_p ())
+    {
+      use_agent = use;
+      return 1;
+    }
+  else
+    return 0;
+}
+
+static int
+inf_child_can_use_agent (void)
+{
+  return agent_loaded_p ();
+}
 
 struct target_ops *
 inf_child_target (void)
@@ -336,6 +421,9 @@ inf_child_target (void)
   t->to_fileio_pread = inf_child_fileio_pread;
   t->to_fileio_close = inf_child_fileio_close;
   t->to_fileio_unlink = inf_child_fileio_unlink;
+  t->to_fileio_readlink = inf_child_fileio_readlink;
   t->to_magic = OPS_MAGIC;
+  t->to_use_agent = inf_child_use_agent;
+  t->to_can_use_agent = inf_child_can_use_agent;
   return t;
 }
This page took 0.025794 seconds and 4 git commands to generate.