summaryrefslogtreecommitdiff
path: root/lib/libkvm/kvm_proc.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>1999-11-16 20:31:58 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>1999-11-16 20:31:58 +0000
commitb9df5231cae6b5c6cc445bf0e041fe98f6602303 (patch)
tree65eeb4add32e588f36f28e2a0bb819c17a67ff70 /lib/libkvm/kvm_proc.c
parentcf9e5270089595eac4ec8c58dd4980841e00aecf (diff)
Notes
Diffstat (limited to 'lib/libkvm/kvm_proc.c')
-rw-r--r--lib/libkvm/kvm_proc.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/libkvm/kvm_proc.c b/lib/libkvm/kvm_proc.c
index 9543feee4de6..feba97484d2e 100644
--- a/lib/libkvm/kvm_proc.c
+++ b/lib/libkvm/kvm_proc.c
@@ -33,6 +33,8 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
+ *
+ * $FreeBSD$
*/
#if defined(LIBC_SCCS) && !defined(lint)
@@ -666,6 +668,52 @@ kvm_getargv(kd, kp, nchr)
const struct kinfo_proc *kp;
int nchr;
{
+ int oid[4];
+ int i, l;
+ static int buflen;
+ static char *buf, *p;
+ static char **bufp;
+ static int argc;
+
+ if (!buflen) {
+ l = sizeof(buflen);
+ i = sysctlbyname("kern.ps_arg_cache_limit",
+ &buflen, &l, NULL, 0);
+ if (i == -1) {
+ buflen == 0;
+ } else {
+ buf = malloc(buflen);
+ if (buf == NULL)
+ buflen = 0;
+ argc = 32;
+ bufp = malloc(sizeof(char *) * argc);
+ }
+ }
+ if (buf != NULL) {
+ oid[0] = CTL_KERN;
+ oid[1] = KERN_PROC;
+ oid[2] = KERN_PROC_ARGS;
+ oid[3] = kp->kp_proc.p_pid;
+ l = buflen;
+ i = sysctl(oid, 4, buf, &l, 0, 0);
+ if (i == 0 && l > 0) {
+ i = 0;
+ p = buf;
+ do {
+ bufp[i++] = p;
+ p += strlen(p) + 1;
+ if (i >= argc) {
+ argc += argc;
+ bufp = realloc(bufp,
+ sizeof(char *) * argc);
+ }
+ } while (p < buf + l);
+ bufp[i++] = 0;
+ return (bufp);
+ }
+ }
+ if (kp->kp_proc.p_flag & P_SYSTEM)
+ return (NULL);
return (kvm_doargv(kd, kp, nchr, ps_str_a));
}