utils.c revision d84430702496f617c01c5e2d27d0e82e02390bb7
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 * 95e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf * Copyright (c) 2003-2008 Thomas Graf <tgraf@suug.ch> 1044d362409d5469aed47d19e7908d19bd194493aThomas Graf */ 1144d362409d5469aed47d19e7908d19bd194493aThomas Graf 1244d362409d5469aed47d19e7908d19bd194493aThomas Graf#include "utils.h" 1344d362409d5469aed47d19e7908d19bd194493aThomas Graf 1444d362409d5469aed47d19e7908d19bd194493aThomas Graf#include <stdlib.h> 1544d362409d5469aed47d19e7908d19bd194493aThomas Graf 1610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafuint32_t parse_u32(const char *arg) 1710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf{ 1810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf unsigned long lval; 1910cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf char *endptr; 2010cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf 2110cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf lval = strtoul(arg, &endptr, 0); 2210cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf if (endptr == arg || lval == ULONG_MAX) 2310cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf fatal(EINVAL, "Unable to parse \"%s\", not a number.", arg); 2410cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf 2510cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf return (uint32_t) lval; 2610cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf} 2710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf 285e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafvoid nlt_print_version(void) 295e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf{ 305e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf printf("libnl tools version %s\n", LIBNL_VERSION); 315e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf printf( 325e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf "Copyright (C) 2003-2008 Thomas Graf\n" 335e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf "\n" 345e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf "This program comes with ABSOLUTELY NO WARRANTY. This is free \n" 355e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf "software, and you are welcome to redistribute it under certain\n" 365e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf "conditions. See the GNU General Public License for details.\n" 375e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf ); 385e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf 395e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf exit(0); 405e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf} 415e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf 42535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Grafvoid fatal(int err, const char *fmt, ...) 43535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf{ 44535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_list ap; 45535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 46535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fprintf(stderr, "Error: "); 47535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 48535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_start(ap, fmt); 49535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf vfprintf(stderr, fmt, ap); 50535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf va_end(ap); 51535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 52535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fprintf(stderr, "\n"); 53535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 545e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf exit(abs(err)); 55535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf} 56535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 575e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafint nlt_connect(struct nl_sock *sk, int protocol) 5844d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 5944d362409d5469aed47d19e7908d19bd194493aThomas Graf int err; 6044d362409d5469aed47d19e7908d19bd194493aThomas Graf 615e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf if ((err = nl_connect(sk, protocol)) < 0) 62535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(err, "Unable to connect netlink socket: %s", 635e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf nl_geterror(err)); 6444d362409d5469aed47d19e7908d19bd194493aThomas Graf 6544d362409d5469aed47d19e7908d19bd194493aThomas Graf return err; 6644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 6744d362409d5469aed47d19e7908d19bd194493aThomas Graf 685e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafstruct nl_sock *nlt_alloc_socket(void) 6944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 705e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf struct nl_sock *sock; 71535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 725e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf if (!(sock = nl_socket_alloc())) 73535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf fatal(ENOBUFS, "Unable to allocate netlink socket"); 74535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 75535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf return sock; 7644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 7744d362409d5469aed47d19e7908d19bd194493aThomas Graf 785e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafstruct nl_addr *nlt_addr_parse(const char *str, int family) 7944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 8044d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_addr *addr; 815e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf int err; 8244d362409d5469aed47d19e7908d19bd194493aThomas Graf 835e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf if ((err = nl_addr_parse(str, family, &addr)) < 0) 845e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf fatal(err, "Unable to parse address \"%s\": %s", 855e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf str, nl_geterror(err)); 8644d362409d5469aed47d19e7908d19bd194493aThomas Graf 8744d362409d5469aed47d19e7908d19bd194493aThomas Graf return addr; 8844d362409d5469aed47d19e7908d19bd194493aThomas Graf} 8944d362409d5469aed47d19e7908d19bd194493aThomas Graf 905e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafint nlt_parse_dumptype(const char *str) 9144d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 9244d362409d5469aed47d19e7908d19bd194493aThomas Graf if (!strcasecmp(str, "brief")) 93d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf return NL_DUMP_LINE; 946d9d3d54750c1d8a9c90c463cc1d58a447c98f64Thomas Graf else if (!strcasecmp(str, "details") || !strcasecmp(str, "detailed")) 95d84430702496f617c01c5e2d27d0e82e02390bb7Thomas Graf return NL_DUMP_DETAILS; 9644d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "stats")) 9744d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_STATS; 9844d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "xml")) 9944d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_XML; 10044d362409d5469aed47d19e7908d19bd194493aThomas Graf else if (!strcasecmp(str, "env")) 10144d362409d5469aed47d19e7908d19bd194493aThomas Graf return NL_DUMP_ENV; 1025e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf else 1035e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf fatal(EINVAL, "Invalid dump type \"%s\".\n", str); 1045e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf 1055e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf return 0; 10644d362409d5469aed47d19e7908d19bd194493aThomas Graf} 10744d362409d5469aed47d19e7908d19bd194493aThomas Graf 1085e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Grafint nlt_confirm(struct nl_object *obj, struct nl_dump_params *params, 1095e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf int default_yes) 11044d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 1115e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf int answer; 11244d362409d5469aed47d19e7908d19bd194493aThomas Graf 1135e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf nl_object_dump(obj, params); 1145e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf printf("Delete? (%c/%c) ", 1155e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf default_yes ? 'Y' : 'y', 1165e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf default_yes ? 'n' : 'N'); 117535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 1185e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf do { 1195e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf answer = tolower(getchar()); 1205e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf if (answer == '\n') 1215e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf answer = default_yes ? 'y' : 'n'; 1225e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf } while (answer != 'y' && answer != 'n'); 12344d362409d5469aed47d19e7908d19bd194493aThomas Graf 1245e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf return answer == 'y'; 12544d362409d5469aed47d19e7908d19bd194493aThomas Graf} 12644d362409d5469aed47d19e7908d19bd194493aThomas Graf 12710cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Grafstruct nl_cache *alloc_cache(struct nl_sock *sock, const char *name, 12810cf5a586c149fdb7e2639000dbfae5e6f8522a5Thomas Graf int (*ac)(struct nl_sock *, struct nl_cache **)) 12944d362409d5469aed47d19e7908d19bd194493aThomas Graf{ 13044d362409d5469aed47d19e7908d19bd194493aThomas Graf struct nl_cache *cache; 1315e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf int err; 13244d362409d5469aed47d19e7908d19bd194493aThomas Graf 1335e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf if ((err = ac(sock, &cache)) < 0) 1345e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf fatal(err, "Unable to allocate %s cache: %s", 1355e732ad075e54ceb9f9e94fadbcec2e83d971b52Thomas Graf name, nl_geterror(err)); 136535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf 137535e83162249ed6274ba46bc72d8cc683ba20e17Thomas Graf nl_cache_mngt_provide(cache); 13844d362409d5469aed47d19e7908d19bd194493aThomas Graf 13944d362409d5469aed47d19e7908d19bd194493aThomas Graf return cache; 14044d362409d5469aed47d19e7908d19bd194493aThomas Graf} 14144d362409d5469aed47d19e7908d19bd194493aThomas Graf 142