X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tc%2Ftc.c;fp=tc%2Ftc.c;h=fa36ee076d8c735d49c4a4a1a1c00a5528a6dea7;hb=b4a5a91c5a4ca186690479ddc0fff26644c98c93;hp=dd6ac973e09a3ccef2e95afc0c79d991873e8d1e;hpb=143d7e99faac73b7f2947e37df31a75738eeadde;p=iproute2.git diff --git a/tc/tc.c b/tc/tc.c index dd6ac97..fa36ee0 100644 --- a/tc/tc.c +++ b/tc/tc.c @@ -35,9 +35,10 @@ int show_details = 0; 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; @@ -179,8 +180,9 @@ noexist: 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) @@ -207,34 +209,13 @@ 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)); @@ -249,44 +230,24 @@ static int batch(const char *name) 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; @@ -296,6 +257,8 @@ static int batch(const char *name) int main(int argc, char **argv) { int ret; + int do_batching = 0; + char *batchfile = NULL; while (argc > 1) { if (argv[1][0] != '-') @@ -315,13 +278,13 @@ int main(int argc, char **argv) } 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; @@ -329,6 +292,9 @@ int main(int argc, char **argv) argc--; argv++; } + if (do_batching) + return batch(batchfile); + if (argc <= 1) { usage(); return 0;