/* SPDX-License-Identifier: LGPL-2.1-only */
/*
 * Copyright (c) 2008-2009 Thomas Graf <tgraf@suug.ch>
 */

/**
 * @ingroup cli
 * @defgroup cli_rule Routing Rules
 *
 * @{
 */

#include "nl-default.h"

#include <netlink/cli/utils.h>
#include <netlink/cli/rule.h>

struct rtnl_rule *nl_cli_rule_alloc(void)
{
	struct rtnl_rule *rule;

	rule = rtnl_rule_alloc();
	if (!rule)
		nl_cli_fatal(ENOMEM, "Unable to allocate rule object");

	return rule;
}

struct nl_cache *nl_cli_rule_alloc_cache(struct nl_sock *sk)
{
	struct nl_cache *cache;
	int err;

	if ((err = rtnl_rule_alloc_cache(sk, AF_UNSPEC, &cache)) < 0)
		nl_cli_fatal(err, "Unable to allocate routing rule cache: %s\n",
			     nl_geterror(err));

	nl_cache_mngt_provide(cache);

	return cache;
}

void nl_cli_rule_parse_family(struct rtnl_rule *rule, char *arg)
{
	int family;

	if ((family = nl_str2af(arg)) != AF_UNSPEC)
		rtnl_rule_set_family(rule, family);
}

/** @} */
