Print this page
3946 ::gcore
Reviewed by: Adam Leventhal <ahl@delphix.com>
Reviewed by: Matthew Ahrens <mahrens@delphix.com>

@@ -24,10 +24,11 @@
  * Use is subject to license terms.
  *
  * Portions Copyright 2007 Chad Mynhier
  * Copyright 2012 DEY Storage Systems, Inc.  All rights reserved.
  * Copyright (c) 2013, Joyent, Inc. All rights reserved.
+ * Copyright (c) 2013 by Delphix. All rights reserved.
  */
 
 /*
  * Interfaces available from the process control library, libproc.
  *

@@ -125,10 +126,11 @@
 /* Flags accepted by Pgrab() */
 #define PGRAB_RETAIN    0x01    /* Retain tracing flags, else clear flags */
 #define PGRAB_FORCE     0x02    /* Open the process w/o O_EXCL */
 #define PGRAB_RDONLY    0x04    /* Open the process or core w/ O_RDONLY */
 #define PGRAB_NOSTOP    0x08    /* Open the process but do not stop it */
+#define PGRAB_INCORE    0x10    /* Use in-core data to build symbol tables */
 
 /* Error codes from Pcreate() */
 #define C_STRANGE       -1      /* Unanticipated error, errno is meaningful */
 #define C_FORK          1       /* Unable to fork */
 #define C_PERM          2       /* No permission (file set-id or unreadable) */

@@ -186,10 +188,59 @@
 
 /* maximum size in bytes of a BYREF argument */
 #define MAXARGL         (4*1024)
 
 /*
+ * Ops vector definition for the Pgrab_ops().
+ */
+typedef ssize_t (*pop_pread_t)(struct ps_prochandle *, void *, size_t,
+    uintptr_t, void *);
+typedef ssize_t (*pop_pwrite_t)(struct ps_prochandle *, const void *, size_t,
+    uintptr_t, void *);
+typedef int (*pop_read_maps_t)(struct ps_prochandle *, prmap_t **, ssize_t *,
+    void *);
+typedef void (*pop_read_aux_t)(struct ps_prochandle *, auxv_t **, int *,
+    void *);
+typedef int (*pop_cred_t)(struct ps_prochandle *, prcred_t *, int,
+    void *);
+typedef int (*pop_priv_t)(struct ps_prochandle *, prpriv_t **, void *);
+typedef const psinfo_t *(*pop_psinfo_t)(struct ps_prochandle *, psinfo_t *,
+    void *);
+typedef void (*pop_status_t)(struct ps_prochandle *, pstatus_t *, void *);
+typedef prheader_t *(*pop_lstatus_t)(struct ps_prochandle *, void *);
+typedef prheader_t *(*pop_lpsinfo_t)(struct ps_prochandle *, void *);
+typedef void (*pop_fini_t)(struct ps_prochandle *, void *);
+typedef char *(*pop_platform_t)(struct ps_prochandle *, char *, size_t, void *);
+typedef int (*pop_uname_t)(struct ps_prochandle *, struct utsname *, void *);
+typedef char *(*pop_zonename_t)(struct ps_prochandle *, char *, size_t, void *);
+typedef char *(*pop_execname_t)(struct ps_prochandle *, char *, size_t, void *);
+#if defined(__i386) || defined(__amd64)
+typedef int (*pop_ldt_t)(struct ps_prochandle *, struct ssd *, int, void *);
+#endif
+
+typedef struct ps_ops {
+        pop_pread_t             pop_pread;
+        pop_pwrite_t            pop_pwrite;
+        pop_read_maps_t         pop_read_maps;
+        pop_read_aux_t          pop_read_aux;
+        pop_cred_t              pop_cred;
+        pop_priv_t              pop_priv;
+        pop_psinfo_t            pop_psinfo;
+        pop_status_t            pop_status;
+        pop_lstatus_t           pop_lstatus;
+        pop_lpsinfo_t           pop_lpsinfo;
+        pop_fini_t              pop_fini;
+        pop_platform_t          pop_platform;
+        pop_uname_t             pop_uname;
+        pop_zonename_t          pop_zonename;
+        pop_execname_t          pop_execname;
+#if defined(__i386) || defined(__amd64)
+        pop_ldt_t               pop_ldt;
+#endif
+} ps_ops_t;
+
+/*
  * Function prototypes for routines in the process control package.
  */
 extern struct ps_prochandle *Pcreate(const char *, char *const *,
     int *, char *, size_t);
 extern struct ps_prochandle *Pxcreate(const char *, char *const *,

@@ -199,10 +250,11 @@
 
 extern struct ps_prochandle *Pgrab(pid_t, int, int *);
 extern struct ps_prochandle *Pgrab_core(const char *, const char *, int, int *);
 extern struct ps_prochandle *Pfgrab_core(int, const char *, int *);
 extern struct ps_prochandle *Pgrab_file(const char *, int *);
+extern struct ps_prochandle *Pgrab_ops(pid_t, void *, const ps_ops_t *, int);
 extern const char *Pgrab_error(int);
 
 extern  int     Preopen(struct ps_prochandle *);
 extern  void    Prelease(struct ps_prochandle *, int);
 extern  void    Pfree(struct ps_prochandle *);

@@ -219,11 +271,11 @@
 extern  int     Pstate(struct ps_prochandle *);
 extern  const psinfo_t *Ppsinfo(struct ps_prochandle *);
 extern  const pstatus_t *Pstatus(struct ps_prochandle *);
 extern  int     Pcred(struct ps_prochandle *, prcred_t *, int);
 extern  int     Psetcred(struct ps_prochandle *, const prcred_t *);
-extern  ssize_t Ppriv(struct ps_prochandle *, prpriv_t *, size_t);
+extern  int     Ppriv(struct ps_prochandle *, prpriv_t **);
 extern  int     Psetpriv(struct ps_prochandle *, prpriv_t *);
 extern  void   *Pprivinfo(struct ps_prochandle *);
 extern  int     Psetzoneid(struct ps_prochandle *, zoneid_t);
 extern  int     Pgetareg(struct ps_prochandle *, int, prgreg_t *);
 extern  int     Pputareg(struct ps_prochandle *, int, prgreg_t);