/* Machine independent support for SVR4 /proc (process file system) for GDB.
   Copyright (C) 1999-2023 Free Software Foundation, Inc.

   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 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.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef PROC_UTILS_H
#define PROC_UTILS_H

/* From proc-why.c */

/*
 * Pretty-print functions for /proc data 
 */

extern void proc_prettyprint_why (unsigned long why, unsigned long what,
				  int verbose);

extern void proc_prettyprint_syscalls (sysset_t *sysset, int verbose);

extern void proc_prettyprint_syscall (int num, int verbose);

extern void proc_prettyprint_signalset (sigset_t *sigset, int verbose);

extern void proc_prettyprint_signal (int signo, int verbose);

extern void proc_prettyprint_faultset (fltset_t *fltset, int verbose);

extern void proc_prettyprint_fault (int faultno, int verbose);

extern void proc_prettyprint_actionset (struct sigaction *actions,
					int verbose);

extern void proc_prettyfprint_signalset (FILE *file, sigset_t *sigset,
					 int verbose);

extern void proc_prettyfprint_faultset (FILE *file, fltset_t *fltset,
					int verbose);

extern void proc_prettyfprint_syscall (FILE *file, int num, int verbose);

extern void proc_prettyfprint_signal (FILE *file, int signo, int verbose);

extern void proc_prettyfprint_flags (FILE *file, unsigned long flags,
				     int verbose);

extern void proc_prettyfprint_why (FILE *file, unsigned long why,
				   unsigned long what, int verbose);

extern void proc_prettyfprint_fault (FILE *file, int faultno, int verbose);

extern void proc_prettyfprint_syscalls (FILE *file, sysset_t *sysset,
					int verbose);

extern void proc_prettyfprint_status (long, int, int, int);

/* From proc-flags.c */

/*
 * Pretty-print the prstatus flags.
 */

extern void proc_prettyprint_flags (unsigned long flags, int verbose);

extern void proc_prettyfprint_flags (FILE *file, unsigned long flags,
				     int verbose);

/* From proc-api.c */

/*
 * Trace functions for /proc api.
 */

extern int write_with_trace (int, void *, size_t, char *, int);
extern off_t lseek_with_trace (int, off_t, int, char *, int);
extern int ioctl_with_trace (int, long, void *, char *, int);
extern pid_t wait_with_trace (int *, char *, int);
extern int open_with_trace (char *, int, char *, int);
extern int close_with_trace (int, char *, int);
extern void procfs_note (const char *, const char *, int);

#ifdef PROCFS_TRACE
/*
 * Debugging code:
 *
 * These macros allow me to trace the system calls that we make
 * to control the child process.  This is quite handy for comparing
 * with the older version of procfs.
 */

#define write(X, Y, Z) write_with_trace (X, Y, Z, __FILE__, __LINE__)
#define lseek(X, Y, Z) lseek_with_trace (X, Y, Z, __FILE__, __LINE__)
#define ioctl(X, Y, Z) ioctl_with_trace (X, Y, Z, __FILE__, __LINE__)
#define open(X, Y) open_with_trace (X, Y, __FILE__, __LINE__)
#define close(X) close_with_trace (X, __FILE__, __LINE__)
#define wait(X) wait_with_trace (X, __FILE__, __LINE__)
#endif
#define PROCFS_NOTE(X) procfs_note (X, __FILE__, __LINE__)
#define PROC_PRETTYFPRINT_STATUS(X, Y, Z, T) \
  proc_prettyfprint_status (X, Y, Z, T)

/* Define the type (and more importantly the width) of the control
   word used to write to the /proc/PID/ctl file.  */
typedef long procfs_ctl_t;

#endif /* PROC_UTILS_H */
