• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: LGPL-2.1-only */
2 
3 #ifndef NETLINK_NL_AUTO_H_
4 #define NETLINK_NL_AUTO_H_
5 
6 #include <stdlib.h>
7 
8 #define _nl_auto(fcn)               __attribute__ ((__cleanup__(fcn)))
9 
10 #define _NL_AUTO_DEFINE_FCN_VOID0(CastType, name, func) \
11 static inline void name(void *v) \
12 { \
13 	if (*((CastType *) v)) \
14 		func(*((CastType *) v)); \
15 } \
16 struct _nl_dummy_for_tailing_semicolon
17 
18 #define _NL_AUTO_DEFINE_FCN_STRUCT(CastType, name, func) \
19 static inline void name(CastType *v) \
20 { \
21 	if (v) \
22 		func(v); \
23 } \
24 struct _nl_dummy_for_tailing_semicolon
25 
26 #define _NL_AUTO_DEFINE_FCN_TYPED0(CastType, name, func) \
27 static inline void name(CastType *v) \
28 { \
29 	if (*v) \
30 		func(*v); \
31 } \
32 struct _nl_dummy_for_tailing_semicolon
33 
34 #define _nl_auto_free _nl_auto(_nl_auto_free_fcn)
35 _NL_AUTO_DEFINE_FCN_VOID0(void *, _nl_auto_free_fcn, free);
36 
37 struct nl_addr;
38 void nl_addr_put(struct nl_addr *);
39 #define _nl_auto_nl_addr _nl_auto(_nl_auto_nl_addr_fcn)
40 _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_addr *, _nl_auto_nl_addr_fcn, nl_addr_put);
41 
42 struct nl_data;
43 void nl_data_free(struct nl_data *data);
44 #define _nl_auto_nl_data _nl_auto(_nl_auto_nl_data_fcn)
45 _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_data *, _nl_auto_nl_data_fcn, nl_data_free);
46 
47 struct nl_msg;
48 void nlmsg_free(struct nl_msg *);
49 #define _nl_auto_nl_msg _nl_auto(_nl_auto_nl_msg_fcn)
50 _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_msg *, _nl_auto_nl_msg_fcn, nlmsg_free);
51 
52 struct rtnl_link;
53 void rtnl_link_put(struct rtnl_link *);
54 #define _nl_auto_rtnl_link _nl_auto(_nl_auto_rtnl_link_fcn)
55 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_link *, _nl_auto_rtnl_link_fcn, rtnl_link_put);
56 
57 struct rtnl_route;
58 void rtnl_route_put(struct rtnl_route *);
59 #define _nl_auto_rtnl_route _nl_auto(_nl_auto_rtnl_route_fcn)
60 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_route *, _nl_auto_rtnl_route_fcn, rtnl_route_put);
61 
62 struct rtnl_mdb;
63 void rtnl_mdb_put(struct rtnl_mdb *);
64 #define _nl_auto_rtnl_mdb _nl_auto(_nl_auto_rtnl_mdb_fcn)
65 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_mdb *, _nl_auto_rtnl_mdb_fcn, rtnl_mdb_put);
66 
67 struct rtnl_nexthop;
68 void rtnl_route_nh_free(struct rtnl_nexthop *);
69 #define _nl_auto_rtnl_nexthop _nl_auto(_nl_auto_rtnl_nexthop_fcn)
70 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_nexthop *, _nl_auto_rtnl_nexthop_fcn, rtnl_route_nh_free);
71 
72 struct nl_cache;
73 void nl_cache_put(struct nl_cache *);
74 #define _nl_auto_nl_cache _nl_auto(_nl_auto_nl_cache_fcn)
75 _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_cache *, _nl_auto_nl_cache_fcn, nl_cache_put);
76 
77 struct rtnl_link_af_ops;
78 void rtnl_link_af_ops_put(struct rtnl_link_af_ops *);
79 #define _nl_auto_rtnl_link_af_ops _nl_auto(_nl_auto_rtnl_link_af_ops_fcn)
80 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_link_af_ops *, _nl_auto_rtnl_link_af_ops_fcn, rtnl_link_af_ops_put);
81 
82 struct rtnl_act;
83 void rtnl_act_put(struct rtnl_act *);
84 #define _nl_auto_rtnl_act _nl_auto(_nl_auto_rtnl_act_fcn)
85 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_act *, _nl_auto_rtnl_act_fcn, rtnl_act_put);
86 
87 struct rtnl_ematch_tree;
88 void rtnl_ematch_tree_free(struct rtnl_ematch_tree *);
89 #define _nl_auto_rtnl_ematch_tree _nl_auto(_nl_auto_rtnl_ematch_tree_fcn)
90 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_ematch_tree *, _nl_auto_rtnl_ematch_tree_fcn, rtnl_ematch_tree_free);
91 
92 struct rtnl_cls;
93 void rtnl_cls_put(struct rtnl_cls *);
94 #define _nl_auto_rtnl_cls _nl_auto(_nl_auto_rtnl_cls_fcn)
95 _NL_AUTO_DEFINE_FCN_TYPED0(struct rtnl_cls *, _nl_auto_rtnl_cls_fcn, rtnl_cls_put);
96 
97 struct nl_sock;
98 void nl_socket_free(struct nl_sock *);
99 #define _nl_auto_nl_socket _nl_auto(_nl_auto_nl_socket_fcn)
100 _NL_AUTO_DEFINE_FCN_TYPED0(struct nl_sock *, _nl_auto_nl_socket_fcn, nl_socket_free);
101 
102 #endif /* NETLINK_NL_AUTO_H_ */
103