int show_raw = 0;
int resolve_hosts = 0;
int use_iec = 0;
+int force = 0;
struct rtnl_handle rth;
-static void *BODY; /* cached handle dlopen(NULL) */
+static void *BODY = NULL; /* cached handle dlopen(NULL) */
static struct qdisc_util * qdisc_list;
static struct filter_util * filter_list;
static void usage(void)
{
fprintf(stderr, "Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }\n"
+ " tc [-force] -batch file\n"
"where OBJECT := { qdisc | class | filter | action }\n"
- " OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -b[atch] file }\n");
+ " OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -b[atch] [file] }\n");
}
static int do_cmd(int argc, char **argv)
return -1;
}
-static int makeargs(char *line, char *argv[], int maxargs)
-{
- static const char ws[] = " \t\r\n";
- char *cp;
- int argc = 0;
-
- for (cp = strtok(line, ws); cp; cp = strtok(NULL, ws)) {
- if (argc >= maxargs) {
- fprintf(stderr, "Too many arguments to command\n");
- exit(1);
- }
- argv[argc++] = cp;
- }
- argv[argc] = NULL;
-
- return argc;
-}
-
static int batch(const char *name)
{
char *line = NULL;
size_t len = 0;
- ssize_t cc;
- int lineno = 0;
- char *largv[100];
- int largc, ret = 0;
+ int ret = 0;
- if (strcmp(name, "-") != 0) {
+ 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;
}
- while ((cc = getline(&line, &len, stdin)) != -1) {
- ++lineno;
-
- /* ignore blank lines and comments */
- if (*line == '\n' || *line == '#')
- continue;
-
- /* handle continuation lines */
- while (cc >= 2 && strcmp(line+cc-2, "\\\n") == 0) {
- char *line1 = NULL;
- ssize_t len1 = 0;
- int cc1;
- cc1 = getline(&line1, &len1, stdin);
-
- if (cc1 < 0) {
- fprintf(stderr, "Missing continuation line\n");
- return -1;
- }
- ++lineno;
- line = realloc(line, cc + cc1);
- if (!line) {
- fprintf(stderr, "Out of memory\n");
- return -1;
- }
-
- strcpy(line+cc-2, line1);
- cc += cc1 - 2;
- free(line1);
- }
+ cmdlineno = 0;
+ while (getcmdline(&line, &len, stdin) != -1) {
+ char *largv[100];
+ int largc;
largc = makeargs(line, largv, 100);
-
- ret = do_cmd(largc, largv);
- if (ret) {
- fprintf(stderr, "Command failed %s:%d\n", name, lineno);
- break;
+ 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;
}
}
+ if (line)
+ free(line);
rtnl_close(&rth);
return ret;
int main(int argc, char **argv)
{
int ret;
+ int do_batching = 0;
+ char *batchfile = NULL;
while (argc > 1) {
if (argv[1][0] != '-')
} else if (matches(argv[1], "-help") == 0) {
usage();
return 0;
+ } else if (matches(argv[1], "-force") == 0) {
+ ++force;
} else if (matches(argv[1], "-batch") == 0) {
- if (argc < 3) {
- fprintf(stderr, "Wrong number of arguments in batch mode\n");
- return -1;
- }
-
- return batch(argv[2]);
+ do_batching = 1;
+ if (argc > 2)
+ batchfile = argv[2];
+ argc--; argv++;
} else {
fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", argv[1]);
return -1;
argc--; argv++;
}
+ if (do_batching)
+ return batch(batchfile);
+
if (argc <= 1) {
usage();
return 0;