core: don't warn on existing loopback interfaces
[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 along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 <errno.h>
29 #include <stdio.h>
30 #include <sys/types.h>
31 #include <signal.h>
32 #include <arpa/inet.h>
33 #include <string.h>
34
35 #include "NetworkManagerGeneric.h"
36 #include "NetworkManagerSystem.h"
37 #include "NetworkManagerUtils.h"
38 #include "nm-netlink.h"
39 #include "nm-utils.h"
40
41 /* Because of a bug in libnl, rtnl.h should be included before route.h */
42 #include <netlink/route/rtnl.h>
43
44 #include <netlink/route/addr.h>
45 #include <netlink/netlink.h>
46
47 /*
48  * nm_generic_enable_loopback
49  *
50  * Bring up the loopback interface
51  *
52  */
53 void nm_generic_enable_loopback (void)
54 {
55         struct nl_handle *      nlh = NULL;
56         struct rtnl_addr *      addr = NULL;
57         struct nl_addr *        nl_addr = NULL;
58         guint32                 binaddr = 0;
59         int                     iface_idx = -1;
60         int                     err;
61
62         nm_system_device_set_up_down_with_iface ("lo", TRUE, NULL);
63
64         nlh = nm_netlink_get_default_handle ();
65         if (!nlh)
66                 return;
67
68         iface_idx = nm_netlink_iface_to_index ("lo");
69         if (iface_idx < 0)
70                 return;
71
72         addr = rtnl_addr_alloc ();
73         if (!addr)
74                 return;
75
76         binaddr = htonl (0x7f000001); /* 127.0.0.1 */
77         nl_addr = nl_addr_build (AF_INET, &binaddr, sizeof(binaddr));
78         if (!nl_addr)
79                 goto out;
80         rtnl_addr_set_local (addr, nl_addr);
81         nl_addr_put (nl_addr);
82
83         binaddr = htonl (0x7fffffff); /* 127.255.255.255 */
84         nl_addr = nl_addr_build (AF_INET, &binaddr, sizeof(binaddr));
85         if (!nl_addr)
86                 goto out;
87         rtnl_addr_set_broadcast (addr, nl_addr);
88         nl_addr_put (nl_addr);
89
90         rtnl_addr_set_prefixlen (addr, 8);
91         rtnl_addr_set_ifindex (addr, iface_idx);
92         rtnl_addr_set_scope (addr, RT_SCOPE_HOST);
93         rtnl_addr_set_label (addr, "lo");
94
95         if ((err = rtnl_addr_add (nlh, addr, 0)) < 0) {
96                 if (err != -EEXIST)
97                         nm_warning ("error %d returned from rtnl_addr_add():\n%s", err, nl_geterror());
98         }
99 out:
100         if (addr)
101                 rtnl_addr_put (addr);
102 }
103
104 /*
105  * nm_generic_update_dns
106  *
107  * Make glibc/nscd aware of any changes to the resolv.conf file by
108  * restarting nscd.
109  *
110  */
111 void nm_generic_update_dns (void)
112 {
113 }
114