Commit 65d538dd authored by Quentin Monnet's avatar Quentin Monnet Committed by Daniel Borkmann

tools: bpftool: support continuation lines in batch files

Add support for continuation lines, such as in the following example:

    prog show
    prog dump xlated \
        id 1337 opcodes

This patch is based after the code for support for continuation lines
from file lib/utils.c from package iproute2.

"Lines" in error messages are renamed as "commands", as we count the
number of commands (but we ignore empty lines, comments, and do not add
continuation lines to the count).
Signed-off-by: default avatarQuentin Monnet <quentin.monnet@netronome.com>
Acked-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parent 06cc7fe7
...@@ -46,6 +46,9 @@ ...@@ -46,6 +46,9 @@
#include "main.h" #include "main.h"
#define BATCH_LINE_LEN_MAX 65536
#define BATCH_ARG_NB_MAX 4096
const char *bin_name; const char *bin_name;
static int last_argc; static int last_argc;
static char **last_argv; static char **last_argv;
...@@ -171,9 +174,9 @@ static const struct cmd cmds[] = { ...@@ -171,9 +174,9 @@ static const struct cmd cmds[] = {
static int do_batch(int argc, char **argv) static int do_batch(int argc, char **argv)
{ {
char buf[BATCH_LINE_LEN_MAX], contline[BATCH_LINE_LEN_MAX];
char *n_argv[BATCH_ARG_NB_MAX];
unsigned int lines = 0; unsigned int lines = 0;
char *n_argv[4096];
char buf[65536];
int n_argc; int n_argc;
FILE *fp; FILE *fp;
char *cp; char *cp;
...@@ -210,13 +213,38 @@ static int do_batch(int argc, char **argv) ...@@ -210,13 +213,38 @@ static int do_batch(int argc, char **argv)
break; break;
} }
/* Append continuation lines if any (coming after a line ending
* with '\' in the batch file).
*/
while ((cp = strstr(buf, "\\\n")) != NULL) {
if (!fgets(contline, sizeof(contline), fp) ||
strlen(contline) == 0) {
p_err("missing continuation line on command %d",
lines);
err = -1;
goto err_close;
}
cp = strchr(contline, '#');
if (cp)
*cp = '\0';
if (strlen(buf) + strlen(contline) + 1 > sizeof(buf)) {
p_err("command %d is too long", lines);
err = -1;
goto err_close;
}
buf[strlen(buf) - 2] = '\0';
strcat(buf, contline);
}
n_argc = 0; n_argc = 0;
n_argv[n_argc] = strtok(buf, " \t\n"); n_argv[n_argc] = strtok(buf, " \t\n");
while (n_argv[n_argc]) { while (n_argv[n_argc]) {
n_argc++; n_argc++;
if (n_argc == ARRAY_SIZE(n_argv)) { if (n_argc == ARRAY_SIZE(n_argv)) {
p_err("line %d has too many arguments, skip", p_err("command %d has too many arguments, skip",
lines); lines);
n_argc = 0; n_argc = 0;
break; break;
...@@ -252,7 +280,7 @@ static int do_batch(int argc, char **argv) ...@@ -252,7 +280,7 @@ static int do_batch(int argc, char **argv)
p_err("reading batch file failed: %s", strerror(errno)); p_err("reading batch file failed: %s", strerror(errno));
err = -1; err = -1;
} else { } else {
p_info("processed %d lines", lines); p_info("processed %d commands", lines);
err = 0; err = 0;
} }
err_close: err_close:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment