summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Neira Ayuso <pablo@netfilter.org>2013-10-01 13:23:39 +0200
committerPablo Neira Ayuso <pablo@netfilter.org>2013-10-01 13:23:39 +0200
commit3c78a4543e12f5e82bdd771971d3534fa452117b (patch)
tree8cde35f4b0331bd95a6ea08572628ae680a8e4c0
parent386968d321d02571b593b3bbbf39891f44397469 (diff)
nfct: src: consolidate netlink socket creation
Open the socket from the main function, then pass it as parameter to the corresponding interpreter. Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-rw-r--r--include/nfct.h3
-rw-r--r--src/nfct-extensions/helper.c125
-rw-r--r--src/nfct-extensions/timeout.c103
-rw-r--r--src/nfct.c25
4 files changed, 68 insertions, 188 deletions
diff --git a/include/nfct.h b/include/nfct.h
index 93717c5..682fe3a 100644
--- a/include/nfct.h
+++ b/include/nfct.h
@@ -28,11 +28,12 @@ void nfct_perror(const char *msg);
struct nfct_extension {
struct list_head head;
int type;
- int (*parse_params)(int argc, char *argv[]);
+ int (*parse_params)(struct mnl_socket *nl, int argc, char *argv[]);
};
void nfct_extension_register(struct nfct_extension *ext);
+struct mnl_socket *nfct_mnl_open(void);
int nfct_mnl_talk(struct mnl_socket *nl, struct nlmsghdr *nlh,
uint32_t seq, uint32_t portid,
int (*cb)(const struct nlmsghdr *nlh, void *data),
diff --git a/src/nfct-extensions/helper.c b/src/nfct-extensions/helper.c
index 4171a47..7544ed7 100644
--- a/src/nfct-extensions/helper.c
+++ b/src/nfct-extensions/helper.c
@@ -37,14 +37,15 @@ nfct_cmd_helper_usage(char *argv[])
"[parameters...]\n", VERSION, argv[0]);
}
-static int nfct_cmd_helper_list(int argc, char *argv[]);
-static int nfct_cmd_helper_add(int argc, char *argv[]);
-static int nfct_cmd_helper_delete(int argc, char *argv[]);
-static int nfct_cmd_helper_get(int argc, char *argv[]);
-static int nfct_cmd_helper_flush(int argc, char *argv[]);
-static int nfct_cmd_helper_disable(int argc, char *argv[]);
-
-static int nfct_cmd_helper_parse_params(int argc, char *argv[])
+static int nfct_cmd_helper_list(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_helper_add(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_helper_delete(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_helper_get(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_helper_flush(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_helper_disable(struct mnl_socket *nl, int argc, char *argv[]);
+
+static int
+nfct_cmd_helper_parse_params(struct mnl_socket *nl, int argc, char *argv[])
{
int cmd = NFCT_CMD_NONE, ret = 0;
@@ -72,24 +73,25 @@ static int nfct_cmd_helper_parse_params(int argc, char *argv[])
nfct_cmd_helper_usage(argv);
exit(EXIT_FAILURE);
}
+
switch(cmd) {
case NFCT_CMD_LIST:
- ret = nfct_cmd_helper_list(argc, argv);
+ ret = nfct_cmd_helper_list(nl, argc, argv);
break;
case NFCT_CMD_ADD:
- ret = nfct_cmd_helper_add(argc, argv);
+ ret = nfct_cmd_helper_add(nl, argc, argv);
break;
case NFCT_CMD_DELETE:
- ret = nfct_cmd_helper_delete(argc, argv);
+ ret = nfct_cmd_helper_delete(nl, argc, argv);
break;
case NFCT_CMD_GET:
- ret = nfct_cmd_helper_get(argc, argv);
+ ret = nfct_cmd_helper_get(nl, argc, argv);
break;
case NFCT_CMD_FLUSH:
- ret = nfct_cmd_helper_flush(argc, argv);
+ ret = nfct_cmd_helper_flush(nl, argc, argv);
break;
case NFCT_CMD_DISABLE:
- ret = nfct_cmd_helper_disable(argc, argv);
+ ret = nfct_cmd_helper_disable(nl, argc, argv);
break;
}
@@ -121,9 +123,8 @@ err:
return MNL_CB_OK;
}
-static int nfct_cmd_helper_list(int argc, char *argv[])
+static int nfct_cmd_helper_list(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
unsigned int seq, portid;
@@ -137,18 +138,7 @@ static int nfct_cmd_helper_list(int argc, char *argv[])
nlh = nfct_helper_nlmsg_build_hdr(buf, NFNL_MSG_CTHELPER_GET,
NLM_F_DUMP, seq);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, nfct_helper_cb, NULL) < 0) {
nfct_perror("netlink error");
return -1;
@@ -159,9 +149,8 @@ static int nfct_cmd_helper_list(int argc, char *argv[])
return 0;
}
-static int nfct_cmd_helper_add(int argc, char *argv[])
+static int nfct_cmd_helper_add(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -242,31 +231,18 @@ static int nfct_cmd_helper_add(int argc, char *argv[])
nfct_helper_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-static int nfct_cmd_helper_delete(int argc, char *argv[])
+static int
+nfct_cmd_helper_delete(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -323,31 +299,17 @@ static int nfct_cmd_helper_delete(int argc, char *argv[])
nfct_helper_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-static int nfct_cmd_helper_get(int argc, char *argv[])
+static int nfct_cmd_helper_get(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -404,31 +366,18 @@ static int nfct_cmd_helper_get(int argc, char *argv[])
nfct_helper_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, nfct_helper_cb, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-static int nfct_cmd_helper_flush(int argc, char *argv[])
+static int
+nfct_cmd_helper_flush(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -442,18 +391,7 @@ static int nfct_cmd_helper_flush(int argc, char *argv[])
nlh = nfct_helper_nlmsg_build_hdr(buf, NFNL_MSG_CTHELPER_DEL,
NLM_F_ACK, seq);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
@@ -464,9 +402,9 @@ static int nfct_cmd_helper_flush(int argc, char *argv[])
return 0;
}
-static int nfct_cmd_helper_disable(int argc, char *argv[])
+static int
+nfct_cmd_helper_disable(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -524,25 +462,12 @@ static int nfct_cmd_helper_disable(int argc, char *argv[])
nfct_helper_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
diff --git a/src/nfct-extensions/timeout.c b/src/nfct-extensions/timeout.c
index c361dab..9f74eca 100644
--- a/src/nfct-extensions/timeout.c
+++ b/src/nfct-extensions/timeout.c
@@ -36,13 +36,14 @@ nfct_cmd_timeout_usage(char *argv[])
"[parameters...]\n", VERSION, argv[0]);
}
-static int nfct_cmd_timeout_list(int argc, char *argv[]);
-static int nfct_cmd_timeout_add(int argc, char *argv[]);
-static int nfct_cmd_timeout_delete(int argc, char *argv[]);
-static int nfct_cmd_timeout_get(int argc, char *argv[]);
-static int nfct_cmd_timeout_flush(int argc, char *argv[]);
+static int nfct_cmd_timeout_list(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_timeout_add(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_timeout_delete(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_timeout_get(struct mnl_socket *nl, int argc, char *argv[]);
+static int nfct_cmd_timeout_flush(struct mnl_socket *nl, int argc, char *argv[]);
-static int nfct_cmd_timeout_parse_params(int argc, char *argv[])
+static int
+nfct_cmd_timeout_parse_params(struct mnl_socket *nl, int argc, char *argv[])
{
int cmd = NFCT_CMD_NONE, ret;
@@ -68,19 +69,19 @@ static int nfct_cmd_timeout_parse_params(int argc, char *argv[])
}
switch(cmd) {
case NFCT_CMD_LIST:
- ret = nfct_cmd_timeout_list(argc, argv);
+ ret = nfct_cmd_timeout_list(nl, argc, argv);
break;
case NFCT_CMD_ADD:
- ret = nfct_cmd_timeout_add(argc, argv);
+ ret = nfct_cmd_timeout_add(nl, argc, argv);
break;
case NFCT_CMD_DELETE:
- ret = nfct_cmd_timeout_delete(argc, argv);
+ ret = nfct_cmd_timeout_delete(nl, argc, argv);
break;
case NFCT_CMD_GET:
- ret = nfct_cmd_timeout_get(argc, argv);
+ ret = nfct_cmd_timeout_get(nl, argc, argv);
break;
case NFCT_CMD_FLUSH:
- ret = nfct_cmd_timeout_flush(argc, argv);
+ ret = nfct_cmd_timeout_flush(nl, argc, argv);
break;
}
@@ -112,9 +113,8 @@ err:
return MNL_CB_OK;
}
-static int nfct_cmd_timeout_list(int argc, char *argv[])
+static int nfct_cmd_timeout_list(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
unsigned int seq, portid;
@@ -128,25 +128,12 @@ static int nfct_cmd_timeout_list(int argc, char *argv[])
nlh = nfct_timeout_nlmsg_build_hdr(buf, IPCTNL_MSG_TIMEOUT_GET,
NLM_F_DUMP, seq);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, nfct_timeout_cb, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
@@ -262,9 +249,8 @@ nfct_cmd_timeout_parse(struct nfct_timeout *t, int argc, char *argv[])
return 0;
}
-int nfct_cmd_timeout_add(int argc, char *argv[])
+int nfct_cmd_timeout_add(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -296,31 +282,17 @@ int nfct_cmd_timeout_add(int argc, char *argv[])
nfct_timeout_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-int nfct_cmd_timeout_delete(int argc, char *argv[])
+int nfct_cmd_timeout_delete(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -349,31 +321,17 @@ int nfct_cmd_timeout_delete(int argc, char *argv[])
nfct_timeout_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-int nfct_cmd_timeout_get(int argc, char *argv[])
+int nfct_cmd_timeout_get(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -402,31 +360,17 @@ int nfct_cmd_timeout_get(int argc, char *argv[])
nfct_timeout_free(t);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, nfct_timeout_cb, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
-int nfct_cmd_timeout_flush(int argc, char *argv[])
+int nfct_cmd_timeout_flush(struct mnl_socket *nl, int argc, char *argv[])
{
- struct mnl_socket *nl;
char buf[MNL_SOCKET_BUFFER_SIZE];
struct nlmsghdr *nlh;
uint32_t portid, seq;
@@ -440,25 +384,12 @@ int nfct_cmd_timeout_flush(int argc, char *argv[])
nlh = nfct_timeout_nlmsg_build_hdr(buf, IPCTNL_MSG_TIMEOUT_DELETE,
NLM_F_ACK, seq);
- nl = mnl_socket_open(NETLINK_NETFILTER);
- if (nl == NULL) {
- nfct_perror("mnl_socket_open");
- return -1;
- }
-
- if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0) {
- nfct_perror("mnl_socket_bind");
- return -1;
- }
portid = mnl_socket_get_portid(nl);
-
if (nfct_mnl_talk(nl, nlh, seq, portid, NULL, NULL) < 0) {
nfct_perror("netlink error");
return -1;
}
- mnl_socket_close(nl);
-
return 0;
}
diff --git a/src/nfct.c b/src/nfct.c
index 84bb1b7..19e44be 100644
--- a/src/nfct.c
+++ b/src/nfct.c
@@ -69,6 +69,7 @@ int main(int argc, char *argv[])
{
int subsys = NFCT_SUBSYS_NONE, ret = 0;
struct nfct_extension *ext;
+ struct mnl_socket *nl;
if (argc < 2) {
usage(argv);
@@ -103,7 +104,15 @@ int main(int argc, char *argv[])
VERSION, argv[1]);
return EXIT_FAILURE;
}
- ret = ext->parse_params(argc, argv);
+
+ nl = nfct_mnl_open();
+ if (nl == NULL) {
+ nfct_perror("cannot open netlink");
+ return -1;
+ }
+
+ ret = ext->parse_params(nl, argc, argv);
+ mnl_socket_close(nl);
break;
}
return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS;
@@ -168,3 +177,17 @@ int nfct_mnl_talk(struct mnl_socket *nl, struct nlmsghdr *nlh,
return 0;
}
+
+struct mnl_socket *nfct_mnl_open(void)
+{
+ struct mnl_socket *nl;
+
+ nl = mnl_socket_open(NETLINK_NETFILTER);
+ if (nl == NULL)
+ return NULL;
+
+ if (mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID) < 0)
+ return NULL;
+
+ return nl;
+}