summaryrefslogtreecommitdiff
path: root/src/cmd/ps/ps.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/ps/ps.c')
-rw-r--r--src/cmd/ps/ps.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/cmd/ps/ps.c b/src/cmd/ps/ps.c
new file mode 100644
index 0000000..76a5841
--- /dev/null
+++ b/src/cmd/ps/ps.c
@@ -0,0 +1,54 @@
+#include <_proc.h>
+#include <ctype.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main(void)
+{
+ char *readbuf = malloc(4096);
+ char *procbuf = malloc(4096);
+ FILE *f = fopen("/proc/", "r");
+ if (!f) {
+ err(1, "couldn't open /proc/");
+ }
+
+ // TODO library for iterating over directories
+ for (;;) {
+ int len = fread(readbuf, 1, 4096, f);
+ if (len <= 0) break;
+ for (int pos = 0; pos < len; ) {
+ char *end = memchr(readbuf + pos, 0, len - pos);
+ if (!end) {
+ errx(1, "unimplemented: buffer overflow");
+ }
+ size_t entryl = end - (readbuf+pos) + 1;
+ if (isdigit(readbuf[pos])) {
+ FILE *g;
+ sprintf(procbuf, "/proc/%smem", readbuf+pos);
+ g = fopen(procbuf, "r");
+ if (!g) {
+ warn("couldn't open \"%s\"", procbuf);
+ strcpy(procbuf, "(can't peek)");
+ } else {
+ fseek(g, (long)&_psdata_loc->desc, SEEK_SET);
+ if (fread(procbuf, 1, 128, g) <= 0) {
+ strcpy(procbuf, "(no psdata)");
+ }
+ procbuf[128] = '\0';
+ fclose(g);
+ }
+ end[-1] = '\0'; /* remove trailing slash */
+ printf("%s\t%s\n", readbuf+pos, procbuf);
+ }
+ pos += entryl;
+ }
+ }
+
+ free(readbuf);
+ free(procbuf);
+ fclose(f);
+ return 0;
+}