+/* SPDX-License-Identifier: GPL-2.0 */
/*
* Get/set/delete bridge with netlink
*
#include <string.h>
#include <errno.h>
-#include "SNAPSHOT.h"
+#include "version.h"
#include "utils.h"
#include "br_common.h"
#include "namespace.h"
+#include "color.h"
struct rtnl_handle rth = { .fd = -1 };
int preferred_family = AF_UNSPEC;
int oneline;
int show_stats;
int show_details;
+static int color;
int compress_vlans;
-int json_output;
+int json;
int timestamp;
-char *batch_file;
+static const char *batch_file;
int force;
-const char *_SL_;
static void usage(void) __attribute__((noreturn));
"where OBJECT := { link | fdb | mdb | vlan | monitor }\n"
" OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] |\n"
" -o[neline] | -t[imestamp] | -n[etns] name |\n"
-" -c[ompressvlans] -j{son} }\n");
+" -c[ompressvlans] -color -p[retty] -j[son] }\n");
exit(-1);
}
return -1;
}
-static int batch(const char *name)
+static int br_batch_cmd(int argc, char *argv[], void *data)
{
- char *line = NULL;
- size_t len = 0;
- int ret = EXIT_SUCCESS;
+ return do_cmd(argv[0], argc, argv);
+}
- 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;
- }
- }
+static int batch(const char *name)
+{
+ 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;
-
- 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);
+ rtnl_set_strict_dump(&rth);
+
+ ret = do_batch(name, force, br_batch_cmd, NULL);
rtnl_close(&rth);
return ret;
if (matches(opt, "-help") == 0) {
usage();
} else if (matches(opt, "-Version") == 0) {
- printf("bridge utility, 0.0\n");
+ printf("bridge utility, %s\n", version);
exit(0);
} else if (matches(opt, "-stats") == 0 ||
matches(opt, "-statistics") == 0) {
exit(-1);
} else if (matches(opt, "-compressvlans") == 0) {
++compress_vlans;
+ } else if (matches_color(opt, &color)) {
} else if (matches(opt, "-force") == 0) {
++force;
} else if (matches(opt, "-json") == 0) {
- ++json_output;
+ ++json;
+ } else if (matches(opt, "-pretty") == 0) {
+ ++pretty;
} else if (matches(opt, "-batch") == 0) {
argc--;
argv++;
_SL_ = oneline ? "\\" : "\n";
+ check_enable_color(color, json);
+
if (batch_file)
return batch(batch_file);
if (rtnl_open(&rth, 0) < 0)
exit(1);
+ rtnl_set_strict_dump(&rth);
+
if (argc > 1)
return do_cmd(argv[1], argc-1, argv+1);