diff mbox series

[nft,4/5] src: add obj_spec

Message ID 20180503110012.11277-4-pablo@netfilter.org
State Accepted
Delegated to: Pablo Neira
Headers show
Series [nft,1/5] src: add table_spec | expand

Commit Message

Pablo Neira Ayuso May 3, 2018, 11 a.m. UTC
Store location object in handle to improve error reporting.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
---
 include/rule.h     |  7 ++++++-
 src/evaluate.c     |  4 ++--
 src/netlink.c      |  8 ++++----
 src/parser_bison.y |  6 ++++--
 src/rule.c         | 18 +++++++++---------
 5 files changed, 25 insertions(+), 18 deletions(-)
diff mbox series

Patch

diff --git a/include/rule.h b/include/rule.h
index 68d32f10c353..b265690d3c96 100644
--- a/include/rule.h
+++ b/include/rule.h
@@ -42,6 +42,11 @@  struct set_spec {
 	const char		*name;
 };
 
+struct obj_spec {
+	struct location		location;
+	const char		*name;
+};
+
 /**
  * struct handle - handle for tables, chains, rules and sets
  *
@@ -60,7 +65,7 @@  struct handle {
 	struct table_spec	table;
 	struct chain_spec	chain;
 	struct set_spec		set;
-	const char		*obj;
+	struct obj_spec		obj;
 	const char		*flowtable;
 	struct handle_spec	handle;
 	struct position_spec	position;
diff --git a/src/evaluate.c b/src/evaluate.c
index 79fa3221e20d..fdc536479785 100644
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -3112,9 +3112,9 @@  static int cmd_evaluate_list_obj(struct eval_ctx *ctx, const struct cmd *cmd,
 	if (table == NULL)
 		return cmd_error(ctx, "Could not process rule: Table '%s' does not exist",
 				 cmd->handle.table.name);
-	if (obj_lookup(table, cmd->handle.obj, obj_type) == NULL)
+	if (obj_lookup(table, cmd->handle.obj.name, obj_type) == NULL)
 		return cmd_error(ctx, "Could not process rule: Object '%s' does not exist",
-					 cmd->handle.obj);
+					 cmd->handle.obj.name);
 	return 0;
 }
 
diff --git a/src/netlink.c b/src/netlink.c
index e465daa79c84..864947b4d2f0 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -293,8 +293,8 @@  __alloc_nftnl_obj(const struct handle *h, uint32_t type)
 
 	nftnl_obj_set_u32(nlo, NFTNL_OBJ_FAMILY, h->family);
 	nftnl_obj_set_str(nlo, NFTNL_OBJ_TABLE, h->table.name);
-	if (h->obj != NULL)
-		nftnl_obj_set_str(nlo, NFTNL_OBJ_NAME, h->obj);
+	if (h->obj.name != NULL)
+		nftnl_obj_set_str(nlo, NFTNL_OBJ_NAME, h->obj.name);
 
 	nftnl_obj_set_u32(nlo, NFTNL_OBJ_TYPE, type);
 	if (h->handle.id)
@@ -1410,7 +1410,7 @@  struct obj *netlink_delinearize_obj(struct netlink_ctx *ctx,
 	obj->handle.family = nftnl_obj_get_u32(nlo, NFTNL_OBJ_FAMILY);
 	obj->handle.table.name =
 		xstrdup(nftnl_obj_get_str(nlo, NFTNL_OBJ_TABLE));
-	obj->handle.obj =
+	obj->handle.obj.name =
 		xstrdup(nftnl_obj_get_str(nlo, NFTNL_OBJ_NAME));
 	obj->handle.handle.id =
 		nftnl_obj_get_u64(nlo, NFTNL_OBJ_HANDLE);
@@ -1564,7 +1564,7 @@  int netlink_reset_objs(struct netlink_ctx *ctx, const struct cmd *cmd,
 	int err;
 
 	obj_cache = mnl_nft_obj_dump(ctx, h->family,
-				     h->table.name, h->obj, type, dump, true);
+				     h->table.name, h->obj.name, type, dump, true);
 	if (obj_cache == NULL)
 		return -1;
 
diff --git a/src/parser_bison.y b/src/parser_bison.y
index e4b83523b411..5b3860368bc5 100644
--- a/src/parser_bison.y
+++ b/src/parser_bison.y
@@ -1925,7 +1925,8 @@  flowtable_identifier	:	identifier
 obj_spec		:	table_spec	identifier
 			{
 				$$		= $1;
-				$$.obj		= $2;
+				$$.obj.name	= $2;
+				$$.obj.location	= @2;
 			}
 			;
 
@@ -1940,7 +1941,8 @@  objid_spec		:	table_spec	HANDLE NUM
 obj_identifier		:	identifier
 			{
 				memset(&$$, 0, sizeof($$));
-				$$.obj		= $1;
+				$$.obj.name		= $1;
+				$$.obj.location		= @1;
 			}
 			;
 
diff --git a/src/rule.c b/src/rule.c
index 7d18bd08c1fb..2f0123b7a4a5 100644
--- a/src/rule.c
+++ b/src/rule.c
@@ -48,8 +48,8 @@  void handle_merge(struct handle *dst, const struct handle *src)
 		dst->set.name = xstrdup(src->set.name);
 	if (dst->flowtable == NULL && src->flowtable != NULL)
 		dst->flowtable = xstrdup(src->flowtable);
-	if (dst->obj == NULL && src->obj != NULL)
-		dst->obj = xstrdup(src->obj);
+	if (dst->obj.name == NULL && src->obj.name != NULL)
+		dst->obj.name = xstrdup(src->obj.name);
 	if (dst->handle.id == 0)
 		dst->handle = src->handle;
 	if (dst->position.id == 0)
@@ -1377,7 +1377,7 @@  struct obj *obj_lookup(const struct table *table, const char *name,
 	struct obj *obj;
 
 	list_for_each_entry(obj, &table->objs, list) {
-		if (!strcmp(obj->handle.obj, name) &&
+		if (!strcmp(obj->handle.obj.name, name) &&
 		    obj->type == type)
 			return obj;
 	}
@@ -1400,7 +1400,7 @@  static void obj_print_data(const struct obj *obj,
 {
 	switch (obj->type) {
 	case NFT_OBJECT_COUNTER:
-		nft_print(octx, " %s {", obj->handle.obj);
+		nft_print(octx, " %s {", obj->handle.obj.name);
 		if (octx->handle > 0)
 			nft_print(octx, " # handle %" PRIu64, obj->handle.handle.id);
 		nft_print(octx, "%s%s%s", opts->nl, opts->tab, opts->tab);
@@ -1415,7 +1415,7 @@  static void obj_print_data(const struct obj *obj,
 		const char *data_unit;
 		uint64_t bytes;
 
-		nft_print(octx, " %s {", obj->handle.obj);
+		nft_print(octx, " %s {", obj->handle.obj.name);
 		if (octx->handle > 0)
 			nft_print(octx, " # handle %" PRIu64, obj->handle.handle.id);
 		nft_print(octx, "%s%s%s", opts->nl, opts->tab, opts->tab);
@@ -1431,7 +1431,7 @@  static void obj_print_data(const struct obj *obj,
 		}
 		break;
 	case NFT_OBJECT_CT_HELPER:
-		nft_print(octx, "ct helper %s {", obj->handle.obj);
+		nft_print(octx, "ct helper %s {", obj->handle.obj.name);
 		if (octx->handle > 0)
 			nft_print(octx, " # handle %" PRIu64, obj->handle.handle.id);
 		nft_print(octx, "%s", opts->nl);
@@ -1446,7 +1446,7 @@  static void obj_print_data(const struct obj *obj,
 		const char *data_unit;
 		uint64_t rate;
 
-		nft_print(octx, " %s {", obj->handle.obj);
+		nft_print(octx, " %s {", obj->handle.obj.name);
 		if (octx->handle > 0)
 			nft_print(octx, " # handle %" PRIu64, obj->handle.handle.id);
 		nft_print(octx, "%s%s%s", opts->nl, opts->tab, opts->tab);
@@ -1577,8 +1577,8 @@  static int do_list_obj(struct netlink_ctx *ctx, struct cmd *cmd, uint32_t type)
 
 		list_for_each_entry(obj, &table->objs, list) {
 			if (obj->type != type ||
-			    (cmd->handle.obj != NULL &&
-			     strcmp(cmd->handle.obj, obj->handle.obj)))
+			    (cmd->handle.obj.name != NULL &&
+			     strcmp(cmd->handle.obj.name, obj->handle.obj.name)))
 				continue;
 
 			obj_print_declaration(obj, &opts, ctx->octx);