OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [gdb/] [proc-api.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* Machine independent support for SVR4 /proc (process file system) for GDB.
/* Machine independent support for SVR4 /proc (process file system) for GDB.
 
 
   Copyright (C) 1999, 2000, 2001, 2003, 2005, 2007, 2008, 2009, 2010
   Copyright (C) 1999, 2000, 2001, 2003, 2005, 2007, 2008, 2009, 2010
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
   Written by Michael Snyder at Cygnus Solutions.
   Written by Michael Snyder at Cygnus Solutions.
   Based on work by Fred Fish, Stu Grossman, Geoff Noer, and others.
   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
   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
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   This program is distributed in the hope that it will be useful,
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   You should have received a copy of the GNU General Public License
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
   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
 * (ioctl or read/write calls).
 * (ioctl or read/write calls).
 *
 *
 */
 */
 
 
#include "defs.h"
#include "defs.h"
#include "gdbcmd.h"
#include "gdbcmd.h"
#include "completer.h"
#include "completer.h"
 
 
#if defined (NEW_PROC_API)
#if defined (NEW_PROC_API)
#define _STRUCTURED_PROC 1
#define _STRUCTURED_PROC 1
#endif
#endif
 
 
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/procfs.h>
#include <sys/procfs.h>
#ifdef HAVE_SYS_PROC_H
#ifdef HAVE_SYS_PROC_H
#include <sys/proc.h>   /* for struct proc */
#include <sys/proc.h>   /* for struct proc */
#endif
#endif
#ifdef HAVE_SYS_USER_H
#ifdef HAVE_SYS_USER_H
#include <sys/user.h>   /* for struct user */
#include <sys/user.h>   /* for struct user */
#endif
#endif
#include <fcntl.h>      /* for O_RDWR etc. */
#include <fcntl.h>      /* for O_RDWR etc. */
#include "gdb_wait.h"
#include "gdb_wait.h"
 
 
#include "proc-utils.h"
#include "proc-utils.h"
 
 
/*  Much of the information used in the /proc interface, particularly for
/*  Much of the information used in the /proc interface, particularly for
    printing status information, is kept as tables of structures of the
    printing status information, is kept as tables of structures of the
    following form.  These tables can be used to map numeric values to
    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 {
struct trans {
  long value;                   /* The numeric value */
  long value;                   /* The numeric value */
  char *name;                   /* The equivalent symbolic value */
  char *name;                   /* The equivalent symbolic value */
  char *desc;                   /* Short description of value */
  char *desc;                   /* Short description of value */
};
};
 
 
static int   procfs_trace    = 0;
static int   procfs_trace    = 0;
static FILE *procfs_file     = NULL;
static FILE *procfs_file     = NULL;
static char *procfs_filename = "procfs_trace";
static char *procfs_filename = "procfs_trace";
 
 
static void
static void
prepare_to_trace (void)
prepare_to_trace (void)
{
{
  if (procfs_trace)                     /* if procfs tracing turned on */
  if (procfs_trace)                     /* if procfs tracing turned on */
    if (procfs_file == NULL)            /* if output file not yet open */
    if (procfs_file == NULL)            /* if output file not yet open */
      if (procfs_filename != NULL)      /* if output filename known */
      if (procfs_filename != NULL)      /* if output filename known */
        procfs_file = fopen (procfs_filename, "a");     /* open output file */
        procfs_file = fopen (procfs_filename, "a");     /* open output file */
}
}
 
 
static void
static void
set_procfs_trace_cmd (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 0   /* not sure what I might actually need to do here, if anything */
  if (procfs_file)
  if (procfs_file)
    fflush (procfs_file);
    fflush (procfs_file);
#endif
#endif
}
}
 
 
static void
static void
set_procfs_file_cmd (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.
  /* Just changed the filename for procfs tracing.
     If a file was already open, close it.  */
     If a file was already open, close it.  */
  if (procfs_file)
  if (procfs_file)
    fclose (procfs_file);
    fclose (procfs_file);
  procfs_file = NULL;
  procfs_file = NULL;
}
}
 
 
 
 
#ifndef NEW_PROC_API
#ifndef NEW_PROC_API
 
 
static struct trans ioctl_table[] = {
static struct trans ioctl_table[] = {
#ifdef PIOCACINFO                       /* irix */
#ifdef PIOCACINFO                       /* irix */
  { PIOCACINFO,    "PIOCACINFO",   "get process account info" },
  { PIOCACINFO,    "PIOCACINFO",   "get process account info" },
#endif
#endif
  { PIOCACTION,    "PIOCACTION",   "get signal action structs" },
  { PIOCACTION,    "PIOCACTION",   "get signal action structs" },
#ifdef PIOCARGUMENTS                    /* osf */
#ifdef PIOCARGUMENTS                    /* osf */
  { PIOCARGUMENTS, "PIOCARGUMENTS", "command line args" },
  { PIOCARGUMENTS, "PIOCARGUMENTS", "command line args" },
#endif
#endif
#ifdef PIOCAUXV                         /* solaris aux vectors */
#ifdef PIOCAUXV                         /* solaris aux vectors */
  { PIOCAUXV,      "PIOCAUXV",     "get aux vector" },
  { PIOCAUXV,      "PIOCAUXV",     "get aux vector" },
  { PIOCNAUXV,     "PIOCNAUXV",    "get number of aux vector entries" },
  { PIOCNAUXV,     "PIOCNAUXV",    "get number of aux vector entries" },
#endif /* AUXV */
#endif /* AUXV */
  { PIOCCFAULT,    "PIOCCFAULT",   "clear current fault" },
  { PIOCCFAULT,    "PIOCCFAULT",   "clear current fault" },
  { PIOCCRED,      "PIOCCRED",     "get process credentials" },
  { PIOCCRED,      "PIOCCRED",     "get process credentials" },
#ifdef PIOCENEVCTRS                     /* irix event counters */
#ifdef PIOCENEVCTRS                     /* irix event counters */
  { PIOCENEVCTRS,    "PIOCENEVCTRS",    "acquire and start event counters" },
  { PIOCENEVCTRS,    "PIOCENEVCTRS",    "acquire and start event counters" },
  { PIOCGETEVCTRL,   "PIOCGETEVCTRL",   "get control info of event counters" },
  { PIOCGETEVCTRL,   "PIOCGETEVCTRL",   "get control info of event counters" },
  { PIOCGETEVCTRS,   "PIOCGETEVCTRS",   "dump event counters" },
  { PIOCGETEVCTRS,   "PIOCGETEVCTRS",   "dump event counters" },
  { PIOCGETPREVCTRS, "PIOCGETPREVCTRS", "dump event counters & prusage info" },
  { PIOCGETPREVCTRS, "PIOCGETPREVCTRS", "dump event counters & prusage info" },
  { PIOCRELEVCTRS,   "PIOCRELEVCTRS",   "release/stop event counters" },
  { PIOCRELEVCTRS,   "PIOCRELEVCTRS",   "release/stop event counters" },
  { PIOCSETEVCTRL,   "PIOCSETEVCTRL",   "set control info of event counters" },
  { PIOCSETEVCTRL,   "PIOCSETEVCTRL",   "set control info of event counters" },
  { PIOCGETPTIMER,   "PIOCGETPTIMER",   "get process timers" },
  { PIOCGETPTIMER,   "PIOCGETPTIMER",   "get process timers" },
#endif  /* irix event counters */
#endif  /* irix event counters */
  { PIOCGENTRY,    "PIOCGENTRY",   "get traced syscall entry set" },
  { PIOCGENTRY,    "PIOCGENTRY",   "get traced syscall entry set" },
#if defined (PIOCGETPR)
#if defined (PIOCGETPR)
  { PIOCGETPR,     "PIOCGETPR",    "read struct proc" },
  { PIOCGETPR,     "PIOCGETPR",    "read struct proc" },
#endif
#endif
#if defined (PIOCGETU)
#if defined (PIOCGETU)
  { PIOCGETU,      "PIOCGETU",     "read user area" },
  { PIOCGETU,      "PIOCGETU",     "read user area" },
#endif
#endif
#if defined (PIOCGETUTK) && (defined(KERNEL) || defined(SHOW_UTT)) /* osf */
#if defined (PIOCGETUTK) && (defined(KERNEL) || defined(SHOW_UTT)) /* osf */
  { PIOCGETUTK,  "PIOCGETUTK", "get the utask struct" },
  { PIOCGETUTK,  "PIOCGETUTK", "get the utask struct" },
#endif
#endif
  { PIOCGEXIT,     "PIOCGEXIT",    "get traced syscall exit  set" },
  { PIOCGEXIT,     "PIOCGEXIT",    "get traced syscall exit  set" },
  { PIOCGFAULT,    "PIOCGFAULT",   "get traced fault set" },
  { PIOCGFAULT,    "PIOCGFAULT",   "get traced fault set" },
#ifdef PIOCGFPCR                        /* osf */
#ifdef PIOCGFPCR                        /* osf */
  { PIOCGFPCR,     "PIOCGFPCR",    "get FP control register" },
  { PIOCGFPCR,     "PIOCGFPCR",    "get FP control register" },
  { PIOCSFPCR,     "PIOCSFPCR",    "set FP conrtol register" },
  { PIOCSFPCR,     "PIOCSFPCR",    "set FP conrtol register" },
#endif
#endif
  { PIOCGFPREG,    "PIOCGFPREG",   "get floating point registers" },
  { PIOCGFPREG,    "PIOCGFPREG",   "get floating point registers" },
  { PIOCGHOLD,     "PIOCGHOLD",    "get held signal set" },
  { PIOCGHOLD,     "PIOCGHOLD",    "get held signal set" },
  { PIOCGREG,      "PIOCGREG",     "get general registers" },
  { PIOCGREG,      "PIOCGREG",     "get general registers" },
  { PIOCGROUPS,    "PIOCGROUPS",   "get supplementary groups" },
  { PIOCGROUPS,    "PIOCGROUPS",   "get supplementary groups" },
#ifdef PIOCGSPCACT                      /* osf */
#ifdef PIOCGSPCACT                      /* osf */
  { PIOCGSPCACT,   "PIOCGSPCACT",  "get special action" },
  { PIOCGSPCACT,   "PIOCGSPCACT",  "get special action" },
  { PIOCSSPCACT,   "PIOCSSPCACT",  "set special action" },
  { PIOCSSPCACT,   "PIOCSSPCACT",  "set special action" },
#endif
#endif
  { PIOCGTRACE,    "PIOCGTRACE",   "get traced signal set" },
  { PIOCGTRACE,    "PIOCGTRACE",   "get traced signal set" },
#ifdef PIOCGWATCH                       /* irix watchpoints */
#ifdef PIOCGWATCH                       /* irix watchpoints */
  { PIOCGWATCH,    "PIOCGWATCH",   "get watchpoint" },
  { PIOCGWATCH,    "PIOCGWATCH",   "get watchpoint" },
  { PIOCSWATCH,    "PIOCSWATCH",   "set watchpoint" },
  { PIOCSWATCH,    "PIOCSWATCH",   "set watchpoint" },
  { PIOCNWATCH,    "PIOCNWATCH",   "get number of watchpoints" },
  { PIOCNWATCH,    "PIOCNWATCH",   "get number of watchpoints" },
#endif  /* irix watchpoints */
#endif  /* irix watchpoints */
#ifdef PIOCGWIN                         /* solaris sparc */
#ifdef PIOCGWIN                         /* solaris sparc */
  { PIOCGWIN,      "PIOCGWIN",     "get gwindows_t" },
  { PIOCGWIN,      "PIOCGWIN",     "get gwindows_t" },
#endif
#endif
#ifdef PIOCGXREG                        /* solaris sparc extra regs */
#ifdef PIOCGXREG                        /* solaris sparc extra regs */
  { PIOCGXREGSIZE, "PIOCXREGSIZE", "get extra register state size" },
  { PIOCGXREGSIZE, "PIOCXREGSIZE", "get extra register state size" },
  { PIOCGXREG,     "PIOCGXREG",    "get extra register state" },
  { PIOCGXREG,     "PIOCGXREG",    "get extra register state" },
  { PIOCSXREG,     "PIOCSXREG",    "set extra register state" },
  { PIOCSXREG,     "PIOCSXREG",    "set extra register state" },
#endif /* XREG */
#endif /* XREG */
  { PIOCKILL,      "PIOCKILL",     "send signal" },
  { PIOCKILL,      "PIOCKILL",     "send signal" },
#ifdef PIOCLDT                          /* solaris i386 */
#ifdef PIOCLDT                          /* solaris i386 */
  { PIOCLDT,       "PIOCLDT",      "get LDT" },
  { PIOCLDT,       "PIOCLDT",      "get LDT" },
  { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
  { PIOCNLDT,      "PIOCNLDT",     "get number of LDT entries" },
#endif
#endif
#ifdef PIOCLSTATUS                      /* solaris and unixware */
#ifdef PIOCLSTATUS                      /* solaris and unixware */
  { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
  { PIOCLSTATUS,   "PIOCLSTATUS",  "get status of all lwps" },
  { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
  { PIOCLUSAGE,    "PIOCLUSAGE",   "get resource usage of all lwps" },
  { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
  { PIOCOPENLWP,   "PIOCOPENLWP",  "get lwp file descriptor" },
  { PIOCLWPIDS,    "PIOCLWPIDS",   "get lwp identifiers" },
  { PIOCLWPIDS,    "PIOCLWPIDS",   "get lwp identifiers" },
#endif /* LWP */
#endif /* LWP */
  { PIOCMAP,       "PIOCMAP",      "get memory map information" },
  { PIOCMAP,       "PIOCMAP",      "get memory map information" },
  { PIOCMAXSIG,    "PIOCMAXSIG",   "get max signal number" },
  { PIOCMAXSIG,    "PIOCMAXSIG",   "get max signal number" },
  { PIOCNICE,      "PIOCNICE",     "set nice priority" },
  { PIOCNICE,      "PIOCNICE",     "set nice priority" },
  { PIOCNMAP,      "PIOCNMAP",     "get number of memory mappings" },
  { PIOCNMAP,      "PIOCNMAP",     "get number of memory mappings" },
  { PIOCOPENM,     "PIOCOPENM",    "open mapped object for reading" },
  { PIOCOPENM,     "PIOCOPENM",    "open mapped object for reading" },
#ifdef PIOCOPENMOBS                     /* osf */
#ifdef PIOCOPENMOBS                     /* osf */
  { PIOCOPENMOBS,  "PIOCOPENMOBS", "open mapped object" },
  { PIOCOPENMOBS,  "PIOCOPENMOBS", "open mapped object" },
#endif
#endif
#ifdef PIOCOPENPD       /* solaris */
#ifdef PIOCOPENPD       /* solaris */
  { PIOCOPENPD,    "PIOCOPENPD",   "get page data file descriptor" },
  { PIOCOPENPD,    "PIOCOPENPD",   "get page data file descriptor" },
#endif
#endif
  { PIOCPSINFO,    "PIOCPSINFO",   "get ps(1) information" },
  { PIOCPSINFO,    "PIOCPSINFO",   "get ps(1) information" },
  { PIOCRESET,     "PIOCRESET",    "reset process flags" },
  { PIOCRESET,     "PIOCRESET",    "reset process flags" },
  { PIOCRFORK,     "PIOCRFORK",    "reset inherit-on-fork flag" },
  { PIOCRFORK,     "PIOCRFORK",    "reset inherit-on-fork flag" },
  { PIOCRRLC,      "PIOCRRLC",     "reset run-on-last-close flag" },
  { PIOCRRLC,      "PIOCRRLC",     "reset run-on-last-close flag" },
  { PIOCRUN,       "PIOCRUN",      "make process runnable" },
  { PIOCRUN,       "PIOCRUN",      "make process runnable" },
#ifdef PIOCSAVECCNTRS                   /* irix */
#ifdef PIOCSAVECCNTRS                   /* irix */
  { PIOCSAVECCNTRS, "PIOCSAVECCNTRS", "parent gets child cntrs" },
  { PIOCSAVECCNTRS, "PIOCSAVECCNTRS", "parent gets child cntrs" },
#endif
#endif
  { PIOCSENTRY,    "PIOCSENTRY",   "set traced syscall entry set" },
  { PIOCSENTRY,    "PIOCSENTRY",   "set traced syscall entry set" },
  { PIOCSET,       "PIOCSET",      "set process flags" },
  { PIOCSET,       "PIOCSET",      "set process flags" },
  { PIOCSEXIT,     "PIOCSEXIT",    "set traced syscall exit  set" },
  { PIOCSEXIT,     "PIOCSEXIT",    "set traced syscall exit  set" },
  { PIOCSFAULT,    "PIOCSFAULT",   "set traced fault set" },
  { PIOCSFAULT,    "PIOCSFAULT",   "set traced fault set" },
  { PIOCSFORK,     "PIOCSFORK",    "set inherit-on-fork flag" },
  { PIOCSFORK,     "PIOCSFORK",    "set inherit-on-fork flag" },
  { PIOCSFPREG,    "PIOCSFPREG",   "set floating point registers" },
  { PIOCSFPREG,    "PIOCSFPREG",   "set floating point registers" },
  { PIOCSHOLD,     "PIOCSHOLD",    "set held signal set" },
  { PIOCSHOLD,     "PIOCSHOLD",    "set held signal set" },
  { PIOCSREG,      "PIOCSREG",     "set general registers" },
  { PIOCSREG,      "PIOCSREG",     "set general registers" },
  { PIOCSRLC,      "PIOCSRLC",     "set run-on-last-close flag" },
  { PIOCSRLC,      "PIOCSRLC",     "set run-on-last-close flag" },
  { PIOCSSIG,      "PIOCSSIG",     "set current signal" },
  { PIOCSSIG,      "PIOCSSIG",     "set current signal" },
  { PIOCSTATUS,    "PIOCSTATUS",   "get process status" },
  { PIOCSTATUS,    "PIOCSTATUS",   "get process status" },
  { PIOCSTOP,      "PIOCSTOP",     "post stop request" },
  { PIOCSTOP,      "PIOCSTOP",     "post stop request" },
  { PIOCSTRACE,    "PIOCSTRACE",   "set traced signal set" },
  { PIOCSTRACE,    "PIOCSTRACE",   "set traced signal set" },
  { PIOCUNKILL,    "PIOCUNKILL",   "delete a signal" },
  { PIOCUNKILL,    "PIOCUNKILL",   "delete a signal" },
#ifdef PIOCUSAGE        /* solaris */
#ifdef PIOCUSAGE        /* solaris */
  { PIOCUSAGE,     "PIOCUSAGE",    "get resource usage" },
  { PIOCUSAGE,     "PIOCUSAGE",    "get resource usage" },
#endif
#endif
  { PIOCWSTOP,     "PIOCWSTOP",    "wait for process to stop" },
  { PIOCWSTOP,     "PIOCWSTOP",    "wait for process to stop" },
 
 
#ifdef PIOCNTHR                         /* osf threads */
#ifdef PIOCNTHR                         /* osf threads */
  { PIOCNTHR,      "PIOCNTHR",     "get thread count" },
  { PIOCNTHR,      "PIOCNTHR",     "get thread count" },
  { PIOCRTINH,     "PIOCRTINH",    "reset inherit-on-thread-creation" },
  { PIOCRTINH,     "PIOCRTINH",    "reset inherit-on-thread-creation" },
  { PIOCSTINH,     "PIOCSTINH",    "set   inherit-on-thread-creation" },
  { PIOCSTINH,     "PIOCSTINH",    "set   inherit-on-thread-creation" },
  { PIOCTLIST,     "PIOCTLIST",    "get thread ids" },
  { PIOCTLIST,     "PIOCTLIST",    "get thread ids" },
  { PIOCXPTH,      "PIOCXPTH",     "translate port to thread handle" },
  { PIOCXPTH,      "PIOCXPTH",     "translate port to thread handle" },
  { PIOCTRUN,      "PIOCTRUN",     "make thread runnable" },
  { PIOCTRUN,      "PIOCTRUN",     "make thread runnable" },
  { PIOCTSTATUS,   "PIOCTSTATUS",  "get thread status" },
  { PIOCTSTATUS,   "PIOCTSTATUS",  "get thread status" },
  { PIOCTSTOP,     "PIOCTSTOP",    "stop a thread" },
  { PIOCTSTOP,     "PIOCTSTOP",    "stop a thread" },
  /* ... TGTRACE TSTRACE TSSIG TKILL TUNKILL TCFAULT TGFAULT TSFAULT
  /* ... TGTRACE TSTRACE TSSIG TKILL TUNKILL TCFAULT TGFAULT TSFAULT
     TGFPREG TSFPREG TGREG TSREG TACTION TTERM TABRUN TGENTRY TSENTRY
     TGFPREG TSFPREG TGREG TSREG TACTION TTERM TABRUN TGENTRY TSENTRY
     TGEXIT TSEXIT TSHOLD ... thread functions */
     TGEXIT TSEXIT TSHOLD ... thread functions */
#endif /* osf threads */
#endif /* osf threads */
  { -1,            NULL,           NULL }
  { -1,            NULL,           NULL }
};
};
 
 
int
int
ioctl_with_trace (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 = 0;
  int i = 0;
  int ret;
  int ret;
  int arg1;
  int arg1;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
 
 
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      for (i = 0; ioctl_table[i].name != NULL; i++)
      for (i = 0; ioctl_table[i].name != NULL; i++)
        if (ioctl_table[i].value == opcode)
        if (ioctl_table[i].value == opcode)
          break;
          break;
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      switch (opcode) {
      switch (opcode) {
      case PIOCSET:
      case PIOCSET:
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSET,   %s) %s\n",
                 "ioctl (PIOCSET,   %s) %s\n",
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_RLC   ? "PR_RLC"   :
                 arg1 == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? ioctl_table[i].desc : "");
                 info_verbose ? ioctl_table[i].desc : "");
        break;
        break;
      case PIOCRESET:
      case PIOCRESET:
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCRESET, %s) %s\n",
                 "ioctl (PIOCRESET, %s) %s\n",
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_FORK  ? "PR_FORK"  :
                 arg1 == PR_RLC   ? "PR_RLC"   :
                 arg1 == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
                 arg1 == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? ioctl_table[i].desc : "");
                 info_verbose ? ioctl_table[i].desc : "");
        break;
        break;
      case PIOCSTRACE:
      case PIOCSTRACE:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSTRACE) ");
                 "ioctl (PIOCSTRACE) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) ptr, 0);
                                     (sigset_t *) ptr, 0);
        break;
        break;
      case PIOCSFAULT:
      case PIOCSFAULT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSFAULT ? "PIOCSFAULT" : "PIOCGFAULT");
                 opcode == PIOCSFAULT ? "PIOCSFAULT" : "PIOCGFAULT");
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
                                    (fltset_t *) ptr, 0);
                                    (fltset_t *) ptr, 0);
        break;
        break;
      case PIOCSENTRY:
      case PIOCSENTRY:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSENTRY ? "PIOCSENTRY" : "PIOCGENTRY");
                 opcode == PIOCSENTRY ? "PIOCSENTRY" : "PIOCGENTRY");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) ptr, 0);
                                    (sysset_t *) ptr, 0);
        break;
        break;
      case PIOCSEXIT:
      case PIOCSEXIT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSEXIT ? "PIOCSEXIT" : "PIOCGEXIT");
                 opcode == PIOCSEXIT ? "PIOCSEXIT" : "PIOCGEXIT");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) ptr, 0);
                                    (sysset_t *) ptr, 0);
        break;
        break;
      case PIOCSHOLD:
      case PIOCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (%s) ",
                 "ioctl (%s) ",
                 opcode == PIOCSHOLD ? "PIOCSHOLD" : "PIOCGHOLD");
                 opcode == PIOCSHOLD ? "PIOCSHOLD" : "PIOCGHOLD");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) ptr, 0);
                                     (sigset_t *) ptr, 0);
        break;
        break;
      case PIOCSSIG:
      case PIOCSSIG:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSSIG) ");
                 "ioctl (PIOCSSIG) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  ptr ? ((siginfo_t *) ptr)->si_signo : 0,
                                  ptr ? ((siginfo_t *) ptr)->si_signo : 0,
                                  0);
                                  0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PIOCRUN:
      case PIOCRUN:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCRUN) ");
                 "ioctl (PIOCRUN) ");
 
 
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        if (arg1 & PRCSIG)
        if (arg1 & PRCSIG)
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
        if (arg1 & PRCFAULT)
        if (arg1 & PRCFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg1 & PRSTRACE)
        if (arg1 & PRSTRACE)
          fprintf (procfs_file ? procfs_file : stdout, "setTrace ");
          fprintf (procfs_file ? procfs_file : stdout, "setTrace ");
        if (arg1 & PRSHOLD)
        if (arg1 & PRSHOLD)
          fprintf (procfs_file ? procfs_file : stdout, "setHold ");
          fprintf (procfs_file ? procfs_file : stdout, "setHold ");
        if (arg1 & PRSFAULT)
        if (arg1 & PRSFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "setFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "setFlt ");
        if (arg1 & PRSVADDR)
        if (arg1 & PRSVADDR)
          fprintf (procfs_file ? procfs_file : stdout, "setVaddr ");
          fprintf (procfs_file ? procfs_file : stdout, "setVaddr ");
        if (arg1 & PRSTEP)
        if (arg1 & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
          fprintf (procfs_file ? procfs_file : stdout, "step ");
        if (arg1 & PRSABORT)
        if (arg1 & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
        if (arg1 & PRSTOP)
        if (arg1 & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
 
 
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PIOCKILL:
      case PIOCKILL:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCKILL) ");
                 "ioctl (PIOCKILL) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  ptr ? *(long *) ptr : 0, 0);
                                  ptr ? *(long *) ptr : 0, 0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
#ifdef PIOCSSPCACT
#ifdef PIOCSSPCACT
      case PIOCSSPCACT:
      case PIOCSSPCACT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "ioctl (PIOCSSPCACT) ");
                 "ioctl (PIOCSSPCACT) ");
        arg1 = ptr ? *(long *) ptr : 0;
        arg1 = ptr ? *(long *) ptr : 0;
        if (arg1 & PRFS_STOPFORK)
        if (arg1 & PRFS_STOPFORK)
          fprintf (procfs_file ? procfs_file : stdout, "stopFork ");
          fprintf (procfs_file ? procfs_file : stdout, "stopFork ");
        if (arg1 & PRFS_STOPEXEC)
        if (arg1 & PRFS_STOPEXEC)
          fprintf (procfs_file ? procfs_file : stdout, "stopExec ");
          fprintf (procfs_file ? procfs_file : stdout, "stopExec ");
        if (arg1 & PRFS_STOPTERM)
        if (arg1 & PRFS_STOPTERM)
          fprintf (procfs_file ? procfs_file : stdout, "stopTerm ");
          fprintf (procfs_file ? procfs_file : stdout, "stopTerm ");
        if (arg1 & PRFS_STOPTCR)
        if (arg1 & PRFS_STOPTCR)
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadCreate ");
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadCreate ");
        if (arg1 & PRFS_STOPTTERM)
        if (arg1 & PRFS_STOPTTERM)
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadTerm ");
          fprintf (procfs_file ? procfs_file : stdout, "stopThreadTerm ");
        if (arg1 & PRFS_KOLC)
        if (arg1 & PRFS_KOLC)
          fprintf (procfs_file ? procfs_file : stdout, "killOnLastClose ");
          fprintf (procfs_file ? procfs_file : stdout, "killOnLastClose ");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
#endif /* PIOCSSPCACT */
#endif /* PIOCSSPCACT */
      default:
      default:
        if (ioctl_table[i].name)
        if (ioctl_table[i].name)
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "ioctl (%s) %s\n",
                   "ioctl (%s) %s\n",
                   ioctl_table[i].name,
                   ioctl_table[i].name,
                   info_verbose ? ioctl_table[i].desc : "");
                   info_verbose ? ioctl_table[i].desc : "");
        else
        else
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "ioctl (<unknown %ld (0x%lx)) \n", opcode, opcode);
                   "ioctl (<unknown %ld (0x%lx)) \n", opcode, opcode);
        break;
        break;
      }
      }
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  errno = 0;
  errno = 0;
  ret = ioctl (fd, opcode, ptr);
  ret = ioctl (fd, opcode, ptr);
  if (procfs_trace && ret < 0)
  if (procfs_trace && ret < 0)
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[ioctl (%s) FAILED! (%s)]\n",
               "[ioctl (%s) FAILED! (%s)]\n",
               ioctl_table[i].name != NULL ?
               ioctl_table[i].name != NULL ?
               ioctl_table[i].name : "<unknown>",
               ioctl_table[i].name : "<unknown>",
               safe_strerror (errno));
               safe_strerror (errno));
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
#else   /* NEW_PROC_API */
#else   /* NEW_PROC_API */
 
 
static struct trans rw_table[] = {
static struct trans rw_table[] = {
#ifdef PCAGENT                  /* solaris */
#ifdef PCAGENT                  /* solaris */
  { PCAGENT,  "PCAGENT",  "create agent lwp with regs from argument" },
  { PCAGENT,  "PCAGENT",  "create agent lwp with regs from argument" },
#endif
#endif
  { PCCFAULT, "PCCFAULT", "clear current fault" },
  { PCCFAULT, "PCCFAULT", "clear current fault" },
#ifdef PCCSIG                   /* solaris */
#ifdef PCCSIG                   /* solaris */
  { PCCSIG,   "PCCSIG",   "clear current signal" },
  { PCCSIG,   "PCCSIG",   "clear current signal" },
#endif
#endif
#ifdef PCDSTOP                  /* solaris */
#ifdef PCDSTOP                  /* solaris */
  { PCDSTOP,  "PCDSTOP",  "post stop request" },
  { PCDSTOP,  "PCDSTOP",  "post stop request" },
#endif
#endif
  { PCKILL,   "PCKILL",   "post a signal" },
  { PCKILL,   "PCKILL",   "post a signal" },
#ifdef PCNICE                   /* solaris */
#ifdef PCNICE                   /* solaris */
  { PCNICE,   "PCNICE",   "set nice priority" },
  { PCNICE,   "PCNICE",   "set nice priority" },
#endif
#endif
#ifdef PCREAD                   /* solaris */
#ifdef PCREAD                   /* solaris */
  { PCREAD,   "PCREAD",   "read from the address space" },
  { PCREAD,   "PCREAD",   "read from the address space" },
  { PCWRITE,  "PCWRITE",  "write to the address space" },
  { PCWRITE,  "PCWRITE",  "write to the address space" },
#endif
#endif
#ifdef PCRESET                  /* unixware */
#ifdef PCRESET                  /* unixware */
  { PCRESET,  "PCRESET",  "unset modes" },
  { PCRESET,  "PCRESET",  "unset modes" },
#endif
#endif
  { PCRUN,    "PCRUN",    "make process/lwp runnable" },
  { PCRUN,    "PCRUN",    "make process/lwp runnable" },
#ifdef PCSASRS                  /* solaris 2.7 only */
#ifdef PCSASRS                  /* solaris 2.7 only */
  { PCSASRS,  "PCSASRS",  "set ancillary state registers" },
  { PCSASRS,  "PCSASRS",  "set ancillary state registers" },
#endif
#endif
#ifdef PCSCRED                  /* solaris */
#ifdef PCSCRED                  /* solaris */
  { PCSCRED,  "PCSCRED",  "set process credentials" },
  { PCSCRED,  "PCSCRED",  "set process credentials" },
#endif
#endif
  { PCSENTRY, "PCSENTRY", "set traced syscall entry set" },
  { PCSENTRY, "PCSENTRY", "set traced syscall entry set" },
  { PCSET,    "PCSET",    "set modes" },
  { PCSET,    "PCSET",    "set modes" },
  { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
  { PCSEXIT,  "PCSEXIT",  "set traced syscall exit  set" },
  { PCSFAULT, "PCSFAULT", "set traced fault set" },
  { PCSFAULT, "PCSFAULT", "set traced fault set" },
  { PCSFPREG, "PCSFPREG", "set floating point registers" },
  { PCSFPREG, "PCSFPREG", "set floating point registers" },
#ifdef PCSHOLD                  /* solaris */
#ifdef PCSHOLD                  /* solaris */
  { PCSHOLD,  "PCSHOLD",  "set signal mask" },
  { PCSHOLD,  "PCSHOLD",  "set signal mask" },
#endif
#endif
  { PCSREG,   "PCSREG",   "set general registers" },
  { PCSREG,   "PCSREG",   "set general registers" },
  { PCSSIG,   "PCSSIG",   "set current signal" },
  { PCSSIG,   "PCSSIG",   "set current signal" },
  { PCSTOP,   "PCSTOP",   "post stop request and wait" },
  { PCSTOP,   "PCSTOP",   "post stop request and wait" },
  { PCSTRACE, "PCSTRACE", "set traced signal set" },
  { PCSTRACE, "PCSTRACE", "set traced signal set" },
#ifdef PCSVADDR                 /* solaris */
#ifdef PCSVADDR                 /* solaris */
  { PCSVADDR, "PCSVADDR", "set pc virtual address" },
  { PCSVADDR, "PCSVADDR", "set pc virtual address" },
#endif
#endif
#ifdef PCSXREG                  /* solaris sparc only */
#ifdef PCSXREG                  /* solaris sparc only */
  { PCSXREG,  "PCSXREG",  "set extra registers" },
  { PCSXREG,  "PCSXREG",  "set extra registers" },
#endif
#endif
#ifdef PCTWSTOP                 /* solaris */
#ifdef PCTWSTOP                 /* solaris */
  { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
  { PCTWSTOP, "PCTWSTOP", "wait for stop, with timeout arg" },
#endif
#endif
#ifdef PCUNKILL                 /* solaris */
#ifdef PCUNKILL                 /* solaris */
  { PCUNKILL, "PCUNKILL", "delete a pending signal" },
  { PCUNKILL, "PCUNKILL", "delete a pending signal" },
#endif
#endif
#ifdef PCUNSET                  /* solaris */
#ifdef PCUNSET                  /* solaris */
  { PCUNSET,  "PCUNSET",  "unset modes" },
  { PCUNSET,  "PCUNSET",  "unset modes" },
#endif
#endif
#ifdef PCWATCH                  /* solaris */
#ifdef PCWATCH                  /* solaris */
  { PCWATCH,  "PCWATCH",  "set/unset watched memory area" },
  { PCWATCH,  "PCWATCH",  "set/unset watched memory area" },
#endif
#endif
  { PCWSTOP,  "PCWSTOP",  "wait for process/lwp to stop, no timeout" },
  { PCWSTOP,  "PCWSTOP",  "wait for process/lwp to stop, no timeout" },
  { 0,        NULL,      NULL }
  { 0,        NULL,      NULL }
};
};
 
 
static off_t lseek_offset;
static off_t lseek_offset;
 
 
int
int
write_with_trace (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 = ARRAY_SIZE (rw_table) - 1;
  int i = ARRAY_SIZE (rw_table) - 1;
  int ret;
  int ret;
  procfs_ctl_t *arg = (procfs_ctl_t *) varg;
  procfs_ctl_t *arg = (procfs_ctl_t *) varg;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      procfs_ctl_t opcode = arg[0];
      procfs_ctl_t opcode = arg[0];
      for (i = 0; rw_table[i].name != NULL; i++)
      for (i = 0; rw_table[i].name != NULL; i++)
        if (rw_table[i].value == opcode)
        if (rw_table[i].value == opcode)
          break;
          break;
 
 
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      switch (opcode) {
      switch (opcode) {
      case PCSET:
      case PCSET:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSET,   %s) %s\n",
                 "write (PCSET,   %s) %s\n",
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? rw_table[i].desc : "");
                 info_verbose ? rw_table[i].desc : "");
        break;
        break;
#ifdef PCUNSET
#ifdef PCUNSET
      case PCUNSET:
      case PCUNSET:
#endif
#endif
#ifdef PCRESET
#ifdef PCRESET
#if PCRESET != PCUNSET
#if PCRESET != PCUNSET
      case PCRESET:
      case PCRESET:
#endif
#endif
#endif
#endif
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCRESET, %s) %s\n",
                 "write (PCRESET, %s) %s\n",
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_FORK  ? "PR_FORK"  :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
                 arg[1] == PR_RLC   ? "PR_RLC"   :
#ifdef PR_ASYNC
#ifdef PR_ASYNC
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
                 arg[1] == PR_ASYNC ? "PR_ASYNC" :
#endif
#endif
                 "<unknown flag>",
                 "<unknown flag>",
                 info_verbose ? rw_table[i].desc : "");
                 info_verbose ? rw_table[i].desc : "");
        break;
        break;
      case PCSTRACE:
      case PCSTRACE:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSTRACE) ");
                 "write (PCSTRACE) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
                                     (sigset_t *) &arg[1], 0);
        break;
        break;
      case PCSFAULT:
      case PCSFAULT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSFAULT) ");
                 "write (PCSFAULT) ");
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_faultset (procfs_file ? procfs_file : stdout,
                                    (fltset_t *) &arg[1], 0);
                                    (fltset_t *) &arg[1], 0);
        break;
        break;
      case PCSENTRY:
      case PCSENTRY:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSENTRY) ");
                 "write (PCSENTRY) ");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
                                    (sysset_t *) &arg[1], 0);
        break;
        break;
      case PCSEXIT:
      case PCSEXIT:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSEXIT) ");
                 "write (PCSEXIT) ");
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_syscalls (procfs_file ? procfs_file : stdout,
                                    (sysset_t *) &arg[1], 0);
                                    (sysset_t *) &arg[1], 0);
        break;
        break;
