don't let bin2hex call strlen
[deliverable/binutils-gdb.git] / gdb / proc-api.c
index cf12d424d6559db0716bc5542c1bd6fb13d359df..2ae7b84b2e0be88bf928afa8410c7d83cbe110f6 100644 (file)
@@ -1,23 +1,24 @@
 /* Machine independent support for SVR4 /proc (process file system) for GDB.
 /* Machine independent support for SVR4 /proc (process file system) for GDB.
-   Copyright 1999 Free Software Foundation, Inc.
+
+   Copyright (C) 1999-2014 Free Software Foundation, Inc.
+
    Written by Michael Snyder at Cygnus Solutions.
    Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
 
    Written by Michael Snyder at Cygnus Solutions.
    Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
 
-This file is part of GDB.
+   This file is part of GDB.
 
 
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
 
 
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
 
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software Foundation, 
-Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 /*
  * Pretty-print trace of api calls to the /proc api
 
 /*
  * Pretty-print trace of api calls to the /proc api
@@ -27,6 +28,7 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "gdbcmd.h"
 
 #include "defs.h"
 #include "gdbcmd.h"
+#include "completer.h"
 
 #if defined (NEW_PROC_API)
 #define _STRUCTURED_PROC 1
 
 #if defined (NEW_PROC_API)
 #define _STRUCTURED_PROC 1
@@ -35,19 +37,21 @@ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/procfs.h>
 #include <stdio.h>
 #include <sys/types.h>
 #include <sys/procfs.h>
+#ifdef HAVE_SYS_PROC_H
 #include <sys/proc.h>  /* for struct proc */
 #include <sys/proc.h>  /* for struct proc */
+#endif
 #ifdef HAVE_SYS_USER_H
 #include <sys/user.h>  /* for struct user */
 #endif
 #ifdef HAVE_SYS_USER_H
 #include <sys/user.h>  /* for struct user */
 #endif
-#include <fcntl.h>     /* for O_RDWR etc. */
-#include <sys/wait.h>
+#include <fcntl.h>     /* for O_RDWR etc.  */
+#include "gdb_wait.h"
 
 #include "proc-utils.h"
 
 /*  Much of the information used in the /proc interface, particularly for
     printing status information, is kept as tables of structures of the
     following form.  These tables can be used to map numeric values to
 
 #include "proc-utils.h"
 
 /*  Much of the information used in the /proc interface, particularly for
     printing status information, is kept as tables of structures of the
     following form.  These tables can be used to map numeric values to
-    their symbolic names and to a string that describes their specific use. */
+    their symbolic names and to a string that describes their specific use.  */
 
 struct trans {
   long value;                   /* The numeric value */
 
 struct trans {
   long value;                   /* The numeric value */
@@ -69,10 +73,7 @@ prepare_to_trace (void)
 }
 
 static void
 }
 
 static void
