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);