chiark / gitweb /
Unifiy free() usage
[elogind.git] / src / libelogind / sd-rtnl / rtnl-util.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4  This file is part of systemd.
5
6  Copyright (C) 2013 Tom Gundersen <teg@jklm.no>
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22
23 #include "sd-rtnl.h"
24
25 #include "rtnl-util.h"
26 #include "rtnl-internal.h"
27
28 int rtnl_set_link_name(sd_rtnl **rtnl, int ifindex, const char *name) {
29         _cleanup_rtnl_message_unref_ sd_rtnl_message *message = NULL;
30         int r;
31
32         assert(rtnl);
33         assert(ifindex > 0);
34         assert(name);
35
36         if (!*rtnl) {
37                 r = sd_rtnl_open(rtnl);
38                 if (r < 0)
39                         return r;
40         }
41
42         r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
43         if (r < 0)
44                 return r;
45
46         r = sd_rtnl_message_append_string(message, IFLA_IFNAME, name);
47         if (r < 0)
48                 return r;
49
50         r = sd_rtnl_call(*rtnl, message, 0, NULL);
51         if (r < 0)
52                 return r;
53
54         return 0;
55 }
56
57 int rtnl_set_link_properties(sd_rtnl **rtnl, int ifindex, const char *alias,
58                              const struct ether_addr *mac, unsigned mtu) {
59         _cleanup_rtnl_message_unref_ sd_rtnl_message *message = NULL;
60         int r;
61
62         assert(rtnl);
63         assert(ifindex > 0);
64
65         if (!alias && !mac && mtu == 0)
66                 return 0;
67
68         if (!*rtnl) {
69                 r = sd_rtnl_open(rtnl);
70                 if (r < 0)
71                         return r;
72         }
73
74         r = sd_rtnl_message_new_link(*rtnl, &message, RTM_SETLINK, ifindex);
75         if (r < 0)
76                 return r;
77
78         if (alias) {
79                 r = sd_rtnl_message_append_string(message, IFLA_IFALIAS, alias);
80                 if (r < 0)
81                         return r;
82         }
83
84         if (mac) {
85                 r = sd_rtnl_message_append_ether_addr(message, IFLA_ADDRESS, mac);
86                 if (r < 0)
87                         return r;
88         }
89
90         if (mtu > 0) {
91                 r = sd_rtnl_message_append_u32(message, IFLA_MTU, mtu);
92                 if (r < 0)
93                         return r;
94         }
95
96         r = sd_rtnl_call(*rtnl, message, 0, NULL);
97         if (r < 0)
98                 return r;
99
100         return 0;
101 }
102
103 int rtnl_message_new_synthetic_error(int error, uint32_t serial, sd_rtnl_message **ret) {
104         struct nlmsgerr *err;
105         int r;
106
107         assert(error <= 0);
108
109         r = message_new(NULL, ret, NLMSG_ERROR);
110         if (r < 0)
111                 return r;
112
113         (*ret)->hdr->nlmsg_seq = serial;
114
115         err = NLMSG_DATA((*ret)->hdr);
116
117         err->error = error;
118
119         return 0;
120 }
121
122 bool rtnl_message_type_is_neigh(uint16_t type) {
123         switch (type) {
124                 case RTM_NEWNEIGH:
125                 case RTM_GETNEIGH:
126                 case RTM_DELNEIGH:
127                         return true;
128                 default:
129                         return false;
130         }
131 }
132
133 bool rtnl_message_type_is_route(uint16_t type) {
134         switch (type) {
135                 case RTM_NEWROUTE:
136                 case RTM_GETROUTE:
137                 case RTM_DELROUTE:
138                         return true;
139                 default:
140                         return false;
141         }
142 }
143
144 bool rtnl_message_type_is_link(uint16_t type) {
145         switch (type) {
146                 case RTM_NEWLINK:
147                 case RTM_SETLINK:
148                 case RTM_GETLINK:
149                 case RTM_DELLINK:
150                         return true;
151                 default:
152                         return false;
153         }
154 }
155
156 bool rtnl_message_type_is_addr(uint16_t type) {
157         switch (type) {
158                 case RTM_NEWADDR:
159                 case RTM_GETADDR:
160                 case RTM_DELADDR:
161                         return true;
162                 default:
163                         return false;
164         }
165 }
166
167 int rtnl_log_parse_error(int r) {
168         return log_error_errno(r, "Failed to parse netlink message: %m");
169 }
170
171 int rtnl_log_create_error(int r) {
172         return log_error_errno(r, "Failed to create netlink message: %m");
173 }