Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7debf780 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller
Browse files

tools: bpf_dbg: various misc code cleanups



Lets clean up bpf_dbg a bit and improve its code slightly
in various areas: i) Get rid of some macros as there's no
good reason for keeping them, ii) remove one unused variable
and reduce scope of various variables found by cppcheck,
iii) Close non-default file descriptors when exiting the shell.

Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b17c7069
Loading
Loading
Loading
Loading
+55 −64
Original line number Diff line number Diff line
@@ -87,9 +87,6 @@
	__attribute__ ((format (printf, (pos_fmtstr), (pos_fmtargs))))
#endif

#define CMD(_name, _func) { .name = _name, .func = _func, }
#define OP(_op, _name)      [_op] = _name

enum {
	CMD_OK,
	CMD_ERR,
@@ -145,32 +142,32 @@ static size_t pcap_map_size = 0;
static char *pcap_ptr_va_start, *pcap_ptr_va_curr;

static const char * const op_table[] = {
	OP(BPF_ST, "st"),
	OP(BPF_STX, "stx"),
	OP(BPF_LD_B, "ldb"),
	OP(BPF_LD_H, "ldh"),
	OP(BPF_LD_W, "ld"),
	OP(BPF_LDX, "ldx"),
	OP(BPF_LDX_B, "ldxb"),
	OP(BPF_JMP_JA, "ja"),
	OP(BPF_JMP_JEQ, "jeq"),
	OP(BPF_JMP_JGT, "jgt"),
	OP(BPF_JMP_JGE, "jge"),
	OP(BPF_JMP_JSET, "jset"),
	OP(BPF_ALU_ADD, "add"),
	OP(BPF_ALU_SUB, "sub"),
	OP(BPF_ALU_MUL, "mul"),
	OP(BPF_ALU_DIV, "div"),
	OP(BPF_ALU_MOD, "mod"),
	OP(BPF_ALU_NEG, "neg"),
	OP(BPF_ALU_AND, "and"),
	OP(BPF_ALU_OR, "or"),
	OP(BPF_ALU_XOR, "xor"),
	OP(BPF_ALU_LSH, "lsh"),
	OP(BPF_ALU_RSH, "rsh"),
	OP(BPF_MISC_TAX, "tax"),
	OP(BPF_MISC_TXA, "txa"),
	OP(BPF_RET, "ret"),
	[BPF_ST]	= "st",
	[BPF_STX]	= "stx",
	[BPF_LD_B]	= "ldb",
	[BPF_LD_H]	= "ldh",
	[BPF_LD_W]	= "ld",
	[BPF_LDX]	= "ldx",
	[BPF_LDX_B]	= "ldxb",
	[BPF_JMP_JA]	= "ja",
	[BPF_JMP_JEQ]	= "jeq",
	[BPF_JMP_JGT]	= "jgt",
	[BPF_JMP_JGE]	= "jge",
	[BPF_JMP_JSET]	= "jset",
	[BPF_ALU_ADD]	= "add",
	[BPF_ALU_SUB]	= "sub",
	[BPF_ALU_MUL]	= "mul",
	[BPF_ALU_DIV]	= "div",
	[BPF_ALU_MOD]	= "mod",
	[BPF_ALU_NEG]	= "neg",
	[BPF_ALU_AND]	= "and",
	[BPF_ALU_OR]	= "or",
	[BPF_ALU_XOR]	= "xor",
	[BPF_ALU_LSH]	= "lsh",
	[BPF_ALU_RSH]	= "rsh",
	[BPF_MISC_TAX]	= "tax",
	[BPF_MISC_TXA]	= "txa",
	[BPF_RET]	= "ret",
};

static __check_format_printf(1, 2) int rl_printf(const char *fmt, ...)
@@ -1127,7 +1124,6 @@ static int cmd_step(char *num)
static int cmd_select(char *num)
{
	unsigned int which, i;
	struct pcap_pkthdr *hdr;
	bool have_next = true;

	if (!pcap_loaded() || strlen(num) == 0)
@@ -1144,7 +1140,7 @@ static int cmd_select(char *num)

	for (i = 0; i < which && (have_next = pcap_next_pkt()); i++)
		/* noop */;
	if (!have_next || (hdr = pcap_curr_pkt()) == NULL) {
	if (!have_next || pcap_curr_pkt() == NULL) {
		rl_printf("no packet #%u available!\n", which);
		pcap_reset_pkt();
		return CMD_ERR;
@@ -1177,9 +1173,8 @@ static int cmd_breakpoint(char *subcmd)
static int cmd_run(char *num)
{
	static uint32_t pass = 0, fail = 0;
	struct pcap_pkthdr *hdr;
	bool has_limit = true;
	int ret, pkts = 0, i = 0;
	int pkts = 0, i = 0;

	if (!bpf_prog_loaded() || !pcap_loaded())
		return CMD_ERR;
@@ -1189,8 +1184,8 @@ static int cmd_run(char *num)
		has_limit = false;

	do {
		hdr = pcap_curr_pkt();
		ret = bpf_run_all(bpf_image, bpf_prog_len,
		struct pcap_pkthdr *hdr = pcap_curr_pkt();
		int ret = bpf_run_all(bpf_image, bpf_prog_len,
				      (uint8_t *) hdr + sizeof(*hdr),
				      hdr->caplen, hdr->len);
		if (ret > 0)
@@ -1245,14 +1240,14 @@ static int cmd_quit(char *dontcare)
}

static const struct shell_cmd cmds[] = {
	CMD("load",		cmd_load),
	CMD("select",		cmd_select),
	CMD("step",		cmd_step),
	CMD("run",		cmd_run),
	CMD("breakpoint",	cmd_breakpoint),
	CMD("disassemble",	cmd_disassemble),
	CMD("dump",		cmd_dump),
	CMD("quit",		cmd_quit),
	{ .name = "load", .func = cmd_load },
	{ .name = "select", .func = cmd_select },
	{ .name = "step", .func = cmd_step },
	{ .name = "run", .func = cmd_run },
	{ .name = "breakpoint", .func = cmd_breakpoint },
	{ .name = "disassemble", .func = cmd_disassemble },
	{ .name = "dump", .func = cmd_dump },
	{ .name = "quit", .func = cmd_quit },
};

static int execf(char *arg)
@@ -1280,7 +1275,6 @@ out:
static char *shell_comp_gen(const char *buf, int state)
{
	static int list_index, len;
	const char *name;

	if (!state) {
		list_index = 0;
@@ -1288,9 +1282,9 @@ static char *shell_comp_gen(const char *buf, int state)
	}

	for (; list_index < array_size(cmds); ) {
		name = cmds[list_index].name;
		list_index++;
		const char *name = cmds[list_index].name;

		list_index++;
		if (strncmp(name, buf, len) == 0)
			return strdup(name);
	}
@@ -1322,16 +1316,9 @@ static void init_shell(FILE *fin, FILE *fout)
{
	char file[128];

	memset(file, 0, sizeof(file));
	snprintf(file, sizeof(file) - 1,
		 "%s/.bpf_dbg_history", getenv("HOME"));

	snprintf(file, sizeof(file), "%s/.bpf_dbg_history", getenv("HOME"));
	read_history(file);

	memset(file, 0, sizeof(file));
	snprintf(file, sizeof(file) - 1,
		 "%s/.bpf_dbg_init", getenv("HOME"));

	rl_instream = fin;
	rl_outstream = fout;

@@ -1348,37 +1335,41 @@ static void init_shell(FILE *fin, FILE *fout)
	rl_bind_key_in_map('\t', rl_complete, emacs_meta_keymap);
	rl_bind_key_in_map('\033', rl_complete, emacs_meta_keymap);

	snprintf(file, sizeof(file), "%s/.bpf_dbg_init", getenv("HOME"));
	rl_read_init_file(file);

	rl_prep_terminal(0);
	rl_set_signals();

	signal(SIGINT, intr_shell);
}

static void exit_shell(void)
static void exit_shell(FILE *fin, FILE *fout)
{
	char file[128];

	memset(file, 0, sizeof(file));
	snprintf(file, sizeof(file) - 1,
		 "%s/.bpf_dbg_history", getenv("HOME"));

	snprintf(file, sizeof(file), "%s/.bpf_dbg_history", getenv("HOME"));
	write_history(file);

	clear_history();
	rl_deprep_terminal();

	try_close_pcap();

	if (fin != stdin)
		fclose(fin);
	if (fout != stdout)
		fclose(fout);
}

static int run_shell_loop(FILE *fin, FILE *fout)
{
	char *buf;
	int ret;

	init_shell(fin, fout);

	while ((buf = readline("> ")) != NULL) {
		ret = execf(buf);
		int ret = execf(buf);
		if (ret == CMD_EX)
			break;
		if (ret == CMD_OK && strlen(buf) > 0)
@@ -1387,7 +1378,7 @@ static int run_shell_loop(FILE *fin, FILE *fout)
		free(buf);
	}

	exit_shell();
	exit_shell(fin, fout);
	return 0;
}