utils.c revision 6d9d3d54750c1d8a9c90c463cc1d58a447c98f64
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/* 244d362409d5469aed47d19e7908d19bd194493aThomas Graf * src/utils.c Utilities 344d362409d5469aed47d19e7908d19bd194493aThomas Graf * 444d362409d5469aed47d19e7908d19bd194493aThomas Graf * This library is free software; you can redistribute it and/or 544d362409d5469aed47d19e7908d19bd194493aThomas Graf * modify it under the terms of the GNU Lesser General Public 644d362409d5469aed47d19e7908d19bd194493aThomas Graf * License as published by the Free Software Foundation version 2.1 744d362409d5469aed47d19e7908d19bd194493aThomas Graf * of the License. 844d362409d5469aed47d19e7908d19bd194493aThomas Graf * 944d362409d5469aed47d19e7908d19bd194493aThomas Graf * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "utils.h" 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <stdlib.h> 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf 16535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Grafvoid fatal(int err, const char *fmt, ...) 17535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf{ 18535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_list ap; 19535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 20535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fprintf(stderr, "Error: "); 21535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 22535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_start(ap, fmt); 23535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf vfprintf(stderr, fmt, ap); 24535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_end(ap); 25535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 26535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fprintf(stderr, "\n"); 27535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 28535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf exit(err); 29535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf} 30535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 3144d362409d5469aed47d19e7908d19bd194493aThomas Grafint nltool_init(int argc, char *argv[]) 3244d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 3344d362409d5469aed47d19e7908d19bd194493aThomas Graf return 0; 3444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 3544d362409d5469aed47d19e7908d19bd194493aThomas Graf 3644d362409d5469aed47d19e7908d19bd194493aThomas Grafint nltool_connect(struct nl_handle *nlh, int protocol) 3744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 3844d362409d5469aed47d19e7908d19bd194493aThomas Graf int err; 3944d362409d5469aed47d19e7908d19bd194493aThomas Graf 4044d362409d5469aed47d19e7908d19bd194493aThomas Graf err = nl_connect(nlh, protocol); 4144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (err < 0) 42535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(err, "Unable to connect netlink socket: %s", 4344d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 4444d362409d5469aed47d19e7908d19bd194493aThomas Graf 4544d362409d5469aed47d19e7908d19bd194493aThomas Graf return err; 4644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 4744d362409d5469aed47d19e7908d19bd194493aThomas Graf 4844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_handle *nltool_alloc_handle(void) 4944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 50535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf struct nl_handle *sock; 51535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 52535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf if (!(sock = nl_handle_alloc())) 53535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(ENOBUFS, "Unable to allocate netlink socket"); 54535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 55535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf return sock; 5644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 5744d362409d5469aed47d19e7908d19bd194493aThomas Graf 5844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_addr *nltool_addr_parse(const char *str) 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_addr *addr; 6144d362409d5469aed47d19e7908d19bd194493aThomas Graf 6244d362409d5469aed47d19e7908d19bd194493aThomas Graf addr = nl_addr_parse(str, AF_UNSPEC); 6344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!addr) 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf fprintf(stderr, "Unable to parse address \"%s\": %s\n", 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf str, nl_geterror()); 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf return addr; 6844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf 7044d362409d5469aed47d19e7908d19bd194493aThomas Grafint nltool_parse_dumptype(const char *str) 7144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 7244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(str, "brief")) 7344d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_BRIEF; 746d9d3d54750c1d8a9c90c463cc1d58a447c98f64Thomas Graf else if (!strcasecmp(str, "details") || !strcasecmp(str, "detailed")) 7544d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_FULL; 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "stats")) 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_STATS; 7844d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "xml")) 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_XML; 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "env")) 8144d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_ENV; 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf else { 8344d362409d5469aed47d19e7908d19bd194493aThomas Graf fprintf(stderr, "Invalid dump type \"%s\".\n", str); 8444d362409d5469aed47d19e7908d19bd194493aThomas Graf return -1; 8544d362409d5469aed47d19e7908d19bd194493aThomas Graf } 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf 8844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_link_cache(struct nl_handle *nlh) 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9044d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_link_alloc_cache(nlh); 9344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 94535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve link cache: %s", 9544d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 96535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 97535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf 10244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_addr_cache(struct nl_handle *nlh) 10344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 10444d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 10544d362409d5469aed47d19e7908d19bd194493aThomas Graf 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_addr_alloc_cache(nlh); 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 108535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve address cache: %s\n", 10944d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 110535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 111535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf 11344d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 11444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 11544d362409d5469aed47d19e7908d19bd194493aThomas Graf 11644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_neigh_cache(struct nl_handle *nlh) 11744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 11844d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 11944d362409d5469aed47d19e7908d19bd194493aThomas Graf 12044d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_neigh_alloc_cache(nlh); 12144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 122535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve neighbour cache: %s\n", 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 124535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 125535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 12644d362409d5469aed47d19e7908d19bd194493aThomas Graf 12744d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 12844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 12944d362409d5469aed47d19e7908d19bd194493aThomas Graf 13044d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_neightbl_cache(struct nl_handle *nlh) 13144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 13244d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 13344d362409d5469aed47d19e7908d19bd194493aThomas Graf 13444d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_neightbl_alloc_cache(nlh); 13544d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 136535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve neighbour table " 137535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf "cache: %s", nl_geterror()); 13844d362409d5469aed47d19e7908d19bd194493aThomas Graf else 13944d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_cache_mngt_provide(cache); 14044d362409d5469aed47d19e7908d19bd194493aThomas Graf 14144d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 14244d362409d5469aed47d19e7908d19bd194493aThomas Graf} 14344d362409d5469aed47d19e7908d19bd194493aThomas Graf 14444d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_route_cache(struct nl_handle *nlh) 14544d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 14644d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 14744d362409d5469aed47d19e7908d19bd194493aThomas Graf 14844d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_route_alloc_cache(nlh); 14944d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 150535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve route cache: %s\n", 15144d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 152535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 153535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 15444d362409d5469aed47d19e7908d19bd194493aThomas Graf 15544d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 15644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 15744d362409d5469aed47d19e7908d19bd194493aThomas Graf 15844d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_rule_cache(struct nl_handle *nlh) 15944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 16044d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 16144d362409d5469aed47d19e7908d19bd194493aThomas Graf 16244d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_rule_alloc_cache(nlh); 16344d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 164535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve rule cache: %s\n", 16544d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 166535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 167535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 16844d362409d5469aed47d19e7908d19bd194493aThomas Graf 16944d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 17044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 17144d362409d5469aed47d19e7908d19bd194493aThomas Graf 17244d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_qdisc_cache(struct nl_handle *nlh) 17344d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 17444d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 17544d362409d5469aed47d19e7908d19bd194493aThomas Graf 17644d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = rtnl_qdisc_alloc_cache(nlh); 17744d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 178535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve qdisc cache: %s\n", 17944d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 180535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 181535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 18244d362409d5469aed47d19e7908d19bd194493aThomas Graf 18344d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 18444d362409d5469aed47d19e7908d19bd194493aThomas Graf} 18544d362409d5469aed47d19e7908d19bd194493aThomas Graf 18644d362409d5469aed47d19e7908d19bd194493aThomas Grafstruct nl_cache *nltool_alloc_genl_family_cache(struct nl_handle *nlh) 18744d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 18844d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 18944d362409d5469aed47d19e7908d19bd194493aThomas Graf 19044d362409d5469aed47d19e7908d19bd194493aThomas Graf cache = genl_ctrl_alloc_cache(nlh); 19144d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!cache) 192535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(nl_get_errno(), "Unable to retrieve genl family cache: %s\n", 19344d362409d5469aed47d19e7908d19bd194493aThomas Graf nl_geterror()); 194535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 195535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 19644d362409d5469aed47d19e7908d19bd194493aThomas Graf 19744d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 19844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 199