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