.sock_bufsize = 133120,
};
+/* Shut down and free netlink sockets/registration. Safe to call multiple times. */
+static void netlink_shutdown(void)
+{
+ /* Deregister event and free the event socket */
+ if (rtnl_event.sock) {
+ odhcpd_deregister(&rtnl_event.ev);
+
+ if (rtnl_event.ev.uloop.fd >= 0) {
+ close(rtnl_event.ev.uloop.fd);
+ rtnl_event.ev.uloop.fd = -1;
+ }
+
+ nl_socket_free(rtnl_event.sock);
+ rtnl_event.sock = NULL;
+ }
+
+ /* Free the primary rtnl socket */
+ if (rtnl_socket) {
+ nl_socket_free(rtnl_socket);
+ rtnl_socket = NULL;
+ }
+}
+
int netlink_init(void)
{
rtnl_socket = create_socket(NETLINK_ROUTE);
odhcpd_register(&rtnl_event.ev);
+ atexit(netlink_shutdown);
+
return 0;
err:
- if (rtnl_socket) {
- nl_socket_free(rtnl_socket);
- rtnl_socket = NULL;
- }
-
- if (rtnl_event.sock) {
- nl_socket_free(rtnl_event.sock);
- rtnl_event.sock = NULL;
- rtnl_event.ev.uloop.fd = -1;
- }
+ netlink_shutdown();
return -1;
}
#define TIME_LEFT(t1, now) ((t1) != UINT32_MAX ? (t1) - (now) : UINT32_MAX)
+/* Shutdown helper: close fp_route if open. Safe to call multiple times. */
+static void router_shutdown(void)
+{
+ if (fp_route) {
+ fclose(fp_route);
+ fp_route = NULL;
+ }
+}
+
int router_init(void)
{
int ret = 0;
ret = -1;
}
+ atexit(router_shutdown);
+
out:
- if (ret < 0 && fp_route) {
- fclose(fp_route);
- fp_route = NULL;
- }
+ if (ret < 0)
+ router_shutdown();
return ret;
}