+ struct sigaction act;
+
+ ARGBEGIN {
+ case 'd':
+ dflag = 1;
+ break;
+ case 'o':
+ oflag = 1;
+ break;
+ case 'v':
+ printf("slstatus %s (C) 2016 slstatus engineers\n", VERSION);
+ return 0;
+ default:
+ usage();
+ } ARGEND
+
+ if (dflag && oflag) {
+ usage();
+ }
+ if (dflag && daemon(1, 1) < 0) {
+ err(1, "daemon");
+ }
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = sighandler;
+ sigaction(SIGINT, &act, 0);
+ sigaction(SIGTERM, &act, 0);
+
+ if (!oflag) {
+ dpy = XOpenDisplay(NULL);
+ }
+
+ setlocale(LC_ALL, "");
+
+ while (!done) {
+ status_string[0] = '\0';
+
+ for (i = 0; i < sizeof(args) / sizeof(args[0]); ++i) {
+ argument = args[i];
+ if (argument.args == NULL) {
+ res = argument.func();
+ } else {
+ res = argument.func(argument.args);
+ }
+ element = smprintf(argument.fmt, res);
+ if (element == NULL) {
+ element = smprintf(UNKNOWN_STR);
+ warnx("Failed to format output");
+ }
+ strlcat(status_string, element, sizeof(status_string));
+ free(res);
+ free(element);
+ }