2008-05-23 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_enable_loopback
87  *
88  * Bring up the loopback interface
89  *
90  */
91 void nm_generic_enable_loopback (void)
92 {
93         nm_spawn_process (IP_BINARY_PATH" link set dev lo up");
94         nm_spawn_process (IP_BINARY_PATH" addr add 127.0.0.1/8 brd 127.255.255.255 dev lo scope host label lo");
95 }
96
97
98 /*
99  * nm_generic_flush_loopback_routes
100  *
101  * Flush all routes associated with the loopback device, because it
102  * sometimes gets the first route for ZeroConf/Link-Local traffic.
103  *
104  */
105 void nm_generic_flush_loopback_routes (void)
106 {
107         nm_system_device_flush_ip4_routes_with_iface ("lo");
108 }
109
110
111 /*
112  * nm_generic_flush_arp_cache
113  *
114  * Flush all entries in the arp cache.
115  *
116  */
117 void nm_generic_flush_arp_cache (void)
118 {
119         nm_spawn_process (IP_BINARY_PATH" neigh flush all");
120 }
121
122
123 /*
124  * nm_generic_kill_all_dhcp_daemons
125  *
126  * Kill all DHCP daemons currently running, done at startup.
127  *
128  */
129 void nm_generic_kill_all_dhcp_daemons (void)
130 {
131 }
132
133
134 /*
135  * nm_generic_update_dns
136  *
137  * Make glibc/nscd aware of any changes to the resolv.conf file by
138  * restarting nscd.
139  *
140  */
141 void nm_generic_update_dns (void)
142 {
143 }
144
145 /*
146  * nm_generic_set_ip4_config_from_resolv_conf
147  *
148  * Add nameservers and search names from a resolv.conf format file.
149  *
150  */
151 void nm_generic_set_ip4_config_from_resolv_conf (const char *filename, NMIP4Config *ip4_config)
152 {
153         char *  contents = NULL;
154         char ** split_contents = NULL;
155         int             i, len;
156
157         g_return_if_fail (filename != NULL);
158         g_return_if_fail (ip4_config != NULL);
159
160         if (!g_file_get_contents (filename, &contents, NULL, NULL) || (contents == NULL))
161                 return;
162
163         if (!(split_contents = g_strsplit (contents, "\n", 0)))
164                 goto out;
165         
166         len = g_strv_length (split_contents);
167         for (i = 0; i < len; i++)
168         {
169                 char *line = split_contents[i];
170
171                 /* Ignore comments */
172                 if (!line || (line[0] == ';') || (line[0] == '#'))
173                         continue;
174
175                 line = g_strstrip (line);
176                 if ((strncmp (line, "search", 6) == 0) && (strlen (line) > 6))
177                 {
178                         char *searches = g_strdup (line + 7);
179                         char **split_searches = NULL;
180
181                         if (!searches || !strlen (searches))
182                                 continue;
183
184                         /* Allow space-separated search domains */
185                         if ((split_searches = g_strsplit (searches, " ", 0)))
186                         {
187                                 int m, srch_len;
188
189                                 srch_len = g_strv_length (split_searches);
190                                 for (m = 0; m < srch_len; m++)
191                                 {
192                                         if (split_searches[m])
193                                                 nm_ip4_config_add_domain        (ip4_config, split_searches[m]);
194                                 }
195                                 g_strfreev (split_searches);
196                         }
197                         else
198                         {
199                                 /* Only 1 item, add the whole line */
200                                 nm_ip4_config_add_domain        (ip4_config, searches);
201                         }
202
203                         g_free (searches);
204                 }
205                 else if ((strncmp (line, "nameserver", 10) == 0) && (strlen (line) > 10))
206                 {
207                         guint32 addr = (guint32) (inet_addr (line + 11));
208
209                         if (addr != (guint32) -1)
210                                 nm_ip4_config_add_nameserver (ip4_config, addr);
211                 }
212         }
213
214         g_strfreev (split_contents);
215
216 out:
217         g_free (contents);
218 }
219
220
221 /*
222  * nm_generic_device_get_system_config
223  *
224  * Retrieve any relevant configuration info for a particular device
225  * from the system network configuration information.  Clear out existing
226  * info before setting stuff too.
227  *
228  */
229 void* nm_generic_device_get_system_config (NMDevice *dev)
230 {
231         return NULL;
232 }
233
234 /*
235  * nm_generic_device_free_system_config
236  *
237  * Free stored system config data
238  *
239  */
240 void nm_generic_device_free_system_config (NMDevice *dev, void *system_config_data)
241 {
242         return;
243 }
244
245
246 /*
247  * nm_generic_device_get_disabled
248  *
249  * Return whether the distro-specific system config tells us to use
250  * dhcp for this device.
251  *
252  */
253 gboolean nm_generic_device_get_disabled (NMDevice *dev)
254 {
255         return FALSE;
256 }
257
258
259 NMIP4Config *nm_generic_device_new_ip4_system_config (NMDevice *dev)
260 {
261         return NULL;
262 }
263
264 /*
265  * nm_generic_activate_nis
266  *
267  * set up the nis domain and write a yp.conf
268  *
269  */
270 void nm_generic_activate_nis (NMIP4Config *config)
271 {
272 }
273
274 /*
275  * nm_generic_shutdown_nis
276  *
277  * shutdown ypbind
278  *
279  */
280 void nm_generic_shutdown_nis (void)
281 {
282 }
283
284 /*
285  * nm_generic_set_hostname
286  *
287  * set the hostname
288  *
289  */
290 void nm_generic_set_hostname (NMIP4Config *config)
291 {
292 }
293
294 /*
295  * nm_generic_should_modify_resolv_conf
296  *
297  * Can NM update resolv.conf, or is it locked down?
298  */
299 gboolean nm_generic_should_modify_resolv_conf (void)
300 {
301         return TRUE;
302 }
303