From 1d9a81b8c9f30f9f4abeb875998262f61bf10577 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Thu, 12 Nov 2020 23:24:38 +0100 Subject: [PATCH] Unify batch processing across tools The code for handling batches is largely the same across iproute2 tools. Extract a helper to handle the batch, and adjust the tools to dispatch to this helper. Sandwitch the invocation between prologue / epilogue code specific for each tool. Signed-off-by: Petr Machata Signed-off-by: David Ahern --- bridge/bridge.c | 38 +++++++------------------------------- devlink/devlink.c | 43 ++++++++----------------------------------- include/utils.h | 3 +++ ip/ip.c | 46 ++++++++++------------------------------------ lib/utils.c | 40 ++++++++++++++++++++++++++++++++++++++++ rdma/rdma.c | 40 ++++++++-------------------------------- tc/tc.c | 38 +++++++------------------------------- 7 files changed, 83 insertions(+), 165 deletions(-) diff --git a/bridge/bridge.c b/bridge/bridge.c index 453d6897..8f691cfd 100644 --- a/bridge/bridge.c +++ b/bridge/bridge.c @@ -77,20 +77,14 @@ static int do_cmd(const char *argv0, int argc, char **argv) return -1; } +static int br_batch_cmd(int argc, char *argv[], void *data) +{ + return do_cmd(argv[0], argc, argv); +} + static int batch(const char *name) { - char *line = NULL; - size_t len = 0; - int ret = EXIT_SUCCESS; - - if (name && strcmp(name, "-") != 0) { - if (freopen(name, "r", stdin) == NULL) { - fprintf(stderr, - "Cannot open file \"%s\" for reading: %s\n", - name, strerror(errno)); - return EXIT_FAILURE; - } - } + int ret; if (rtnl_open(&rth, 0) < 0) { fprintf(stderr, "Cannot open rtnetlink\n"); @@ -99,25 +93,7 @@ static int batch(const char *name) rtnl_set_strict_dump(&rth); - cmdlineno = 0; - while (getcmdline(&line, &len, stdin) != -1) { - char *largv[100]; - int largc; - - largc = makeargs(line, largv, 100); - if (largc == 0) - continue; /* blank line */ - - if (do_cmd(largv[0], largc, largv)) { - fprintf(stderr, "Command failed %s:%d\n", - name, cmdlineno); - ret = EXIT_FAILURE; - if (!force) - break; - } - } - if (line) - free(line); + ret = do_batch(name, force, br_batch_cmd, NULL); rtnl_close(&rth); return ret; diff --git a/devlink/devlink.c b/devlink/devlink.c index 1ff865bc..5bb00b3a 100644 --- a/devlink/devlink.c +++ b/devlink/devlink.c @@ -7912,43 +7912,16 @@ static void dl_free(struct dl *dl) free(dl); } +static int dl_batch_cmd(int argc, char *argv[], void *data) +{ + struct dl *dl = data; + + return dl_cmd(dl, argc, argv); +} + static int dl_batch(struct dl *dl, const char *name, bool force) { - char *line = NULL; - size_t len = 0; - int ret = EXIT_SUCCESS; - - if (name && strcmp(name, "-") != 0) { - if (freopen(name, "r", stdin) == NULL) { - fprintf(stderr, - "Cannot open file \"%s\" for reading: %s\n", - name, strerror(errno)); - return EXIT_FAILURE; - } - } - - cmdlineno = 0; - while (getcmdline(&line, &len, stdin) != -1) { - char *largv[100]; - int largc; - - largc = makeargs(line, largv, 100); - if (!largc) - continue; /* blank line */ - - if (dl_cmd(dl, largc, largv)) { - fprintf(stderr, "Command failed %s:%d\n", - name, cmdlineno); - ret = EXIT_FAILURE; - if (!force) - break; - } - } - - if (line) - free(line); - - return ret; + return do_batch(name, force, dl_batch_cmd, dl); } int main(int argc, char **argv) diff --git a/include/utils.h b/include/utils.h index 7041c461..085b17b1 100644 --- a/include/utils.h +++ b/include/utils.h @@ -322,4 +322,7 @@ int get_time64(__s64 *time, const char *str); char *sprint_time(__u32 time, char *buf); char *sprint_time64(__s64 time, char *buf); +int do_batch(const char *name, bool force, + int (*cmd)(int argc, char *argv[], void *user), void *user); + #endif /* __UTILS_H__ */ diff --git a/ip/ip.c b/ip/ip.c index ac445023..5e31957f 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -121,56 +121,30 @@ static int do_cmd(const char *argv0, int argc, char **argv) return EXIT_FAILURE; } +static int ip_batch_cmd(int argc, char *argv[], void *data) +{ + const int *orig_family = data; + + preferred_family = *orig_family; + return do_cmd(argv[0], argc, argv); +} + static int batch(const char *name) { - char *line = NULL; - size_t len = 0; - int ret = EXIT_SUCCESS; int orig_family = preferred_family; - - batch_mode = 1; - - if (name && strcmp(name, "-") != 0) { - if (freopen(name, "r", stdin) == NULL) { - fprintf(stderr, - "Cannot open file \"%s\" for reading: %s\n", - name, strerror(errno)); - return EXIT_FAILURE; - } - } + int ret; if (rtnl_open(&rth, 0) < 0) { fprintf(stderr, "Cannot open rtnetlink\n"); return EXIT_FAILURE; } - cmdlineno = 0; - while (getcmdline(&line, &len, stdin) != -1) { - char *largv[100]; - int largc; - - preferred_family = orig_family; - - largc = makeargs(line, largv, 100); - if (largc == 0) - continue; /* blank line */ - - if (do_cmd(largv[0], largc, largv)) { - fprintf(stderr, "Command failed %s:%d\n", - name, cmdlineno); - ret = EXIT_FAILURE; - if (!force) - break; - } - } - if (line) - free(line); + ret = do_batch(name, force, ip_batch_cmd, &orig_family); rtnl_close(&rth); return ret; } - int main(int argc, char **argv) { char *basename; diff --git a/lib/utils.c b/lib/utils.c index c98021d6..9815e328 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -1695,3 +1695,43 @@ char *sprint_time64(__s64 time, char *buf) print_time64(buf, SPRINT_BSIZE-1, time); return buf; } + +int do_batch(const char *name, bool force, + int (*cmd)(int argc, char *argv[], void *data), void *data) +{ + char *line = NULL; + size_t len = 0; + int ret = EXIT_SUCCESS; + + if (name && strcmp(name, "-") != 0) { + if (freopen(name, "r", stdin) == NULL) { + fprintf(stderr, + "Cannot open file \"%s\" for reading: %s\n", + name, strerror(errno)); + return EXIT_FAILURE; + } + } + + cmdlineno = 0; + while (getcmdline(&line, &len, stdin) != -1) { + char *largv[100]; + int largc; + + largc = makeargs(line, largv, 100); + if (!largc) + continue; /* blank line */ + + if (cmd(largc, largv, data)) { + fprintf(stderr, "Command failed %s:%d\n", + name, cmdlineno); + ret = EXIT_FAILURE; + if (!force) + break; + } + } + + if (line) + free(line); + + return ret; +} diff --git a/rdma/rdma.c b/rdma/rdma.c index 9ea2d17f..8dc2d3e3 100644 --- a/rdma/rdma.c +++ b/rdma/rdma.c @@ -41,40 +41,16 @@ static int rd_cmd(struct rd *rd, int argc, char **argv) return rd_exec_cmd(rd, cmds, "object"); } +static int rd_batch_cmd(int argc, char *argv[], void *data) +{ + struct rd *rd = data; + + return rd_cmd(rd, argc, argv); +} + static int rd_batch(struct rd *rd, const char *name, bool force) { - char *line = NULL; - size_t len = 0; - int ret = 0; - - if (name && strcmp(name, "-") != 0) { - if (!freopen(name, "r", stdin)) { - pr_err("Cannot open file \"%s\" for reading: %s\n", - name, strerror(errno)); - return errno; - } - } - - cmdlineno = 0; - while (getcmdline(&line, &len, stdin) != -1) { - char *largv[512]; - int largc; - - largc = makeargs(line, largv, ARRAY_SIZE(largv)); - if (!largc) - continue; /* blank line */ - - ret = rd_cmd(rd, largc, largv); - if (ret) { - pr_err("Command failed %s:%d\n", name, cmdlineno); - if (!force) - break; - } - } - - free(line); - - return ret; + return do_batch(name, force, rd_batch_cmd, rd); } static int rd_init(struct rd *rd, char *filename) diff --git a/tc/tc.c b/tc/tc.c index bdd5d4fa..af9b21da 100644 --- a/tc/tc.c +++ b/tc/tc.c @@ -233,22 +233,16 @@ static int do_cmd(int argc, char **argv) return -1; } +static int tc_batch_cmd(int argc, char *argv[], void *data) +{ + return do_cmd(argc, argv); +} + static int batch(const char *name) { - char *line = NULL; - size_t len = 0; - int ret = 0; + int ret; batch_mode = 1; - if (name && strcmp(name, "-") != 0) { - if (freopen(name, "r", stdin) == NULL) { - fprintf(stderr, - "Cannot open file \"%s\" for reading: %s\n", - name, strerror(errno)); - return -1; - } - } - tc_core_init(); if (rtnl_open(&rth, 0) < 0) { @@ -256,26 +250,8 @@ static int batch(const char *name) return -1; } - cmdlineno = 0; - while (getcmdline(&line, &len, stdin) != -1) { - char *largv[100]; - int largc; + ret = do_batch(name, force, tc_batch_cmd, NULL); - largc = makeargs(line, largv, 100); - if (largc == 0) - continue; /* blank line */ - - if (do_cmd(largc, largv)) { - fprintf(stderr, "Command failed %s:%d\n", - name, cmdlineno); - ret = 1; - if (!force) - break; - } - fflush(stdout); - } - - free(line); rtnl_close(&rth); return ret; }