Tizen 2.1 base
[platform/upstream/libnl2.git] / src / nl-addr-add.c
1 /*
2  * src/nl-addr-add.c     Add addresses
3  *
4  *      This library is free software; you can redistribute it and/or
5  *      modify it under the terms of the GNU General Public License as
6  *      published by the Free Software Foundation version 2 of the License.
7  *
8  * Copyright (c) 2003-2009 Thomas Graf <tgraf@suug.ch>
9  */
10
11 #include <netlink/cli/utils.h>
12 #include <netlink/cli/addr.h>
13 #include <netlink/cli/link.h>
14
15 static int quiet = 0;
16
17 static void print_usage(void)
18 {
19         printf(
20 "Usage: nl-addr-add [OPTION]... [ADDRESS]\n"
21 "\n"
22 "Options\n"
23 "     --replace             Replace the address if it exists.\n"
24 " -q, --quiet               Do not print informal notifications.\n"
25 " -h, --help                Show this help.\n"
26 " -v, --version             Show versioning information.\n"
27 "\n"
28 "Address Options\n"
29 " -a, --local=ADDR          Address to be considered local.\n"
30 " -d, --dev=DEV             Device the address should be assigned to.\n"
31 "     --family=FAMILY       Address family (normally autodetected).\n"
32 "     --broadcast=ADDR      Broadcast address of network (IPv4).\n"
33 "     --peer=ADDR           Peer address (IPv4).\n"
34 "     --label=STRING        Additional address label (IPv4).\n"
35 "     --scope=SCOPE         Scope of local address (IPv4).\n"
36 "     --preferred=TIME      Preferred lifetime (IPv6).\n"
37 "     --valid=TIME          Valid lifetime (IPv6).\n"
38         );
39
40         exit(0);
41 }
42
43 int main(int argc, char *argv[])
44 {
45         struct nl_sock *sock;
46         struct rtnl_addr *addr;
47         struct nl_cache *link_cache;
48         struct nl_dump_params dp = {
49                 .dp_type = NL_DUMP_LINE,
50                 .dp_fd = stdout,
51         };
52         int err, nlflags = NLM_F_CREATE;
53  
54         sock = nl_cli_alloc_socket();
55         nl_cli_connect(sock, NETLINK_ROUTE);
56         link_cache = nl_cli_link_alloc_cache(sock);
57         addr = nl_cli_addr_alloc();
58  
59         for (;;) {
60                 int c, optidx = 0;
61                 enum {
62                         ARG_FAMILY = 257,
63                         ARG_LABEL = 258,
64                         ARG_PEER,
65                         ARG_SCOPE,
66                         ARG_BROADCAST,
67                         ARG_REPLACE,
68                         ARG_PREFERRED,
69                         ARG_VALID,
70                 };
71                 static struct option long_opts[] = {
72                         { "replace", 0, 0, ARG_REPLACE },
73                         { "quiet", 0, 0, 'q' },
74                         { "help", 0, 0, 'h' },
75                         { "version", 0, 0, 'v' },
76                         { "local", 1, 0, 'a' },
77                         { "dev", 1, 0, 'd' },
78                         { "family", 1, 0, ARG_FAMILY },
79                         { "label", 1, 0, ARG_LABEL },
80                         { "peer", 1, 0, ARG_PEER },
81                         { "scope", 1, 0, ARG_SCOPE },
82                         { "broadcast", 1, 0, ARG_BROADCAST },
83                         { "preferred", 1, 0, ARG_PREFERRED },
84                         { "valid", 1, 0, ARG_VALID },
85                         { 0, 0, 0, 0 }
86                 };
87         
88                 c = getopt_long(argc, argv, "qhva:d:", long_opts, &optidx);
89                 if (c == -1)
90                         break;
91
92                 switch (c) {
93                 case '?': exit(NLE_INVAL);
94                 case ARG_REPLACE: nlflags |= NLM_F_REPLACE; break;
95                 case 'q': quiet = 1; break;
96                 case 'h': print_usage(); break;
97                 case 'v': nl_cli_print_version(); break;
98                 case 'a': nl_cli_addr_parse_local(addr, optarg); break;
99                 case 'd': nl_cli_addr_parse_dev(addr, link_cache, optarg); break;
100                 case ARG_FAMILY: nl_cli_addr_parse_family(addr, optarg); break;
101                 case ARG_LABEL: nl_cli_addr_parse_label(addr, optarg); break;
102                 case ARG_PEER: nl_cli_addr_parse_peer(addr, optarg); break;
103                 case ARG_SCOPE: nl_cli_addr_parse_scope(addr, optarg); break;
104                 case ARG_BROADCAST: nl_cli_addr_parse_broadcast(addr, optarg); break;
105                 case ARG_PREFERRED: nl_cli_addr_parse_preferred(addr, optarg); break;
106                 case ARG_VALID: nl_cli_addr_parse_valid(addr, optarg); break;
107                 }
108         }
109
110         if ((err = rtnl_addr_add(sock, addr, nlflags)) < 0)
111                 nl_cli_fatal(err, "Unable to add address: %s",
112                              nl_geterror(err));
113
114         if (!quiet) {
115                 printf("Added ");
116                 nl_object_dump(OBJ_CAST(addr), &dp);
117         }
118
119         return 0;
120 }