nl-addr-add.c revision 44d362409d5469aed47d19e7908d19bd194493a
144d362409d5469aed47d19e7908d19bd194493aThomas Graf/*
244d362409d5469aed47d19e7908d19bd194493aThomas Graf * src/nl-addr-add.c     Add addresses
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 Grafint main(int argc, char *argv[])
1544d362409d5469aed47d19e7908d19bd194493aThomas Graf{
1644d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_handle *nlh;
1744d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct rtnl_addr *addr;
1844d362409d5469aed47d19e7908d19bd194493aThomas Graf	struct nl_addr *local;
1944d362409d5469aed47d19e7908d19bd194493aThomas Graf	int err = 1;
2044d362409d5469aed47d19e7908d19bd194493aThomas Graf
2144d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (argc < 3 || !strcmp(argv[1], "-h")) {
2244d362409d5469aed47d19e7908d19bd194493aThomas Graf		printf("Usage: nl-addr-add <addr> <ifindex>\n");
2344d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout;
2444d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
2544d362409d5469aed47d19e7908d19bd194493aThomas Graf
2644d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (nltool_init(argc, argv) < 0)
2744d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout;
2844d362409d5469aed47d19e7908d19bd194493aThomas Graf
2944d362409d5469aed47d19e7908d19bd194493aThomas Graf	nlh = nltool_alloc_handle();
3044d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!nlh)
3144d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout;
3244d362409d5469aed47d19e7908d19bd194493aThomas Graf
3344d362409d5469aed47d19e7908d19bd194493aThomas Graf	addr = rtnl_addr_alloc();
3444d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!addr)
3544d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout_free_handle;
3644d362409d5469aed47d19e7908d19bd194493aThomas Graf
3744d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (nltool_connect(nlh, NETLINK_ROUTE) < 0)
3844d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout_free_addr;
3944d362409d5469aed47d19e7908d19bd194493aThomas Graf
4044d362409d5469aed47d19e7908d19bd194493aThomas Graf	local = nltool_addr_parse(argv[1]);
4144d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (!local)
4244d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout_close;
4344d362409d5469aed47d19e7908d19bd194493aThomas Graf
4444d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (rtnl_addr_set_local(addr, local) < 0) {
4544d362409d5469aed47d19e7908d19bd194493aThomas Graf		fprintf(stderr, "Unable to set local address: %s\n",
4644d362409d5469aed47d19e7908d19bd194493aThomas Graf			nl_geterror());
4744d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout_put_addr;
4844d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
4944d362409d5469aed47d19e7908d19bd194493aThomas Graf
5044d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_addr_set_ifindex(addr, strtoul(argv[2], NULL, 0));
5144d362409d5469aed47d19e7908d19bd194493aThomas Graf
5244d362409d5469aed47d19e7908d19bd194493aThomas Graf	if (rtnl_addr_add(nlh, addr, 0) < 0) {
5344d362409d5469aed47d19e7908d19bd194493aThomas Graf		fprintf(stderr, "Unable to add address: %s\n", nl_geterror());
5444d362409d5469aed47d19e7908d19bd194493aThomas Graf		goto errout_close;
5544d362409d5469aed47d19e7908d19bd194493aThomas Graf	}
5644d362409d5469aed47d19e7908d19bd194493aThomas Graf
5744d362409d5469aed47d19e7908d19bd194493aThomas Graf	err = 0;
5844d362409d5469aed47d19e7908d19bd194493aThomas Graferrout_put_addr:
5944d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_addr_put(local);
6044d362409d5469aed47d19e7908d19bd194493aThomas Graferrout_close:
6144d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_close(nlh);
6244d362409d5469aed47d19e7908d19bd194493aThomas Graferrout_free_addr:
6344d362409d5469aed47d19e7908d19bd194493aThomas Graf	rtnl_addr_put(addr);
6444d362409d5469aed47d19e7908d19bd194493aThomas Graferrout_free_handle:
6544d362409d5469aed47d19e7908d19bd194493aThomas Graf	nl_handle_destroy(nlh);
6644d362409d5469aed47d19e7908d19bd194493aThomas Graferrout:
6744d362409d5469aed47d19e7908d19bd194493aThomas Graf	return err;
6844d362409d5469aed47d19e7908d19bd194493aThomas Graf}
69