summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau2022-03-03 19:36:02 +0000
committerFelix Fietkau2022-03-05 14:21:18 +0000
commit3276aed81c7375cab59c5d2a06a0f2b3c1002e5a (patch)
treecde84637cd2692564f42545669ebc4cb1322c69e
parent74cfd71531446440b70639f2290f510a529deaa6 (diff)
downloadqosify-3276aed81c7375cab59c5d2a06a0f2b3c1002e5a.tar.gz
move run_cmd() to main.c
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--interface.c75
-rw-r--r--main.c60
-rw-r--r--qosify.h2
3 files changed, 70 insertions, 67 deletions
diff --git a/interface.c b/interface.c
index 4d53b00..b6e2895 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,6 @@
*/
#include <sys/types.h>
#include <sys/socket.h>
-#include <sys/wait.h>
#include <sys/ioctl.h>
#include <net/if_arp.h>
#include <net/if.h>
@@ -195,64 +194,6 @@ interface_ifb_name(struct qosify_iface *iface)
return ifname;
}
-static int run_cmd(char *cmd, bool ignore)
-{
- 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)
- 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;
-}
-
static int
prepare_tc_cmd(char *buf, int len, const char *type, const char *cmd,
const char *dev, const char *extra)
@@ -267,7 +208,7 @@ cmd_del_qdisc(const char *ifname, const char *type)
prepare_tc_cmd(buf, sizeof(buf), "qdisc", "del", ifname, type);
- return run_cmd(buf, true);
+ return qosify_run_cmd(buf, true);
}
static int
@@ -300,14 +241,14 @@ cmd_add_qdisc(struct qosify_iface *iface, const char *ifname, bool egress, bool
cfg->common_opts ? cfg->common_opts : "",
dir_opts ? dir_opts : "");
- run_cmd(buf, false);
+ qosify_run_cmd(buf, false);
ofs = prepare_tc_cmd(buf, sizeof(buf), "filter", "add", ifname, "parent 1: bpf");
APPEND(buf, ofs, " object-pinned /sys/fs/bpf/qosify_%sgress_%s verbose direct-action",
egress ? "e" : "in",
eth ? "eth" : "ip");
- return run_cmd(buf, false);
+ return qosify_run_cmd(buf, false);
}
static int
@@ -318,7 +259,7 @@ cmd_del_ingress(struct qosify_iface *iface)
cmd_del_qdisc(iface->ifname, "handle ffff: ingress");
snprintf(buf, sizeof(buf), "ip link del '%s'", interface_ifb_name(iface));
- return run_cmd(buf, true);
+ return qosify_run_cmd(buf, true);
}
@@ -332,20 +273,20 @@ cmd_add_ingress(struct qosify_iface *iface, bool eth)
cmd_del_ingress(iface);
ofs = prepare_tc_cmd(buf, sizeof(buf), "qdisc", "add", iface->ifname, " handle ffff: ingress");
- run_cmd(buf, false);
+ qosify_run_cmd(buf, false);
snprintf(buf, sizeof(buf), "ip link add '%s' type ifb", ifbdev);
- run_cmd(buf, false);
+ qosify_run_cmd(buf, false);
cmd_add_qdisc(iface, ifbdev, false, eth);
snprintf(buf, sizeof(buf), "ip link set dev '%s' up", ifbdev);
- run_cmd(buf, false);
+ qosify_run_cmd(buf, false);
ofs = prepare_tc_cmd(buf, sizeof(buf), "filter", "add", iface->ifname, " parent ffff:");
APPEND(buf, ofs, " protocol all prio 10 u32 match u32 0 0 "
"flowid 1:1 action mirred egress redirect dev '%s'", ifbdev);
- return run_cmd(buf, false);
+ return qosify_run_cmd(buf, false);
}
static void
diff --git a/main.c b/main.c
index e8ddda5..6e73c8f 100644
--- 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;
diff --git a/qosify.h b/qosify.h
index ae49761..791cd16 100644
--- a/qosify.h
+++ b/qosify.h
@@ -69,6 +69,8 @@ extern int qosify_active_timeout;
extern struct qosify_config config;
extern struct qosify_flow_config flow_config;
+int qosify_run_cmd(char *cmd, bool ignore_error);
+
int qosify_loader_init(void);
int qosify_map_init(void);