summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-15 11:57:33 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-15 11:57:33 -0400
commit766d492d1ee9381ee0c266e0ce230f9b85d64891 (patch)
tree39096d92fbc597535fb123125c550592e0c71d03
outline
-rw-r--r--who.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/who.c b/who.c
new file mode 100644
index 0000000..fc913f2
--- /dev/null
+++ b/who.c
@@ -0,0 +1,112 @@
+#define _XOPEN_SOURCE
+#include <locale.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+enum {
+ BOOT = 1<<0,
+ DEAD = 1<<1,
+ HEADER = 1<<2,
+ LOGIN = 1<<3,
+ SELF = 1<<4,
+ INIT = 1<<5,
+ QUICK = 1<<6,
+ RUNLEVEL= 1<<7,
+ TIME = 1<<8,
+ TERMINAL= 1<<9,
+ IDLE = 1<<10,
+};
+
+int main(int argc, char *argv[])
+{
+ int flags = 0;
+
+ setlocale(LC_ALL, "");
+
+ int c;
+ while ((c = getopt(argc, argv, "abdHlmpqrstTu")) != -1) {
+ switch (c) {
+ case 'a':
+ /* -bdlprtTu */
+ flags |= BOOT;
+ flags |= DEAD;
+ flags |= LOGIN;
+ flags |= INIT;
+ flags |= RUNLEVEL;
+ flags |= TIME;
+ flags |= TERMINAL;
+ flags |= IDLE;
+ break;
+
+ case 'b':
+ flags |= BOOT;
+ break;
+
+ case 'd':
+ flags |= DEAD;
+ break;
+
+ case 'H':
+ flags |= HEADER;
+ break;
+
+ case 'l':
+ flags |= LOGIN;
+ break;
+
+ case 'm':
+ flags |= SELF;
+ break;
+
+ case 'p':
+ flags |= INIT;
+ break;
+
+ case 'q':
+ flags |= QUICK;
+ break;
+
+ case 'r':
+ flags |= RUNLEVEL;
+ break;
+
+ case 's':
+ /* default */
+ break;
+
+ case 't':
+ flags |= TIME;
+ break;
+
+ case 'T':
+ flags |= TERMINAL;
+ break;
+
+ case 'u':
+ flags |= IDLE;
+ break;
+
+ default:
+ return 1;
+ }
+ }
+
+ if (flags & QUICK) {
+ flags = QUICK;
+ }
+
+ if (flags == 0 && argc == optind + 2) {
+ if (strcmp("am", argv[optind]))
+ return 1;
+
+ if (strcmp("I", argv[optind+1]) && strcmp("i", argv[optind+1])) {
+ return 1;
+ }
+
+ printf("ok\n");
+ flags = SELF;
+ }
+
+ return 0;
+}