added daemonization, output possibility to console (for other programs) and moved...
authorAaron Marcher <info@nulltime.net>
Fri, 16 Sep 2016 21:31:24 +0000 (23:31 +0200)
committerAaron Marcher (drkhsh) <info@nulltime.net>
Fri, 16 Sep 2016 21:31:24 +0000 (23:31 +0200)
arg.h [new file with mode: 0644]
slstatus.c

diff --git a/arg.h b/arg.h
new file mode 100644 (file)
index 0000000..2b189fe
--- /dev/null
+++ b/arg.h
@@ -0,0 +1,55 @@
+/*
+ * Copy me if you can.
+ * by 20h
+ */
+
+#ifndef __ARG_H__
+#define __ARG_H__
+
+extern char *argv0;
+
+#define USED(x)                ((void)(x))
+
+/* use main(int argc, char *argv[]) */
+#define ARGBEGIN       for (argv0 = *argv, argv++, argc--;\
+                                       argv[0] && argv[0][1]\
+                                       && argv[0][0] == '-';\
+                                       argc--, argv++) {\
+                               char _argc;\
+                               char **_argv;\
+                               int brk;\
+                               if (argv[0][1] == '-' && argv[0][2] == '\0') {\
+                                       argv++;\
+                                       argc--;\
+                                       break;\
+                               }\
+                               for (brk = 0, argv[0]++, _argv = argv;\
+                                               argv[0][0] && !brk;\
+                                               argv[0]++) {\
+                                       if (_argv != argv)\
+                                               break;\
+                                       _argc = argv[0][0];\
+                                       switch (_argc)
+
+#define ARGEND                 }\
+                               USED(_argc);\
+                       }\
+                       USED(argv);\
+                       USED(argc);
+
+#define ARGC()         _argc
+
+#define EARGF(x)       ((argv[0][1] == '\0' && argv[1] == NULL)?\
+                               ((x), abort(), (char *)0) :\
+                               (brk = 1, (argv[0][1] != '\0')?\
+                                       (&argv[0][1]) :\
+                                       (argc--, argv++, argv[0])))
+
+#define ARGF()         ((argv[0][1] == '\0' && argv[1] == NULL)?\
+                               (char *)0 :\
+                               (brk = 1, (argv[0][1] != '\0')?\
+                                       (&argv[0][1]) :\
+                                       (argc--, argv++, argv[0])))
+
+#endif
+
index 7dee542ff9a48cff5fbce3c35141a721b2a18d62..be124f3e889914dca31afd604734aa4ec2c37175 100644 (file)
@@ -26,6 +26,7 @@
 #undef strlcat
 #undef strlcpy
 
+#include "arg.h"
 #include "strlcat.h"
 #include "strlcpy.h"
 #include "concat.h"
@@ -64,9 +65,12 @@ static char *username(void);
 static char *vol_perc(const char *);
 static char *wifi_perc(const char *);
 static char *wifi_essid(const char *);
+static void set_status(const char *);
 static void sighandler(const int);
+static void usage(void);
 
-static unsigned short int delay, done;
+char *argv0;
+static unsigned short int delay, done, dflag, oflag;
 static Display *dpy;
 
 #include "config.h"
@@ -579,6 +583,13 @@ wifi_essid(const char *wificard)
                return smprintf("%s", (char *)wreq.u.essid.pointer);
 }
 
+static void
+set_status(const char *str)
+{
+       XStoreName(dpy, DefaultRootWindow(dpy), str);
+       XSync(dpy, False);
+}
+
 static void
 sighandler(const int signo)
 {
@@ -586,8 +597,20 @@ sighandler(const int signo)
                done = 1;
 }
 
+static void
+usage(void)
+{
+       fprintf(stderr,
+               "slstatus (c) 2016, drkhsh\n"
+               "usage: %s [-dho]\n",
+               argv0);
+       exit(1);
+}
+
+
+
 int
-main(void)
+main(int argc, char *argv[])
 {
        unsigned short int i;
        char status_string[4096];
@@ -595,6 +618,22 @@ main(void)
        struct arg argument;
        struct sigaction act;
 
+       ARGBEGIN {
+               case 'd':
+                       dflag = 1;
+                       break;
+               case 'o':
+                       oflag = 1;
+                       break;
+               default:
+                       usage();
+       } ARGEND
+
+       if (dflag && oflag)
+               usage();
+       if (dflag)
+               (void)daemon(1, 1);
+
        memset(&act, 0, sizeof(act));
        act.sa_handler = sighandler;
        sigaction(SIGINT,  &act, 0);
@@ -604,6 +643,7 @@ main(void)
 
        while (!done) {
                status_string[0] = '\0';
+
                for (i = 0; i < sizeof(args) / sizeof(args[0]); ++i) {
                        argument = args[i];
                        if (argument.args == NULL)
@@ -619,8 +659,12 @@ main(void)
                        free(res);
                        free(element);
                }
-               XStoreName(dpy, DefaultRootWindow(dpy), status_string);
-               XSync(dpy, False);
+
+               if (!oflag)
+                       set_status(status_string);
+               else
+                       printf("%s\n", status_string);
+
                /*
                 * subtract delay time spend in function
                 * calls from the actual global delay time
@@ -629,8 +673,8 @@ main(void)
                delay = 0;
        }
 
-       XStoreName(dpy, DefaultRootWindow(dpy), NULL);
-       XSync(dpy, False);
+       if (!oflag)
+               set_status(NULL);
 
        XCloseDisplay(dpy);