#ifdef PCSHOLD
#ifdef PCSHOLD
      case PCSHOLD:
      case PCSHOLD:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSHOLD) ");
                 "write (PCSHOLD) ");
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signalset (procfs_file ? procfs_file : stdout,
                                     (sigset_t *) &arg[1], 0);
                                     (sigset_t *) &arg[1], 0);
        break;
        break;
#endif
#endif
      case PCSSIG:
      case PCSSIG:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCSSIG) ");
                 "write (PCSSIG) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  arg[1] ? ((siginfo_t *) &arg[1])->si_signo
                                  arg[1] ? ((siginfo_t *) &arg[1])->si_signo
                                         : 0,
                                         : 0,
                                  0);
                                  0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PCRUN:
      case PCRUN:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCRUN) ");
                 "write (PCRUN) ");
        if (arg[1] & PRCSIG)
        if (arg[1] & PRCSIG)
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
          fprintf (procfs_file ? procfs_file : stdout, "clearSig ");
        if (arg[1] & PRCFAULT)
        if (arg[1] & PRCFAULT)
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
          fprintf (procfs_file ? procfs_file : stdout, "clearFlt ");
        if (arg[1] & PRSTEP)
        if (arg[1] & PRSTEP)
          fprintf (procfs_file ? procfs_file : stdout, "step ");
          fprintf (procfs_file ? procfs_file : stdout, "step ");
