2008-05-22 Dan Williams <dcbw@redhat.com>
[NetworkManager.git] / src / backends / NetworkManagerGeneric.c
1 /* NetworkManager -- Network link manager
2  *
3  * Timothee Lecomte <timothee.lecomte@ens.fr>
4  *
5  * Heavily based on NetworkManagerRedhat.c by Dan Williams <dcbw@redhat.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  *
21  * (C) Copyright 2004 Red Hat, Inc.
22  */
23
24 #ifdef HAVE_CONFIG_H
25 #include <config.h>
26 #endif
27
28 #include <stdio.h>
29 #include <sys/types.h>
30 #include <signal.h>
31 #include <arpa/inet.h>
32 #include <string.h>
33
34 #include "NetworkManagerGeneric.h"
35 #include "NetworkManagerSystem.h"
36 #include "NetworkManagerUtils.h"
37 #include "nm-device.h"
38 #include "nm-device-802-3-ethernet.h"
39 #include "nm-device-802-11-wireless.h"
40 #include "nm-utils.h"
41
42 /*
43  * nm_generic_init
44  *
45  * Initializes the distribution-specific system backend
46  *
47  */
48 void nm_generic_init (void)
49 {
50         /* Kill any dhclients lying around */
51         nm_system_kill_all_dhcp_daemons ();
52 }
53
54 /*
55  * nm_generic_device_flush_ip4_addresses
56  *
57  * Flush all network addresses associated with a network device
58  *
59  */
60 void nm_generic_device_flush_ip4_routes (NMDevice *dev)
61 {
62         g_return_if_fail (dev != NULL);
63
64         nm_system_device_flush_ip4_routes_with_iface (nm_device_get_iface (dev));
65 }
66
67 /*
68  * nm_generic_device_flush_ip4_routes_with_iface
69  *
70  * Flush all routes associated with a network device
71  *
72  */
73 void nm_generic_device_flush_ip4_routes_with_iface (const char *iface)
74 {
75         char    *buf;
76
77         g_return_if_fail (iface != NULL);
78
79         /* Remove routing table entries */
80         buf = g_strdup_printf (IP_BINARY_PATH" -4 route flush dev %s", iface);
81         nm_spawn_process (buf);
82         g_free (buf);
83 }
84
85 /*
86  * nm_generic_device_flush_ip4_addresses
87  *
88  * Flush all network addresses associated with a network device
89  *
90  */
91 void nm_generic_device_flush_ip4_addresses (NMDevice *dev)
92 {
93         g_return_if_fail (dev != NULL);
94
95         nm_system_device_flush_ip4_addresses_with_iface (nm_device_get_iface (dev));
96 }
97
98
99 /*
100  * nm_generic_device_flush_ip4_addresses_with_iface
101  *
102  * Flush all network addresses associated with a network device
103  *
104  */
105 void nm_generic_device_flush_ip4_addresses_with_iface (const char *iface)
106 {
107         char    *buf;
108
109         g_return_if_fail (iface != NULL);
110
111         /* Remove all IP addresses for a device */
112         buf = g_strdup_printf (IP_BINARY_PATH" -4 addr flush dev %s", iface);
113         nm_spawn_process (buf);
114         g_free (buf);
115 }
116
117 /*
118  * nm_generic_enable_loopback
119  *
120  * Bring up the loopback interface
121  *
122  */
123 void nm_generic_enable_loopback (void)
124 {
125         nm_spawn_process (IP_BINARY_PATH" link set dev lo up");
126         nm_spawn_process (IP_BINARY_PATH" addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label lo");
127 }
128
129
130 /*
131  * nm_generic_flush_loopback_routes
132  *
133  * Flush all routes associated with the loopback device, because it
134  * sometimes gets the first route for ZeroConf/Link-Local traffic.
135  *
136  */
137 void nm_generic_flush_loopback_routes (void)
138 {
139         nm_system_device_flush_ip4_routes_with_iface ("lo");
140 }
141
142
143 /*
144  * nm_generic_flush_arp_cache
145  *
146  * Flush all entries in the arp cache.
147  *
148  */
149 void nm_generic_flush_arp_cache (void)
150 {
151         nm_spawn_process (IP_BINARY_PATH" neigh flush all");
152 }
153
154
155 /*
156  * nm_generic_kill_all_dhcp_daemons
157  *
158  * Kill all DHCP daemons currently running, done at startup.
159  *
160  */
161 void nm_generic_kill_all_dhcp_daemons (void)
162 {
163 }
164
165
166 /*
167  * nm_generic_update_dns
168  *
169  * Make glibc/nscd aware of any changes to the resolv.conf file by
170  * restarting nscd.
171  *
172  */
173 void nm_generic_update_dns (void)
174 {
175 }
176
177 /*
178  * nm_generic_set_ip4_config_from_resolv_conf
179  *
180  * Add nameservers and search names from a resolv.conf format file.
181  *
182  */
183 void nm_generic_set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
184 {
185         char *  contents = NULL;
186         char ** split_contents = NULL;
187         int             i, len;
188
189         g_return_if_fail (filename != NULL);
190         g_return_if_fail (ip4_config != NULL);
191
192         if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
193                 return;
194
195         if (!(split_contents = g_strsplit (contents, "\n", 0)))
196                 goto out;
197         
198         len = g_strv_length (split_contents);
199         for (i = 0; i < len; i++)
200         {
201                 char *line = split_contents[i];
202
203                 /* Ignore comments */
204                 if (!line || (line[0] == ';') || (line[0] == '#'))
205                         continue;
206
207                 line = g_strstrip (line);
208                 if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
209                 {
210                         char *searches = g_strdup (line + 7);
211                         char **split_searches = NULL;
212
213                         if (!searches || !strlen (searches))
214                                 continue;
215
216                         /* Allow space-separated search domains */
217                         if ((split_searches = g_strsplit (searches, " ", 0)))
218                         {
219                                 int m, srch_len;
220
221                                 srch_len = g_strv_length (split_searches);
222                                 for (m = 0; m < srch_len; m++)
223                                 {
224                                         if (split_searches[m])
225                                                 nm_ip4_config_add_domain        (ip4_config, split_searches[m]);
226                                 }
227                                 g_strfreev (split_searches);
228                         }
229                         else
230                         {
231                                 /* Only 1 item, add the whole line */
232                                 nm_ip4_config_add_domain        (ip4_config, searches);
233                         }
234
235                         g_free (searches);
236                 }
237                 else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
238                 {
239                         guint32 addr = (guint32) (inet_addr (line + 11));
240
241                         if (addr != (guint32) -1)
242                                 nm_ip4_config_add_nameserver (ip4_config, addr);
243                 }
244         }
245
246         g_strfreev (split_contents);
247
248 out:
249         g_free (contents);
250 }
251
252
253 /*
254  * nm_generic_device_get_system_config
255  *
256  * Retrieve any relevant configuration info for a particular device
257  * from the system network configuration information.  Clear out existing
258  * info before setting stuff too.
259  *
260  */
261 void* nm_generic_device_get_system_config (NMDevice *dev)
262 {
263         return NULL;
264 }
265
266 /*
267  * nm_generic_device_free_system_config
268  *
269  * Free stored system config data
270  *
271  */
272 void nm_generic_device_free_system_config (NMDevice *dev, void *system_config_data)
273 {
274         return;
275 }
276
277
278 /*
279  * nm_generic_device_get_disabled
280  *
281  * Return whether the distro-specific system config tells us to use
282  * dhcp for this device.
283  *
284  */
285 gboolean nm_generic_device_get_disabled (NMDevice *dev)
286 {
287         return FALSE;
288 }
289
290
291 NMIP4Config *nm_generic_device_new_ip4_system_config (NMDevice *dev)
292 {
293         return NULL;
294 }
295
296 /*
297  * nm_generic_activate_nis
298  *
299  * set up the nis domain and write a yp.conf
300  *
301  */
302 void nm_generic_activate_nis (NMIP4Config *config)
303 {
304 }
305
306 /*
307  * nm_generic_shutdown_nis
308  *
309  * shutdown ypbind
310  *
311  */
312 void nm_generic_shutdown_nis (void)
313 {
314 }
315
316 /*
317  * nm_generic_set_hostname
318  *
319  * set the hostname
320  *
321  */
322 void nm_generic_set_hostname (NMIP4Config *config)
323 {
324 }
325
326 /*
327  * nm_generic_should_modify_resolv_conf
328  *
329  * Can NM update resolv.conf, or is it locked down?
330  */
331 gboolean nm_generic_should_modify_resolv_conf (void)
332 {
333         return TRUE;
334 }
335