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