-set_procfs_trace_cmd (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_procfs_trace_cmd (char *args, int from_tty, struct cmd_list_element *c)
 {
 #if 0  /* not sure what I might actually need to do here, if anything */
   if (procfs_file)
 {
 #if 0  /* not sure what I might actually need to do here, if anything */
   if (procfs_file)
@@ -81,10 +82,7 @@ set_procfs_trace_cmd (args, from_tty, c)
 }
 
 static void
 }
 
 static void
-set_procfs_file_cmd (args, from_tty, c)
-     char *args;
-     int from_tty;
-     struct cmd_list_element *c;
+set_procfs_file_cmd (char *args, int from_tty, struct cmd_list_element *c)
 {
   /* Just changed the filename for procfs tracing.
      If a file was already open, close it.  */
 {
   /* Just changed the filename for procfs tracing.
      If a file was already open, close it.  */
@@ -162,7 +160,7 @@ static struct trans ioctl_table[] = {
   { PIOCLDT,       "PIOCLDT",      "get LDT" },
   { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
 #endif
   { PIOCLDT,       "PIOCLDT",      "get LDT" },
   { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
 #endif
-#ifdef PIOCLSTATUS                     /* solaris and unixware */
+#ifdef PIOCLSTATUS                     /* solaris */
   { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
   { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
   { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
   { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
   { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
   { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
@@ -223,14 +221,11 @@ static struct trans ioctl_table[] = {
 };
 
 int
 };
 
 int
-ioctl_with_trace (fd, opcode, ptr, file, line)
-     int  fd;
-     long opcode;
-     void *ptr;
-     char *file;
-     int  line;
+ioctl_with_trace (int fd, long opcode, void *ptr, char *file, int line)
 {
 {
-  int i, ret, arg1;
+  int i = 0;
+  int ret;
+  int arg1;
 
   prepare_to_trace ();
 
 
   prepare_to_trace ();
 
@@ -403,15 +398,16 @@ static struct trans rw_table[] = {
 #ifdef PCCSIG                  /* solaris */
   { PCCSIG,   "PCCSIG",   "clear current signal" },
 #endif
 #ifdef PCCSIG                  /* solaris */
   { PCCSIG,   "PCCSIG",   "clear current signal" },
 #endif
+#ifdef PCDSTOP                 /* solaris */
   { PCDSTOP,  "PCDSTOP",  "post stop request" },
   { PCDSTOP,  "PCDSTOP",  "post stop request" },
+#endif
   { PCKILL,   "PCKILL",   "post a signal" },
   { PCKILL,   "PCKILL",   "post a signal" },
+#ifdef PCNICE                  /* solaris */
   { PCNICE,   "PCNICE",   "set nice priority" },
   { PCNICE,   "PCNICE",   "set nice priority" },
+#endif
 #ifdef PCREAD                  /* solaris */
   { PCREAD,   "PCREAD",   "read from the address space" },
   { PCWRITE,  "PCWRITE",  "write to the address space" },
 #ifdef PCREAD                  /* solaris */
   { PCREAD,   "PCREAD",   "read from the address space" },
   { PCWRITE,  "PCWRITE",  "write to the address space" },
-#endif
-#ifdef PCRESET                 /* unixware */
-  { PCRESET,  "PCRESET",  "unset modes" },
 #endif
   { PCRUN,    "PCRUN",    "make process/lwp runnable" },
 #ifdef PCSASRS                 /* solaris 2.7 only */
 #endif
   { PCRUN,    "PCRUN",    "make process/lwp runnable" },
 #ifdef PCSASRS                 /* solaris 2.7 only */
@@ -425,7 +421,9 @@ static struct trans rw_table[] = {
   { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
   { PCSFAULT, "PCSFAULT", "set traced fault set" },
   { PCSFPREG, "PCSFPREG", "set floating point registers" },
   { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
   { PCSFAULT, "PCSFAULT", "set traced fault set" },
   { PCSFPREG, "PCSFPREG", "set floating point registers" },
+#ifdef PCSHOLD                 /* solaris */
   { PCSHOLD,  "PCSHOLD",  "set signal mask" },
   { PCSHOLD,  "PCSHOLD",  "set signal mask" },
+#endif
   { PCSREG,   "PCSREG",   "set general registers" },
   { PCSSIG,   "PCSSIG",   "set current signal" },
   { PCSTOP,   "PCSTOP",   "post stop request and wait" },
   { PCSREG,   "PCSREG",   "set general registers" },
   { PCSSIG,   "PCSSIG",   "set current signal" },
   { PCSTOP,   "PCSTOP",   "post stop request and wait" },
@@ -439,7 +437,9 @@ static struct trans rw_table[] = {
 #ifdef PCTWSTOP                        /* solaris */
   { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
 #endif
 #ifdef PCTWSTOP                        /* solaris */
   { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
 #endif
+#ifdef PCUNKILL                        /* solaris */
   { PCUNKILL, "PCUNKILL", "delete a pending signal" },
   { PCUNKILL, "PCUNKILL", "delete a pending signal" },
+#endif
 #ifdef PCUNSET                 /* solaris */
   { PCUNSET,  "PCUNSET",  "unset modes" },
 #endif
 #ifdef PCUNSET                 /* solaris */
   { PCUNSET,  "PCUNSET",  "unset modes" },
 #endif
@@ -453,21 +453,16 @@ static struct trans rw_table[] = {
 static off_t lseek_offset;
 
 int
 static off_t lseek_offset;
 
 int
-write_with_trace (fd, varg, len, file, line)
-     int  fd;
-     void *varg;
-     size_t len;
-     char *file;
-     int  line;
+write_with_trace (int fd, void *varg, size_t len, char *file, int line)
 {
 {
-  int  i;
+  int i = ARRAY_SIZE (rw_table) - 1;
   int ret;
   int ret;
-  long *arg = (long *) varg;
+  procfs_ctl_t *arg = (procfs_ctl_t *) varg;
 
   prepare_to_trace ();
   if (procfs_trace)
     {
 
   prepare_to_trace ();
   if (procfs_trace)
     {
-      long opcode = arg[0];
+      procfs_ctl_t opcode = arg[0];
       for (i = 0; rw_table[i].name != NULL; i++)
        if (rw_table[i].value == opcode)
          break;
       for (i = 0; rw_table[i].name != NULL; i++)
        if (rw_table[i].value == opcode)
          break;
@@ -491,7 +486,9 @@ write_with_trace (fd, varg, len, file, line)
       case PCUNSET:
 #endif
 #ifdef PCRESET
       case PCUNSET:
 #endif
 #ifdef PCRESET
+#if PCRESET != PCUNSET
       case PCRESET:
       case PCRESET:
+#endif
 #endif
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCRESET, %s) %s\n", 
 #endif
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCRESET, %s) %s\n", 
@@ -527,12 +524,14 @@ write_with_trace (fd, varg, len, file, line)
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
        break;
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
        break;
+#ifdef PCSHOLD
       case PCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCSHOLD) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
        break;
       case PCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCSHOLD) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
        break;
+#endif
       case PCSSIG:
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCSSIG) ");
       case PCSSIG:
        fprintf (procfs_file ? procfs_file : stdout, 
                 "write (PCSSIG) ");
@@ -551,10 +550,14 @@ write_with_trace (fd, varg, len, file, line)
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg[1] & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg[1] & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
+#ifdef PRSABORT
        if (arg[1] & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
        if (arg[1] & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
+#endif
+#ifdef PRSTOP
        if (arg[1] & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
        if (arg[1] & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
+#endif
          
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
          
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
@@ -567,14 +570,7 @@ write_with_trace (fd, varg, len, file, line)
        break;
       default:
        {
        break;
       default:
        {
-         static unsigned char break_insn[] = BREAKPOINT;
-
-         if (len == sizeof (break_insn) &&
-             memcmp (arg, &break_insn, len) == 0)
-           fprintf (procfs_file ? procfs_file : stdout, 
-                    "write (<breakpoint at 0x%08lx>) \n", 
-                    (unsigned long) lseek_offset);
-         else if (rw_table[i].name)
+         if (rw_table[i].name)
            fprintf (procfs_file ? procfs_file : stdout, 
                     "write (%s) %s\n", 
                     rw_table[i].name, 
            fprintf (procfs_file ? procfs_file : stdout, 
                     "write (%s) %s\n", 
                     rw_table[i].name, 
@@ -614,12 +610,7 @@ write_with_trace (fd, varg, len, file, line)
 }
 
 off_t
 }
 
 off_t
-lseek_with_trace (fd, offset, whence, file, line)
-     int fd;
-     off_t offset;
-     int whence;
-     char *file;
-     int line;
+lseek_with_trace (int fd, off_t offset, int whence, char *file, int line)
 {
   off_t ret;
 
 {
   off_t ret;
 
@@ -642,11 +633,7 @@ lseek_with_trace (fd, offset, whence, file, line)
 #endif /* NEW_PROC_API */
 
 int
 #endif /* NEW_PROC_API */
 
 int
-open_with_trace (filename, mode, file, line)
-     char *filename;
-     int   mode;
-     char *file;
-     int   line;
+open_with_trace (char *filename, int mode, char *file, int line)
 {
   int ret;
 
 {
   int ret;
 
@@ -687,10 +674,7 @@ open_with_trace (filename, mode, file, line)
 }
 
 int
 }
 
 int
-close_with_trace (fd, file, line)
-     int   fd;
-     char *file;
-     int   line;
+close_with_trace (int fd, char *file, int line)
 {
   int ret;
 
 {
   int ret;
 
@@ -716,10 +700,7 @@ close_with_trace (fd, file, line)
 }
 
 pid_t
 }
 
 pid_t
-wait_with_trace (wstat, file, line)
-     int  *wstat;
-     char *file;
-     int   line;
+wait_with_trace (int *wstat, char *file, int line)
 {
   int ret, lstat = 0;
 
 {
   int ret, lstat = 0;
 
@@ -754,10 +735,7 @@ wait_with_trace (wstat, file, line)
 }
 
 void
 }
 
 void
-procfs_note (msg, file, line)
-     char *msg;
-     char *file;
-     int   line;
+procfs_note (char *msg, char *file, int line)
 {
   prepare_to_trace ();
   if (procfs_trace)
 {
   prepare_to_trace ();
   if (procfs_trace)
@@ -765,18 +743,14 @@ procfs_note (msg, file, line)
       if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout, 
                 "%s:%d -- ", file, line);
       if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout, 
                 "%s:%d -- ", file, line);
-      fprintf (procfs_file ? procfs_file : stdout, msg);
+      fprintf (procfs_file ? procfs_file : stdout, "%s", msg);
       if (procfs_file)
        fflush (procfs_file);
     }
 }
 
 void
       if (procfs_file)
        fflush (procfs_file);
     }
 }
 
 void
-proc_prettyfprint_status (flags, why, what, thread)
-     long flags;
-     int  why;
-     int  what;
-     int  thread;
+proc_prettyfprint_status (long flags, int why, int what, int thread)
 {
   prepare_to_trace ();
   if (procfs_trace)
 {
   prepare_to_trace ();
   if (procfs_trace)
@@ -797,22 +771,25 @@ proc_prettyfprint_status (flags, why, what, thread)
 }
 
 
 }
 
 
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern void _initialize_proc_api (void);
+
 void
 void
-_initialize_proc_api ()
+_initialize_proc_api (void)
 {
   struct cmd_list_element *c;
 
 {
   struct cmd_list_element *c;
 
-  c = add_set_cmd ("procfs-trace", no_class,
-                  var_boolean, (char *) &procfs_trace, 
-                  "Set tracing for /proc api calls.\n", &setlist);
-
-  add_show_from_set (c, &showlist);
-  c->function.sfunc = set_procfs_trace_cmd;
-
-  c = add_set_cmd ("procfs-file", no_class, var_filename,
-                  (char *) &procfs_filename, 
-                  "Set filename for /proc tracefile.\n", &setlist);
-
-  add_show_from_set (c, &showlist);
-  c->function.sfunc = set_procfs_file_cmd;
+  add_setshow_boolean_cmd ("procfs-trace", no_class, &procfs_trace, _("\
+Set tracing for /proc api calls."), _("\
+Show tracing for /proc api calls."), NULL,
+                          set_procfs_trace_cmd,
+                          NULL, /* FIXME: i18n: */
+                          &setlist, &showlist);
+
+  add_setshow_filename_cmd ("procfs-file", no_class, &procfs_filename, _("\
+Set filename for /proc tracefile."), _("\
+Show filename for /proc tracefile."), NULL,
+                           set_procfs_file_cmd,
+                           NULL, /* FIXME: i18n: */
+                           &setlist, &showlist);
 }
 }
This page took 0.082236 seconds and 4 git commands to generate.