#ifdef PRSABORT
#ifdef PRSABORT
        if (arg[1] & PRSABORT)
        if (arg[1] & PRSABORT)
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
          fprintf (procfs_file ? procfs_file : stdout, "syscallAbort ");
#endif
#endif
#ifdef PRSTOP
#ifdef PRSTOP
        if (arg[1] & PRSTOP)
        if (arg[1] & PRSTOP)
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
          fprintf (procfs_file ? procfs_file : stdout, "stopReq ");
#endif
#endif
 
 
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      case PCKILL:
      case PCKILL:
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "write (PCKILL) ");
                 "write (PCKILL) ");
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_signal (procfs_file ? procfs_file : stdout,
                                  arg[1], 0);
                                  arg[1], 0);
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        fprintf (procfs_file ? procfs_file : stdout, "\n");
        break;
        break;
      default:
      default:
        {
        {
          if (rw_table[i].name)
          if (rw_table[i].name)
            fprintf (procfs_file ? procfs_file : stdout,
            fprintf (procfs_file ? procfs_file : stdout,
                     "write (%s) %s\n",
                     "write (%s) %s\n",
                     rw_table[i].name,
                     rw_table[i].name,
                     info_verbose ? rw_table[i].desc : "");
                     info_verbose ? rw_table[i].desc : "");
          else
          else
            {
            {
              if (lseek_offset != -1)
              if (lseek_offset != -1)
                fprintf (procfs_file ? procfs_file : stdout,
                fprintf (procfs_file ? procfs_file : stdout,
                         "write (<unknown>, %lud bytes at 0x%08lx) \n",
                         "write (<unknown>, %lud bytes at 0x%08lx) \n",
                         (unsigned long) len, (unsigned long) lseek_offset);
                         (unsigned long) len, (unsigned long) lseek_offset);
              else
              else
                fprintf (procfs_file ? procfs_file : stdout,
                fprintf (procfs_file ? procfs_file : stdout,
                         "write (<unknown>, %lud bytes) \n",
                         "write (<unknown>, %lud bytes) \n",
                         (unsigned long) len);
                         (unsigned long) len);
            }
            }
          break;
          break;
        }
        }
      }
      }
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  errno = 0;
  errno = 0;
  ret = write (fd, (void *) arg, len);
  ret = write (fd, (void *) arg, len);
  if (procfs_trace && ret != len)
  if (procfs_trace && ret != len)
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[write (%s) FAILED! (%s)]\n",
               "[write (%s) FAILED! (%s)]\n",
               rw_table[i].name != NULL ?
               rw_table[i].name != NULL ?
               rw_table[i].name : "<unknown>",
               rw_table[i].name : "<unknown>",
               safe_strerror (errno));
               safe_strerror (errno));
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  lseek_offset = -1;
  lseek_offset = -1;
  return ret;
  return ret;
}
}
 
 
off_t
off_t
lseek_with_trace (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;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
  errno = 0;
  errno = 0;
  ret = lseek (fd, offset, whence);
  ret = lseek (fd, offset, whence);
  lseek_offset = ret;
  lseek_offset = ret;
  if (procfs_trace && (ret == -1 || errno != 0))
  if (procfs_trace && (ret == -1 || errno != 0))
    {
    {
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "[lseek (0x%08lx) FAILED! (%s)]\n",
               "[lseek (0x%08lx) FAILED! (%s)]\n",
               (unsigned long) offset, safe_strerror (errno));
               (unsigned long) offset, safe_strerror (errno));
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
#endif /* NEW_PROC_API */
#endif /* NEW_PROC_API */
 
 
int
int
open_with_trace (char *filename, int mode, char *file, int line)
open_with_trace (char *filename, int mode, char *file, int line)
{
{
  int ret;
  int ret;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
  errno = 0;
  errno = 0;
  ret = open (filename, mode);
  ret = open (filename, mode);
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
 
 
      if (errno)
      if (errno)
        {
        {
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "[open FAILED! (%s) line %d]\\n",
                   "[open FAILED! (%s) line %d]\\n",
                   safe_strerror (errno), line);
                   safe_strerror (errno), line);
        }
        }
      else
      else
        {
        {
          fprintf (procfs_file ? procfs_file : stdout,
          fprintf (procfs_file ? procfs_file : stdout,
                   "%d = open (%s, ", ret, filename);
                   "%d = open (%s, ", ret, filename);
          if (mode == O_RDONLY)
          if (mode == O_RDONLY)
            fprintf (procfs_file ? procfs_file : stdout, "O_RDONLY) %d\n",
            fprintf (procfs_file ? procfs_file : stdout, "O_RDONLY) %d\n",
                     line);
                     line);
          else if (mode == O_WRONLY)
          else if (mode == O_WRONLY)
            fprintf (procfs_file ? procfs_file : stdout, "O_WRONLY) %d\n",
            fprintf (procfs_file ? procfs_file : stdout, "O_WRONLY) %d\n",
                     line);
                     line);
          else if (mode == O_RDWR)
          else if (mode == O_RDWR)
            fprintf (procfs_file ? procfs_file : stdout, "O_RDWR)   %d\n",
            fprintf (procfs_file ? procfs_file : stdout, "O_RDWR)   %d\n",
                     line);
                     line);
        }
        }
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
int
int
close_with_trace (int fd, char *file, int line)
close_with_trace (int fd, char *file, int line)
{
{
  int ret;
  int ret;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
  errno = 0;
  errno = 0;
  ret = close (fd);
  ret = close (fd);
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      if (errno)
      if (errno)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "[close FAILED! (%s)]\n", safe_strerror (errno));
                 "[close FAILED! (%s)]\n", safe_strerror (errno));
      else
      else
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%d = close (%d)\n", ret, fd);
                 "%d = close (%d)\n", ret, fd);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
 
 
  return ret;
  return ret;
}
}
 
 
pid_t
pid_t
wait_with_trace (int *wstat, char *file, int line)
wait_with_trace (int *wstat, char *file, int line)
{
{
  int ret, lstat = 0;
  int ret, lstat = 0;
 
 
  prepare_to_trace ();
  prepare_to_trace ();
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout,
      fprintf (procfs_file ? procfs_file : stdout,
               "wait (line %d) ", line);
               "wait (line %d) ", line);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  errno = 0;
  errno = 0;
  ret = wait (&lstat);
  ret = wait (&lstat);
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (errno)
      if (errno)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "[wait FAILED! (%s)]\n", safe_strerror (errno));
                 "[wait FAILED! (%s)]\n", safe_strerror (errno));
      else
      else
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "returned pid %d, status 0x%x\n", ret, lstat);
                 "returned pid %d, status 0x%x\n", ret, lstat);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
  if (wstat)
  if (wstat)
    *wstat = lstat;
    *wstat = lstat;
 
 
  return ret;
  return ret;
}
}
 
 
void
void
procfs_note (char *msg, char *file, int line)
procfs_note (char *msg, char *file, int line)
{
{
  prepare_to_trace ();
  prepare_to_trace ();
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (info_verbose)
      if (info_verbose)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "%s:%d -- ", file, line);
                 "%s:%d -- ", file, line);
      fprintf (procfs_file ? procfs_file : stdout, "%s", msg);
      fprintf (procfs_file ? procfs_file : stdout, "%s", msg);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
}
}
 
 
void
void
proc_prettyfprint_status (long flags, int why, int what, int thread)
proc_prettyfprint_status (long flags, int why, int what, int thread)
{
{
  prepare_to_trace ();
  prepare_to_trace ();
  if (procfs_trace)
  if (procfs_trace)
    {
    {
      if (thread)
      if (thread)
        fprintf (procfs_file ? procfs_file : stdout,
        fprintf (procfs_file ? procfs_file : stdout,
                 "Thread %d: ", thread);
                 "Thread %d: ", thread);
 
 
      proc_prettyfprint_flags (procfs_file ? procfs_file : stdout,
      proc_prettyfprint_flags (procfs_file ? procfs_file : stdout,
                               flags, 0);
                               flags, 0);
 
 
      if (flags & (PR_STOPPED | PR_ISTOP))
      if (flags & (PR_STOPPED | PR_ISTOP))
        proc_prettyfprint_why (procfs_file ? procfs_file : stdout,
        proc_prettyfprint_why (procfs_file ? procfs_file : stdout,
                               why, what, 0);
                               why, what, 0);
      if (procfs_file)
      if (procfs_file)
        fflush (procfs_file);
        fflush (procfs_file);
    }
    }
}
}
 
 
 
 
void
void
_initialize_proc_api (void)
_initialize_proc_api (void)
{
{
  struct cmd_list_element *c;
  struct cmd_list_element *c;
 
 
  add_setshow_boolean_cmd ("procfs-trace", no_class, &procfs_trace, _("\
  add_setshow_boolean_cmd ("procfs-trace", no_class, &procfs_trace, _("\
Set tracing for /proc api calls."), _("\
Set tracing for /proc api calls."), _("\
Show tracing for /proc api calls."), NULL,
Show tracing for /proc api calls."), NULL,
                           set_procfs_trace_cmd,
                           set_procfs_trace_cmd,
                           NULL, /* FIXME: i18n: */
                           NULL, /* FIXME: i18n: */
                           &setlist, &showlist);
                           &setlist, &showlist);
 
 
  add_setshow_filename_cmd ("procfs-file", no_class, &procfs_filename, _("\
  add_setshow_filename_cmd ("procfs-file", no_class, &procfs_filename, _("\
Set filename for /proc tracefile."), _("\
Set filename for /proc tracefile."), _("\
Show filename for /proc tracefile."), NULL,
Show filename for /proc tracefile."), NULL,
                            set_procfs_file_cmd,
                            set_procfs_file_cmd,
                            NULL, /* FIXME: i18n: */
                            NULL, /* FIXME: i18n: */
                            &setlist, &showlist);
                            &setlist, &showlist);
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.