All users of genl have the same code to open a genl socket and resolve the family for their specific protocol. Introduce a helper to intialize the handle, and use it in all the genl code.
Signed-off-by: Sabrina Dubroca <s...@queasysnail.net> --- include/libgenl.h | 2 ++ ip/ipfou.c | 12 ++---------- ip/ipila.c | 12 ++---------- ip/ipl2tp.c | 12 ++---------- ip/ipmacsec.c | 18 ++---------------- ip/tcp_metrics.c | 14 +++----------- lib/libgenl.c | 17 +++++++++++++++++ 7 files changed, 30 insertions(+), 57 deletions(-) diff --git a/include/libgenl.h b/include/libgenl.h index 9db4bafd511b..2dbb4b36adcb 100644 --- a/include/libgenl.h +++ b/include/libgenl.h @@ -21,5 +21,7 @@ struct { \ } extern int genl_resolve_family(struct rtnl_handle *grth, const char *family); +extern int genl_init_handle(struct rtnl_handle *grth, const char *family, + int *genl_family); #endif /* __LIBGENL_H__ */ diff --git a/ip/ipfou.c b/ip/ipfou.c index 0673d11ff6f9..9f0911215749 100644 --- a/ip/ipfou.c +++ b/ip/ipfou.c @@ -136,16 +136,8 @@ static int do_del(int argc, char **argv) int do_ipfou(int argc, char **argv) { - if (genl_family < 0) { - if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) { - fprintf(stderr, "Cannot open generic netlink socket\n"); - exit(1); - } - - genl_family = genl_resolve_family(&genl_rth, FOU_GENL_NAME); - if (genl_family < 0) - exit(1); - } + if (genl_init_handle(&genl_rth, FOU_GENL_NAME, &genl_family)) + exit(1); if (argc < 1) usage(); diff --git a/ip/ipila.c b/ip/ipila.c index c30bdbf166a6..244245ca3c40 100644 --- a/ip/ipila.c +++ b/ip/ipila.c @@ -237,16 +237,8 @@ static int do_del(int argc, char **argv) int do_ipila(int argc, char **argv) { - if (genl_family < 0) { - if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) { - fprintf(stderr, "Cannot open generic netlink socket\n"); - exit(1); - } - - genl_family = genl_resolve_family(&genl_rth, ILA_GENL_NAME); - if (genl_family < 0) - exit(1); - } + if (genl_init_handle(&genl_rth, ILA_GENL_NAME, &genl_family)) + exit(1); if (argc < 1) usage(); diff --git a/ip/ipl2tp.c b/ip/ipl2tp.c index 9ebda135e5d6..d3338acecc9c 100644 --- a/ip/ipl2tp.c +++ b/ip/ipl2tp.c @@ -767,16 +767,8 @@ int do_ipl2tp(int argc, char **argv) if (argc < 1 || !matches(*argv, "help")) usage(); - if (genl_family < 0) { - if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) { - fprintf(stderr, "Cannot open generic netlink socket\n"); - exit(1); - } - - genl_family = genl_resolve_family(&genl_rth, L2TP_GENL_NAME); - if (genl_family < 0) - exit(1); - } + if (genl_init_handle(&genl_rth, L2TP_GENL_NAME, &genl_family)) + exit(1); if (matches(*argv, "add") == 0) return do_add(argc-1, argv+1); diff --git a/ip/ipmacsec.c b/ip/ipmacsec.c index 329be00fb32b..9eabfe241980 100644 --- a/ip/ipmacsec.c +++ b/ip/ipmacsec.c @@ -79,21 +79,6 @@ static int genl_family = -1; _cmd, _flags) -static void init_genl(void) -{ - if (genl_family >= 0) - return; - - if (rtnl_open_byproto(&genl_rth, 0, NETLINK_GENERIC) < 0) { - fprintf(stderr, "Cannot open generic netlink socket\n"); - exit(1); - } - - genl_family = genl_resolve_family(&genl_rth, MACSEC_GENL_NAME); - if (genl_family < 0) - exit(1); -} - static void ipmacsec_usage(void) { fprintf(stderr, "Usage: ip macsec add DEV tx sa { 0..3 } [ OPTS ] key ID KEY\n"); @@ -1001,7 +986,8 @@ static int do_show(int argc, char **argv) int do_ipmacsec(int argc, char **argv) { - init_genl(); + if (genl_init_handle(&genl_rth, MACSEC_GENL_NAME, &genl_family)) + exit(1); if (argc < 1) ipmacsec_usage(); diff --git a/ip/tcp_metrics.c b/ip/tcp_metrics.c index ac2613a0a880..8972acd05fb2 100644 --- a/ip/tcp_metrics.c +++ b/ip/tcp_metrics.c @@ -398,17 +398,9 @@ static int tcpm_do_cmd(int cmd, int argc, char **argv) ack = 0; } - if (genl_family < 0) { - if (rtnl_open_byproto(&grth, 0, NETLINK_GENERIC) < 0) { - fprintf(stderr, "Cannot open generic netlink socket\n"); - exit(1); - } - genl_family = genl_resolve_family(&grth, - TCP_METRICS_GENL_NAME); - if (genl_family < 0) - exit(1); - req.n.nlmsg_type = genl_family; - } + if (genl_init_handle(&grth, TCP_METRICS_GENL_NAME, &genl_family)) + exit(1); + req.n.nlmsg_type = genl_family; if (!(cmd & CMD_FLUSH) && (atype >= 0 || (cmd & CMD_DEL))) { if (ack) diff --git a/lib/libgenl.c b/lib/libgenl.c index a1a37a440f64..5fba1d86c624 100644 --- a/lib/libgenl.c +++ b/lib/libgenl.c @@ -60,3 +60,20 @@ int genl_resolve_family(struct rtnl_handle *grth, const char *family) return genl_parse_getfamily(&req.n); } + +int genl_init_handle(struct rtnl_handle *grth, const char *family, int *genl_family) +{ + if (*genl_family >= 0) + return 0; + + if (rtnl_open_byproto(grth, 0, NETLINK_GENERIC) < 0) { + fprintf(stderr, "Cannot open generic netlink socket\n"); + return -1; + } + + *genl_family = genl_resolve_family(grth, family); + if (*genl_family < 0) + return -1; + + return 0; +} -- 2.9.3