oops
[libnl.git] / src / f_addr.c
1 /*
2  * src/f_addr.c         Address Filter
3  *
4  *      This library is free software; you can redistribute it and/or
5  *      modify it under the terms of the GNU Lesser General Public
6  *      License as published by the Free Software Foundation version 2.1
7  *      of the License.
8  *
9  * Copyright (c) 2003-2006 Thomas Graf <tgraf@suug.ch>
10  */
11
12 static void get_filter(struct rtnl_addr *addr, int argc, char **argv, int idx,
13                        struct nl_cache *link_cache)
14 {
15         struct nl_addr *a;
16
17         while (argc > idx) {
18                 if (arg_match("dev")) {
19                         if (argc > ++idx) {
20                                 int ifindex = rtnl_link_name2i(link_cache, argv[idx++]);
21                                 if (ifindex == RTNL_LINK_NOT_FOUND)
22                                         goto err_notfound;
23                                 rtnl_addr_set_ifindex(addr, ifindex);
24                         }
25                 } else if (arg_match("family")) {
26                         if (argc > ++idx) {
27                                 int family = nl_str2af(argv[idx++]);
28                                 if (family == AF_UNSPEC)
29                                         goto err_invaf;
30                                 rtnl_addr_set_family(addr, family);
31                         }
32                 } else if (arg_match("label")) {
33                         if (argc > ++idx)
34                                 rtnl_addr_set_label(addr, argv[idx++]);
35                 } else if (arg_match("scope")) {
36                         if (argc > ++idx) {
37                                 int scope = rtnl_str2scope(argv[idx++]);
38                                 if (scope < 0)
39                                         goto err_invscope;
40                                 rtnl_addr_set_scope(addr, scope);
41                         }
42                 } else if (arg_match("local")) {
43                         if (argc > ++idx) {
44                                 a = nl_addr_parse(argv[idx++],
45                                                   rtnl_addr_get_family(addr));
46                                 if (!a)
47                                         goto err_invaddr;
48                                 rtnl_addr_set_local(addr, a);
49                                 nl_addr_put(a);
50                         }
51                 } else if (arg_match("peer")) {
52                         if (argc > ++idx) {
53                                 a = nl_addr_parse(argv[idx++],
54                                                   rtnl_addr_get_family(addr));
55                                 if (!a)
56                                         goto err_invaddr;
57                                 rtnl_addr_set_peer(addr, a);
58                                 nl_addr_put(a);
59                         }
60                 } else if (arg_match("broadcast")) {
61                         if (argc > ++idx) {
62                                 a = nl_addr_parse(argv[idx++],
63                                                   rtnl_addr_get_family(addr));
64                                 if (!a)
65                                         goto err_invaddr;
66                                 rtnl_addr_set_broadcast(addr, a);
67                                 nl_addr_put(a);
68                         }
69                 } else if (arg_match("multicast")) {
70                         if (argc > ++idx) {
71                                 a = nl_addr_parse(argv[idx++],
72                                                   rtnl_addr_get_family(addr));
73                                 if (!a)
74                                         goto err_invaddr;
75                                 rtnl_addr_set_multicast(addr, a);
76                                 nl_addr_put(a);
77                         }
78                 } else if (arg_match("anycast")) {
79                         if (argc > ++idx) {
80                                 a = nl_addr_parse(argv[idx++],
81                                                   rtnl_addr_get_family(addr));
82                                 if (!a)
83                                         goto err_invaddr;
84                                 rtnl_addr_set_anycast(addr, a);
85                                 nl_addr_put(a);
86                         }
87                 } else {
88                         fprintf(stderr, "What is '%s'?\n", argv[idx]);
89                         exit(1);
90                 }
91         }
92
93         return;
94
95 err_notfound:
96         fprintf(stderr, "Unknown link %s\n", argv[idx-1]);
97         exit(1);
98 err_invscope:
99         fprintf(stderr, "Invalid scope name \"%s\".\n", argv[idx-1]);
100         exit(1);
101 err_invaf:
102         fprintf(stderr, "Invalid address family \"%s\"\n", argv[idx-1]);
103         exit(1);
104 err_invaddr:
105         fprintf(stderr, "Invalid address \"%s\": %s\n", argv[idx-1], nl_geterror());
106         exit(1);
107 }