mirror of git://git.suckless.org/sbase
Add parsestatus()
This commit is contained in:
parent
f462025156
commit
e33f5bed23
8
proc.h
8
proc.h
|
@ -27,8 +27,16 @@ struct procstat {
|
||||||
long rsslim;
|
long rsslim;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct procstatus {
|
||||||
|
uid_t uid;
|
||||||
|
uid_t euid;
|
||||||
|
gid_t gid;
|
||||||
|
gid_t egid;
|
||||||
|
};
|
||||||
|
|
||||||
int parsecmdline(pid_t pid, char *buf, size_t siz);
|
int parsecmdline(pid_t pid, char *buf, size_t siz);
|
||||||
int parsestat(pid_t pid, struct procstat *ps);
|
int parsestat(pid_t pid, struct procstat *ps);
|
||||||
|
int parsestatus(pid_t pid, struct procstatus *pstatus);
|
||||||
int proceuid(pid_t pid, uid_t *euid);
|
int proceuid(pid_t pid, uid_t *euid);
|
||||||
int procuid(pid_t pid, uid_t *euid);
|
int procuid(pid_t pid, uid_t *euid);
|
||||||
int validps(const char *path);
|
int validps(const char *path);
|
||||||
|
|
13
ps.c
13
ps.c
|
@ -64,11 +64,12 @@ usage(void)
|
||||||
static void
|
static void
|
||||||
psout(struct procstat *ps)
|
psout(struct procstat *ps)
|
||||||
{
|
{
|
||||||
|
struct procstatus pstatus;
|
||||||
char cmdline[BUFSIZ], *cmd;
|
char cmdline[BUFSIZ], *cmd;
|
||||||
char stimestr[6];
|
char stimestr[6];
|
||||||
char *ttystr, *myttystr;
|
char *ttystr, *myttystr;
|
||||||
int tty_maj, tty_min;
|
int tty_maj, tty_min;
|
||||||
uid_t myeuid, peuid, puid;
|
uid_t myeuid;
|
||||||
unsigned sutime;
|
unsigned sutime;
|
||||||
time_t start;
|
time_t start;
|
||||||
struct sysinfo info;
|
struct sysinfo info;
|
||||||
|
@ -91,6 +92,8 @@ psout(struct procstat *ps)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parsestatus(ps->pid, &pstatus);
|
||||||
|
|
||||||
/* This is the default case, only print processes that have
|
/* This is the default case, only print processes that have
|
||||||
* the same controlling terminal as the invoker and the same
|
* the same controlling terminal as the invoker and the same
|
||||||
* euid as the current user */
|
* euid as the current user */
|
||||||
|
@ -107,9 +110,8 @@ psout(struct procstat *ps)
|
||||||
ttystr[0] = '?';
|
ttystr[0] = '?';
|
||||||
ttystr[1] = '\0';
|
ttystr[1] = '\0';
|
||||||
}
|
}
|
||||||
proceuid(ps->pid, &peuid);
|
|
||||||
myeuid = geteuid();
|
myeuid = geteuid();
|
||||||
if (myeuid != peuid) {
|
if (myeuid != pstatus.euid) {
|
||||||
free(ttystr);
|
free(ttystr);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -122,11 +124,10 @@ psout(struct procstat *ps)
|
||||||
sutime / 3600, (sutime % 3600) / 60, sutime % 60,
|
sutime / 3600, (sutime % 3600) / 60, sutime % 60,
|
||||||
ps->comm);
|
ps->comm);
|
||||||
} else {
|
} else {
|
||||||
procuid(ps->pid, &puid);
|
|
||||||
errno = 0;
|
errno = 0;
|
||||||
pw = getpwuid(puid);
|
pw = getpwuid(pstatus.uid);
|
||||||
if (errno || !pw)
|
if (errno || !pw)
|
||||||
eprintf("getpwuid %d:", puid);
|
eprintf("getpwuid %d:", pstatus.uid);
|
||||||
|
|
||||||
if (sysinfo(&info) < 0)
|
if (sysinfo(&info) < 0)
|
||||||
eprintf("sysinfo:");
|
eprintf("sysinfo:");
|
||||||
|
|
81
util/proc.c
81
util/proc.c
|
@ -10,55 +10,6 @@
|
||||||
#include "../proc.h"
|
#include "../proc.h"
|
||||||
#include "../util.h"
|
#include "../util.h"
|
||||||
|
|
||||||
/* TODO: Unify proc{euid,uid}() into parsestatus() */
|
|
||||||
int
|
|
||||||
proceuid(pid_t pid, uid_t *euid)
|
|
||||||
{
|
|
||||||
FILE *fp;
|
|
||||||
char buf[BUFSIZ], *p;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
uid_t procuid, proceuid;
|
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "/proc/%d/status", pid);
|
|
||||||
if (!(fp = fopen(path, "r")))
|
|
||||||
eprintf("%s fopen:", path);
|
|
||||||
while (fgets(buf, sizeof(buf), fp)) {
|
|
||||||
if (!strncmp(buf, "Uid:", 4)) {
|
|
||||||
p = buf + strlen("Uid:");
|
|
||||||
sscanf(p, "%u %u", &procuid, &proceuid);
|
|
||||||
*euid = proceuid;
|
|
||||||
fclose(fp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
procuid(pid_t pid, uid_t *uid)
|
|
||||||
{
|
|
||||||
FILE *fp;
|
|
||||||
char buf[BUFSIZ], *p;
|
|
||||||
char path[PATH_MAX];
|
|
||||||
uid_t procuid;
|
|
||||||
|
|
||||||
snprintf(path, sizeof(path), "/proc/%d/status", pid);
|
|
||||||
if (!(fp = fopen(path, "r")))
|
|
||||||
eprintf("%s fopen:", path);
|
|
||||||
while (fgets(buf, sizeof(buf), fp)) {
|
|
||||||
if (!strncmp(buf, "Uid:", 4)) {
|
|
||||||
p = buf + strlen("Uid:");
|
|
||||||
sscanf(p, "%u", &procuid);
|
|
||||||
*uid = procuid;
|
|
||||||
fclose(fp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(fp);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
parsecmdline(pid_t pid, char *buf, size_t siz)
|
parsecmdline(pid_t pid, char *buf, size_t siz)
|
||||||
{
|
{
|
||||||
|
@ -111,6 +62,38 @@ parsestat(pid_t pid, struct procstat *ps)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
parsestatus(pid_t pid, struct procstatus *pstatus)
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
char buf[BUFSIZ], *off;
|
||||||
|
int fd;
|
||||||
|
ssize_t n;
|
||||||
|
|
||||||
|
snprintf(path, sizeof(path), "/proc/%d/status", pid);
|
||||||
|
fd = open(path, O_RDONLY);
|
||||||
|
if (fd < 0)
|
||||||
|
eprintf("open %s:", path);
|
||||||
|
n = read(fd, buf, sizeof(buf) - 1);
|
||||||
|
if (n < 0)
|
||||||
|
eprintf("%s: read error:", path);
|
||||||
|
if (!n) {
|
||||||
|
close(fd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
buf[n] = '\0';
|
||||||
|
close(fd);
|
||||||
|
off = strstr(buf, "Uid:");
|
||||||
|
if (!off)
|
||||||
|
return -1;
|
||||||
|
sscanf(off, "Uid: %u %u", &pstatus->uid, &pstatus->euid);
|
||||||
|
off = strstr(buf, "Gid:");
|
||||||
|
if (!off)
|
||||||
|
return -1;
|
||||||
|
sscanf(off, "Gid: %u %u", &pstatus->gid, &pstatus->egid);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
validps(const char *path)
|
validps(const char *path)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue