void tools_delete_router_address (const gchar *address) { struct nl_sock *sock = NULL; struct nl_addr *dst = NULL; struct nl_addr *gw = NULL; struct rtnl_nexthop *nhop = NULL; struct rtnl_route *route = NULL; sock = nl_socket_alloc (); nl_connect (sock, NETLINK_ROUTE); nhop = rtnl_route_nh_alloc (); nl_addr_parse (address, AF_INET, &gw); rtnl_route_nh_set_gateway (nhop, gw); rtnl_route_nh_set_flags (nhop, 0); route = rtnl_route_alloc (); rtnl_route_set_family (route, AF_INET); nl_addr_parse ("default", AF_INET, &dst); rtnl_route_add_nexthop (route, nhop); if (rtnl_route_delete (sock, route, NLM_F_CREATE | NLM_F_REPLACE) != 0) g_warning (_("Failed to delete default route.")); nl_socket_free (sock); rtnl_route_put (route); nl_addr_put (dst); nl_addr_put (gw); }
/** * nm_netlink_route_delete: * @route: the route to delete * * Returns: %TRUE if the request was successful, %FALSE if it failed **/ gboolean nm_netlink_route_delete (struct rtnl_route *route) { struct nl_sock *nlh; int err = 0; g_return_val_if_fail (route != NULL, FALSE); nlh = nm_netlink_get_default_handle (); err = rtnl_route_delete (nlh, route, 0); if (err) nm_log_dbg (LOGD_IP4 | LOGD_IP6, "%s (%d)", nl_geterror(err), err); /* Workaround libnl BUG: ESRCH is aliased to generic NLE_FAILURE * See: http://git.kernel.org/?p=libs/netlink/libnl.git;a=commit;h=7e9d5f */ if (err == -NLE_FAILURE) err = -NLE_OBJ_NOTFOUND; return (err && (err != -NLE_OBJ_NOTFOUND) && (err != -NLE_RANGE) ) ? FALSE : TRUE; }
static void delete_cb(struct nl_object *obj, void *arg) { struct rtnl_route *route = (struct rtnl_route *) obj; struct nl_dump_params params = { .dp_type = NL_DUMP_LINE, .dp_fd = stdout, }; int err; if (interactive && !nl_cli_confirm(obj, ¶ms, default_yes)) return; if ((err = rtnl_route_delete(sock, route, 0)) < 0) nl_cli_fatal(err, "Unable to delete route: %s", nl_geterror(err)); if (!quiet) { printf("Deleted "); nl_object_dump(obj, ¶ms); } deleted++; }