On Tue, Jan 02, 2018 at 11:28:03PM +0900, Chris Mi wrote:
@@ -240,23 +244,49 @@ static int batch(const char *name)
}
cmdlineno = 0;
- while (getcmdline(&line, &len, stdin) != -1) {
+ if (getcmdline(&line, &len, stdin) == -1)
+ goto Exit;
+ do {
char *largv[100];
int largc;
+ if (getcmdline(&line2, &len, stdin) == -1)
+ lastline = true;
+
largc = makeargs(line, largv, 100);
if (largc == 0)
continue; /* blank line */
If it reads a new line, it won't process anything else after it
because line won't get updated.
Indeed. Thanks for catching it. After fixing it, I find that it only
works if the blank line is
in the beginning or middle. If the blank line is in the end, we may lose
at most batchsize - 1 rules.
It is not easy to fix it. I think this issue is trivial. It is not worth
to make the code complex to fix it.
So I describe this limitation in the man page.
-Chris
Marcelo
- if (do_cmd(largc, largv)) {
- fprintf(stderr, "Command failed %s:%d\n", name,
cmdlineno);
+ line = line2;
+ line2 = NULL;
+ len = 0;
+
+ /*
+ * In batch mode, if we haven't accumulated enough commands
+ * and this is not the last command, don't send the message
+ * immediately.
+ */
+ if (batch_size > 1 && msg_iov_index + 1 != batch_size
+ && !lastline)
+ send = false;
+ else
+ send = true;
+
+ ret = do_cmd(largc, largv, batch_size, msg_iov_index++, send);
+ if (ret < 0) {
+ fprintf(stderr, "Command failed %s:%d\n", name,
+ cmdlineno);
ret = 1;
if (!force)
break;
}
- }
- if (line)
- free(line);
+ msg_iov_index %= batch_size;
+ } while (!lastline);
+
+ free_filter_reqs();
+ free_action_reqs();
+Exit:
+ free(line);
rtnl_close(&rth);
return ret;