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