This commit was generated by cvs2svn to compensate for changes in r2587,
[iproute2.git] / tc / tc.c
diff --git a/tc/tc.c b/tc/tc.c
index dd6ac97..fa36ee0 100644 (file)
--- 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;