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

@@ -20,10 +20,13 @@
  */
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
+/*
+ * Copyright (c) 2013 by Delphix. All rights reserved.
+ */
 
 #include <stdlib.h>
 #include <libelf.h>
 #include <libgen.h>
 #include <string.h>

@@ -32,12 +35,14 @@
 #include <sys/sysmacros.h>
 
 #include "libproc.h"
 #include "Pcontrol.h"
 
+/*ARGSUSED*/
 static ssize_t
-Pread_idle(struct ps_prochandle *P, void *buf, size_t n, uintptr_t addr)
+Pread_idle(struct ps_prochandle *P, void *buf, size_t n, uintptr_t addr,
+    void *data)
 {
         size_t resid = n;
 
         while (resid > 0) {
                 map_info_t *mp;

@@ -63,19 +68,59 @@
         return (n - resid);
 }
 
 /*ARGSUSED*/
 static ssize_t
-Pwrite_idle(struct ps_prochandle *P, const void *buf, size_t n, uintptr_t addr)
+Pwrite_idle(struct ps_prochandle *P, const void *buf, size_t n, uintptr_t addr,
+    void *data)
 {
         errno = EIO;
         return (-1);
 }
 
-static const ps_rwops_t P_idle_ops = {
-        Pread_idle,
-        Pwrite_idle
+/*ARGSUSED*/
+static int
+Ppriv_idle(struct ps_prochandle *P, prpriv_t **pprv, void *data)
+{
+        prpriv_t *pp;
+
+        pp = proc_get_priv(P->pid);
+        if (pp == NULL) {
+                return (-1);
+        }
+
+        *pprv = pp;
+        return (0);
+}
+
+/* Default operations for the idl ops vector. */
+static void *
+Pidle_voidp()
+{
+        errno = ENODATA;
+        return (NULL);
+}
+
+static int
+Pidle_int()
+{
+        errno = ENODATA;
+        return (-1);
+}
+
+static const ps_ops_t P_idle_ops = {
+        .pop_pread      = Pread_idle,
+        .pop_pwrite     = Pwrite_idle,
+        .pop_cred       = (pop_cred_t)Pidle_int,
+        .pop_priv       = Ppriv_idle,
+        .pop_psinfo     = (pop_psinfo_t)Pidle_voidp,
+        .pop_platform   = (pop_platform_t)Pidle_voidp,
+        .pop_uname      = (pop_uname_t)Pidle_int,
+        .pop_zonename   = (pop_zonename_t)Pidle_voidp,
+#if defined(__i386) || defined(__amd64)
+        .pop_ldt        = (pop_ldt_t)Pidle_int
+#endif
 };
 
 static int
 idle_add_mapping(struct ps_prochandle *P, GElf_Phdr *php, file_info_t *fp)
 {

@@ -141,11 +186,11 @@
         P->ctlfd = -1;
         P->statfd = -1;
         P->agentctlfd = -1;
         P->agentstatfd = -1;
         P->info_valid = -1;
-        P->ops = &P_idle_ops;
+        Pinit_ops(&P->ops, &P_idle_ops);
         Pinitsym(P);
 
         if ((elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL) {
                 *perr = G_ELF;
                 return (NULL);