From 5b946cb261916bf451362c99a7665eff0a9c3496 Mon Sep 17 00:00:00 2001 From: Martin Baulig Date: Sat, 3 Apr 1999 17:07:09 +0000 Subject: [PATCH] Added support for command line arguments (glibtop_proc_args). --- sysdeps/kernel/glibtop_private.h | 5 ++++ sysdeps/kernel/procargs.c | 43 +++++++++++++++++++++++++++++--- sysdeps/kernel/procdata.c | 15 +++++++++++ 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/sysdeps/kernel/glibtop_private.h b/sysdeps/kernel/glibtop_private.h index 72a89413..69770d41 100644 --- a/sysdeps/kernel/glibtop_private.h +++ b/sysdeps/kernel/glibtop_private.h @@ -69,6 +69,11 @@ glibtop_get_proc_data_proc_kernel_s (glibtop *server, libgtop_proc_kernel_t *proc_kernel, pid_t pid); +int +glibtop_get_proc_data_proc_args_s (glibtop *server, pid_t pid, + char *result, size_t max_len); + + END_LIBGTOP_DECLS #endif __GLIBTOP_PRIVATE_H__ diff --git a/sysdeps/kernel/procargs.c b/sysdeps/kernel/procargs.c index 7d010d5e..9e64c295 100644 --- a/sysdeps/kernel/procargs.c +++ b/sysdeps/kernel/procargs.c @@ -26,14 +26,17 @@ #include #include -static const unsigned long _glibtop_sysdeps_proc_args = 0; +#include + +static const unsigned long _glibtop_sysdeps_proc_args = +(1 << GLIBTOP_PROC_ARGS_SIZE); /* Init function. */ void glibtop_init_proc_args_s (glibtop *server) { - server->sysdeps.proc_args = _glibtop_sysdeps_proc_args; + server->sysdeps.proc_args = _glibtop_sysdeps_proc_args; } /* Provides detailed information about a process. */ @@ -42,6 +45,40 @@ char * glibtop_get_proc_args_s (glibtop *server, glibtop_proc_args *buf, pid_t pid, unsigned max_len) { - memset (buf, 0, sizeof (glibtop_proc_args)); + char buffer [BUFSIZ]; + char *retval = NULL, *ptr; + size_t total; + int ret; + + memset (buf, 0, sizeof (glibtop_proc_args)); + + if (max_len > BUFSIZ) + retval = ptr = glibtop_malloc_r (server, max_len+1); + else + ptr = buffer; + + if (!max_len) + max_len = BUFSIZ; + + ret = glibtop_get_proc_data_proc_args_s (server, pid, ptr, max_len); + if (!ret) { + if (!retval) glibtop_free_r (server, retval); return NULL; + } + + total = ret; + + if (retval) { + retval = glibtop_realloc_r (server, retval, total+1); + } else { + retval = glibtop_malloc_r (server, total+1); + memcpy (retval, buffer, total); + } + + retval [total] = 0; + + buf->size = total; + buf->flags = _glibtop_sysdeps_proc_args; + + return retval; } diff --git a/sysdeps/kernel/procdata.c b/sysdeps/kernel/procdata.c index 5eec0f98..abc6e3d7 100644 --- a/sysdeps/kernel/procdata.c +++ b/sysdeps/kernel/procdata.c @@ -146,3 +146,18 @@ glibtop_get_proc_data_proc_kernel_s (glibtop *server, return 0; } + +int +glibtop_get_proc_data_proc_args_s (glibtop *server, pid_t pid, + char *result, size_t max_len) +{ + int name [3] = { CTL_LIBGTOP, LIBGTOP_PROC_ARGS, pid }; + size_t size = max_len; + + if (sysctl (name, 3, result, &size, NULL, 0)) { + glibtop_warn_io_r (server, "sysctl (libgtop/proc_args)"); + return -1; + } + + return size; +}