Handle batch mode better.
Add comments midline and -force option.
(Logical change 1.173)
diff --git a/ChangeLog b/ChangeLog
index 53bd530..67e6793 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2005-03-18 Stephen Hemminger <shemminger@osdl.org>
+
+ * add -force option to batch mode
+ * handle midline comments in batch mode
+ * sum per cpu fields in lnstat correctly
+
2005-03-14 Stephen Hemminger <shemminger@osdl.org>
* cleanup batch mode, allow continuation, comments etc.
diff --git a/tc/tc.c b/tc/tc.c
index dd6ac97..1fcd44a 100644
--- a/tc/tc.c
+++ b/tc/tc.c
@@ -35,6 +35,7 @@
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) */
@@ -207,6 +208,7 @@
return -1;
}
+/* split command line into argument vector */
static int makeargs(char *line, char *argv[], int maxargs)
{
static const char ws[] = " \t\r\n";
@@ -225,14 +227,55 @@
return argc;
}
+static int lineno;
+/* Like glibc getline but handle continuation lines and comments */
+static size_t getcmdline(char **linep, size_t *lenp, FILE *in)
+{
+ size_t cc;
+ char *cp;
+
+ if ( (cc = getline(linep, lenp, in)) < 0)
+ return cc; /* eof or error */
+ ++lineno;
+
+ cp = strchr(*linep, '#');
+ if (cp)
+ *cp = '\0';
+
+ while ((cp = strstr(*linep, "\\\n")) != NULL) {
+ char *line1 = NULL;
+ ssize_t len1 = 0;
+ size_t cc1;
+
+ if ((cc1 = getline(&line1, &len1, in)) < 0) {
+ fprintf(stderr, "Missing continuation line\n");
+ return cc1;
+ }
+
+ ++lineno;
+ *cp = 0;
+
+ cp = strchr(line1, '#');
+ if (cp)
+ *cp = '\0';
+
+ *linep = realloc(*linep, strlen(*linep) + strlen(line1) + 1);
+ if (!*linep) {
+ fprintf(stderr, "Out of memory\n");
+ return -1;
+ }
+ cc += cc1 - 2;
+ strcat(*linep, line1);
+ free(line1);
+ }
+ return cc;
+}
+
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 (freopen(name, "r", stdin) == NULL) {
@@ -249,42 +292,20 @@
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);
- }
+ lineno = 0;
+ while (getcmdline(&line, &len, stdin) != -1) {
+ char *largv[100];
+ int largc;
largc = makeargs(line, largv, 100);
+ if (largc == 0)
+ continue; /* blank line */
- ret = do_cmd(largc, largv);
- if (ret) {
+ if (do_cmd(largc, largv)) {
fprintf(stderr, "Command failed %s:%d\n", name, lineno);
- break;
+ ret = 1;
+ if (!force)
+ break;
}
}
@@ -296,6 +317,7 @@
int main(int argc, char **argv)
{
int ret;
+ char *batchfile = NULL;
while (argc > 1) {
if (argv[1][0] != '-')
@@ -315,13 +337,15 @@
} 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]);
+ batchfile = argv[2];
+ argc--; argv++;
} else {
fprintf(stderr, "Option \"%s\" is unknown, try \"tc -help\".\n", argv[1]);
return -1;
@@ -329,6 +353,9 @@
argc--; argv++;
}
+ if (batchfile)
+ return batch(batchfile);
+
if (argc <= 1) {
usage();
return 0;