You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.5 KiB
61 lines
1.5 KiB
#include "config.h" // IWYU pragma: keep |
|
|
|
#include "EnvScreen.h" |
|
|
|
#include <stdlib.h> |
|
#include <string.h> |
|
|
|
#include "CRT.h" |
|
#include "Macros.h" |
|
#include "Panel.h" |
|
#include "Platform.h" |
|
#include "ProvideCurses.h" |
|
#include "Vector.h" |
|
#include "XUtils.h" |
|
|
|
|
|
EnvScreen* EnvScreen_new(Process* process) { |
|
EnvScreen* this = xMalloc(sizeof(EnvScreen)); |
|
Object_setClass(this, Class(EnvScreen)); |
|
return (EnvScreen*) InfoScreen_init(&this->super, process, NULL, LINES - 2, " "); |
|
} |
|
|
|
void EnvScreen_delete(Object* this) { |
|
free(InfoScreen_done((InfoScreen*)this)); |
|
} |
|
|
|
static void EnvScreen_draw(InfoScreen* this) { |
|
InfoScreen_drawTitled(this, "Environment of process %d - %s", this->process->pid, Process_getCommand(this->process)); |
|
} |
|
|
|
static void EnvScreen_scan(InfoScreen* this) { |
|
Panel* panel = this->display; |
|
int idx = MAXIMUM(Panel_getSelectedIndex(panel), 0); |
|
|
|
Panel_prune(panel); |
|
|
|
CRT_dropPrivileges(); |
|
char* env = Platform_getProcessEnv(this->process->pid); |
|
CRT_restorePrivileges(); |
|
if (env) { |
|
for (const char* p = env; *p; p = strrchr(p, 0) + 1) |
|
InfoScreen_addLine(this, p); |
|
free(env); |
|
} |
|
else { |
|
InfoScreen_addLine(this, "Could not read process environment."); |
|
} |
|
|
|
Vector_insertionSort(this->lines); |
|
Vector_insertionSort(panel->items); |
|
Panel_setSelected(panel, idx); |
|
} |
|
|
|
const InfoScreenClass EnvScreen_class = { |
|
.super = { |
|
.extends = Class(Object), |
|
.delete = EnvScreen_delete |
|
}, |
|
.scan = EnvScreen_scan, |
|
.draw = EnvScreen_draw |
|
};
|
|
|