qosify: add support for keeping stats
[project/qosify.git] / main.c
diff --git a/main.c b/main.c
index e8ddda58005f8535c449c651592a1d1979631cec..56b4a3039329a0609575fc21cea43ca20d5c5646 100644 (file)
--- a/main.c
+++ b/main.c
@@ -2,6 +2,7 @@
 /*
  * Copyright (C) 2021 Felix Fietkau <nbd@nbd.name>
  */
+#include <sys/wait.h>
 #include <stdio.h>
 #include <unistd.h>
 #include <stdint.h>
@@ -21,6 +22,65 @@ static int usage(const char *progname)
        return 1;
 }
 
+int qosify_run_cmd(char *cmd, bool ignore_error)
+{
+       char *argv[] = { "sh", "-c", cmd, NULL };
+       bool first = true;
+       int status = -1;
+       char buf[512];
+       int fds[2];
+       FILE *f;
+       int pid;
+
+       if (pipe(fds))
+               return -1;
+
+       pid = fork();
+       if (!pid) {
+               close(fds[0]);
+               if (fds[1] != STDOUT_FILENO)
+                       dup2(fds[1], STDOUT_FILENO);
+               if (fds[1] != STDERR_FILENO)
+                       dup2(fds[1], STDERR_FILENO);
+               if (fds[1] > STDERR_FILENO)
+                       close(fds[1]);
+               execv("/bin/sh", argv);
+               exit(1);
+       }
+
+       if (pid < 0)
+               return -1;
+
+       close(fds[1]);
+       f = fdopen(fds[0], "r");
+       if (!f) {
+               close(fds[0]);
+               goto out;
+       }
+
+       while (fgets(buf, sizeof(buf), f) != NULL) {
+               if (!strlen(buf))
+                       break;
+               if (ignore_error)
+                       continue;
+               if (first) {
+                       ULOG_WARN("Command: %s\n", cmd);
+                       first = false;
+               }
+               ULOG_WARN("%s%s", buf, strchr(buf, '\n') ? "" : "\n");
+       }
+
+       fclose(f);
+
+out:
+       while (waitpid(pid, &status, 0) < 0)
+               if (errno != EINTR)
+                       break;
+
+       return status;
+}
+
+
 int main(int argc, char **argv)
 {
        const char *load_file = NULL;
@@ -61,6 +121,8 @@ int main(int argc, char **argv)
            qosify_iface_init())
                return 2;
 
+       qosify_dns_init();
+
        uloop_run();
 
        qosify_ubus_stop();