summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuy M. Broome <thrirhrafnir@gmail.com>2018-03-29 13:28:43 -0400
committerHisham Muhammad <hisham@gobolinux.org>2018-04-06 11:14:09 -0300
commitbeb47cbb121607a4ef4601923ad09a58cac1d723 (patch)
tree3395c5df7c855a99167d1c86995a72bc9c5deab8
parent677cac9fabb5d99835a0bd4880d19eb0ea9ce540 (diff)
Solaris: Implement process environment listing
-rw-r--r--solaris/Platform.c44
-rw-r--r--solaris/Platform.h9
2 files changed, 51 insertions, 2 deletions
diff --git a/solaris/Platform.c b/solaris/Platform.c
index ebcd2a28..c6e9c1b8 100644
--- a/solaris/Platform.c
+++ b/solaris/Platform.c
@@ -37,12 +37,21 @@ in the source distribution for its full text.
#include "SignalsPanel.h"
#include <signal.h>
#include <sys/mkdev.h>
+#include <sys/proc.h>
+#include <libproc.h>
#define kill(pid, signal) kill(pid / 1024, signal)
extern ProcessFieldData Process_fields[];
typedef struct var kvar_t;
+typedef struct envAccum_ {
+ size_t capacity;
+ size_t size;
+ size_t bytes;
+ char *env;
+} envAccum;
+
}*/
double plat_loadavg[3] = {0};
@@ -211,7 +220,38 @@ void Platform_setSwapValues(Meter* this) {
this->values[0] = pl->usedSwap;
}
+static int Platform_buildenv(void *accum, struct ps_prochandle *Phandle, uintptr_t addr, const char *str) {
+ envAccum *accump = accum;
+ (void) Phandle;
+ (void) addr;
+ size_t thissz = strlen(str);
+ if ((thissz + 2) > (accump->capacity - accump->size))
+ accump->env = xRealloc(accump->env, accump->capacity *= 2);
+ if ((thissz + 2) > (accump->capacity - accump->size))
+ return 1;
+ strlcpy( accump->env + accump->size, str, (accump->capacity - accump->size));
+ strncpy( accump->env + accump->size + thissz + 1, "\n", 1);
+ accump->size = accump->size + thissz + 1;
+ return 0;
+}
+
char* Platform_getProcessEnv(pid_t pid) {
- (void) pid;
- return "Not (yet) supported on Solaris. Sorry!";
+ envAccum envBuilder;
+ pid_t realpid = pid / 1024;
+ int graberr;
+ struct ps_prochandle *Phandle;
+
+ if ((Phandle = Pgrab(realpid,PGRAB_RDONLY,&graberr)) == NULL)
+ return "Unable to read process environment.";
+
+ envBuilder.capacity = 4096;
+ envBuilder.size = 0;
+ envBuilder.env = xMalloc(envBuilder.capacity);
+
+ (void) Penv_iter(Phandle,Platform_buildenv,&envBuilder);
+
+ Prelease(Phandle, 0);
+
+ strncpy( envBuilder.env + envBuilder.size, "\0", 1);
+ return envBuilder.env;
}
diff --git a/solaris/Platform.h b/solaris/Platform.h
index 01ffa59b..6b820fea 100644
--- a/solaris/Platform.h
+++ b/solaris/Platform.h
@@ -16,12 +16,21 @@ in the source distribution for its full text.
#include "SignalsPanel.h"
#include <signal.h>
#include <sys/mkdev.h>
+#include <sys/proc.h>
+#include <libproc.h>
#define kill(pid, signal) kill(pid / 1024, signal)
extern ProcessFieldData Process_fields[];
typedef struct var kvar_t;
+typedef struct envAccum_ {
+ size_t capacity;
+ size_t size;
+ size_t bytes;
+ char *env;
+} envAccum;
+
extern double plat_loadavg[3];

© 2014-2024 Faster IT GmbH | imprint | privacy policy