2008-11-03 04:13:42 +00:00
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2004-06-24 14:18:37 +00:00
/* NetworkManager -- Network link manager
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
2008-06-26 18:31:52 +00:00
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA .
2004-06-24 14:18:37 +00:00
*
2011-10-03 15:54:25 +02:00
* Copyright ( C ) 2004 - 2011 Red Hat , Inc .
2008-11-03 04:13:42 +00:00
* Copyright ( C ) 2005 - 2008 Novell , Inc .
2004-06-24 14:18:37 +00:00
*/
2010-08-11 15:40:25 -05:00
# include <config.h>
2004-06-24 14:18:37 +00:00
# include <glib.h>
2004-07-27 16:15:36 +00:00
# include <dbus/dbus.h>
2004-08-02 21:12:40 +00:00
# include <dbus/dbus-glib-lowlevel.h>
2004-06-24 14:18:37 +00:00
# include <dbus/dbus-glib.h>
# include <getopt.h>
# include <errno.h>
# include <stdlib.h>
2004-12-21 06:49:21 +00:00
# include <signal.h>
2004-06-24 14:18:37 +00:00
# include <unistd.h>
# include <fcntl.h>
# include <sys/stat.h>
2004-10-15 15:59:25 +00:00
# include <sys/types.h>
2006-05-24 15:53:07 +00:00
# include <glib/gi18n.h>
2009-06-11 00:39:12 -04:00
# include <gmodule.h>
2008-03-14 21:11:04 +00:00
# include <string.h>
2004-06-24 14:18:37 +00:00
# include "NetworkManager.h"
# include "NetworkManagerUtils.h"
2007-02-08 15:34:26 +00:00
# include "nm-manager.h"
2010-03-02 15:06:14 -08:00
# include "nm-policy.h"
# include "nm-system.h"
2010-09-07 21:50:20 -05:00
# include "nm-dns-manager.h"
2006-10-13 19:41:47 +00:00
# include "nm-dbus-manager.h"
2006-11-25 15:41:04 +00:00
# include "nm-supplicant-manager.h"
2008-10-21 11:07:42 +00:00
# include "nm-dhcp-manager.h"
2009-03-16 14:31:28 +02:00
# include "nm-hostname-provider.h"
2005-03-11 20:12:57 +00:00
# include "nm-netlink-monitor.h"
2007-09-12 16:23:53 +00:00
# include "nm-vpn-manager.h"
2006-02-27 04:31:52 +00:00
# include "nm-logging.h"
2010-12-17 09:22:11 -06:00
# include "nm-policy-hosts.h"
2011-09-22 10:16:07 -05:00
# include "nm-config.h"
2004-06-24 14:18:37 +00:00
2010-04-23 12:12:47 -07:00
# if !defined(NM_DIST_VERSION)
# define NM_DIST_VERSION VERSION
# endif
2010-03-01 12:09:16 -08:00
# define NM_DEFAULT_PID_FILE LOCALSTATEDIR" / run / NetworkManager.pid"
# define NM_DEFAULT_SYSTEM_STATE_FILE LOCALSTATEDIR" / lib / NetworkManager / NetworkManager.state"
2006-02-27 20:06:24 +00:00
2004-06-24 14:18:37 +00:00
/*
* Globals
*/
2007-02-08 15:34:26 +00:00
static NMManager * manager = NULL ;
2007-02-19 13:09:32 +00:00
static GMainLoop * main_loop = NULL ;
2011-04-08 14:36:14 -05:00
static int quit_pipe [ 2 ] = { - 1 , - 1 } ;
2004-06-24 14:18:37 +00:00
2008-11-25 18:30:44 +00:00
typedef struct {
time_t time ;
GQuark domain ;
guint32 code ;
guint32 count ;
} MonitorInfo ;
static gboolean
detach_monitor ( gpointer data )
{
2010-04-06 15:48:31 -07:00
nm_log_warn ( LOGD_HW , " detaching netlink event monitor " ) ;
2008-11-25 18:30:44 +00:00
nm_netlink_monitor_detach ( NM_NETLINK_MONITOR ( data ) ) ;
return FALSE ;
}
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
static void
2007-02-19 13:09:32 +00:00
nm_error_monitoring_device_link_state ( NMNetlinkMonitor * monitor ,
GError * error ,
gpointer user_data )
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
{
2008-11-25 18:30:44 +00:00
MonitorInfo * info = ( MonitorInfo * ) user_data ;
time_t now ;
now = time ( NULL ) ;
2010-04-06 15:48:31 -07:00
if ( ( info - > domain ! = error - > domain )
| | ( info - > code ! = error - > code )
| | ( info - > time & & now > info - > time + 10 ) ) {
2008-11-25 18:30:44 +00:00
/* FIXME: Try to handle the error instead of just printing it. */
2010-04-06 15:48:31 -07:00
nm_log_warn ( LOGD_HW , " error monitoring device for netlink events: %s \n " , error - > message ) ;
2008-11-25 18:30:44 +00:00
info - > time = now ;
info - > domain = error - > domain ;
info - > code = error - > code ;
info - > count = 0 ;
}
info - > count + + ;
if ( info - > count > 100 ) {
/* Broken drivers will sometimes cause a flood of netlink errors.
* rh # 459205 , novell # 443429 , lp # 284507
*/
2010-04-06 15:48:31 -07:00
nm_log_warn ( LOGD_HW , " excessive netlink errors ocurred, disabling netlink monitor. " ) ;
nm_log_warn ( LOGD_HW , " link change events will not be processed. " ) ;
2008-11-25 18:30:44 +00:00
g_idle_add_full ( G_PRIORITY_HIGH , detach_monitor , monitor , NULL ) ;
}
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
}
2007-02-19 13:09:32 +00:00
static gboolean
2010-04-06 15:48:31 -07:00
nm_monitor_setup ( GError * * error )
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
{
2007-02-19 13:09:32 +00:00
NMNetlinkMonitor * monitor ;
2008-11-25 18:30:44 +00:00
MonitorInfo * info ;
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
2007-02-19 13:09:32 +00:00
monitor = nm_netlink_monitor_get ( ) ;
2010-04-06 15:48:31 -07:00
if ( ! nm_netlink_monitor_open_connection ( monitor , error ) ) {
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
g_object_unref ( monitor ) ;
2007-02-19 13:09:32 +00:00
return FALSE ;
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
}
2008-11-25 18:30:44 +00:00
info = g_new0 ( MonitorInfo , 1 ) ;
g_signal_connect_data ( G_OBJECT ( monitor ) , " error " ,
G_CALLBACK ( nm_error_monitoring_device_link_state ) ,
info ,
( GClosureNotify ) g_free ,
0 ) ;
nm_netlink_monitor_attach ( monitor ) ;
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
/* Request initial status of cards */
nm_netlink_monitor_request_status ( monitor , NULL ) ;
2007-02-19 13:09:32 +00:00
return TRUE ;
2006-03-05 Dan Williams <dcbw@redhat.com>
Process netlink messages in device subclasses rather than in
NetworkManager.c. Also add support for recognizing Wireless Events.
* configure.in
- Find GLIB_GENMARSHAL
* src/Makefile.am
- Since we're marshalling custom types for wireless event signals,
we get to create our own marshallers using GLIB_GENMARSHAL
* src/NetworkManager.c
- (nm_monitor_wired_link_state): renamed to nm_monitor_setup
- (nm_monitor_setup): renamed from nm_monitor_wired_link_state, and
cut down somewhat. We no longer process signals here.
- (nm_data_new): create the netlink monitor here, and remove a
useless call to nm_policy_schedule_device_change_check()
- (nm_data_free): get rid of the netlink monitor here
- (nm_device_link_activated, nm_device_link_deactivated): removed
- (main): don't create the netlink monitor here, let nm_data_new
do that. Call nm_policy_schedule_device_change_check() right
before we jump to the mainloop to figure out which device
to use first
* src/NetworkManagerSystem.[ch]
- (nm_system_get_rtnl_index_from_iface, nm_system_get_iface_from_rtnl_index):
convert back and forth from interface names to interface
indexes
* src/nm-device-802-11-wireless.c
- (real_init): connect to wireless-event signals from the netlink
monitor object
- (nm_device_802_11_wireless_event): new function, schedule handler
for wireless event signals from the netlink monitor object. We
want the handler to run in the device's context
- (wireless_event_helper): handle wireless-event signals from netlink
- (nm_device_802_11_wireless_dispose): disconnect wireless-event
signal handler
* src/nm-device-802-11-wireless.h
- remove unused prototype for nm_device_802_11_wireless_new
* src/nm-device-802-3-ethernet.c
- (real_init): new function; set up signal handlers for link events
- (nm_device_802_3_ethernet_link_activated): new function, schedule
handler for netlink link activated events on device's main loop
- (link_activated_helper): when we get a link activated event, set
the device's link to be active
- (nm_device_802_3_ethernet_link_deactivated): new function; schedule
handler for netlink link deactivated events on device's main loop
- (link_deactivated_helper): when we get a link deactivated event, set
the device's link to be inactive
- (nm_device_802_3_ethernet_dispose): disconnect signal handler on
dispose
* src/nm-device-802-3-ethernet.h
- remove unused prototype for nm_device_802_3_ethernet_new
* src/nm-device.[ch]
- (nm_get_device_by_iface_locked): variant of nm_get_device_by_iface
but locks the device list
- (nm_device_set_active_link): a little bit of cleanup and de-indenting
* src/nm-netlink-monitor.[ch]
- (nm_netlink_monitor_class_install_signals): New signal
"wireless-event"
- (nm_netlink_monitor_new): keep reference to NMData so we can get
at the device list
- (nm_netlink_monitor_event_handler): expand for wireless events too
* src/nm-marshal-main.c
- Include generated nm-marshal.c and nm-marshal.h
* src/nm-marshal.list
- List of custom marshal functions
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@1555 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2006-03-06 01:10:58 +00:00
}
2007-09-25 08:23:07 +00:00
static gboolean quit_early = FALSE ;
2007-02-19 13:09:32 +00:00
static void
nm_signal_handler ( int signo )
{
2011-04-14 16:48:30 -05:00
static int in_fatal = 0 , x ;
2007-02-19 13:09:32 +00:00
/* avoid loops */
if ( in_fatal > 0 )
return ;
+ + in_fatal ;
2011-04-08 14:36:14 -05:00
switch ( signo ) {
case SIGSEGV :
case SIGBUS :
case SIGILL :
case SIGABRT :
nm_log_warn ( LOGD_CORE , " caught signal %d. Generating backtrace... " , signo ) ;
nm_logging_backtrace ( ) ;
exit ( 1 ) ;
break ;
case SIGFPE :
case SIGPIPE :
/* let the fatal signals interrupt us */
- - in_fatal ;
nm_log_warn ( LOGD_CORE , " caught signal %d, shutting down abnormally. Generating backtrace... " , signo ) ;
nm_logging_backtrace ( ) ;
2011-04-14 16:48:30 -05:00
x = write ( quit_pipe [ 1 ] , " X " , 1 ) ;
2011-04-08 14:36:14 -05:00
break ;
case SIGINT :
case SIGTERM :
/* let the fatal signals interrupt us */
- - in_fatal ;
nm_log_info ( LOGD_CORE , " caught signal %d, shutting down normally. " , signo ) ;
quit_early = TRUE ;
2011-04-14 16:48:30 -05:00
x = write ( quit_pipe [ 1 ] , " X " , 1 ) ;
2011-04-08 14:36:14 -05:00
break ;
case SIGHUP :
- - in_fatal ;
/* Reread config stuff like system config files, VPN service files, etc */
break ;
case SIGUSR1 :
- - in_fatal ;
/* Play with log levels or something */
break ;
default :
signal ( signo , nm_signal_handler ) ;
break ;
2007-02-19 13:09:32 +00:00
}
}
2011-04-08 14:36:14 -05:00
static gboolean
quit_watch ( GIOChannel * src , GIOCondition condition , gpointer user_data )
{
if ( condition & G_IO_IN ) {
nm_log_warn ( LOGD_CORE , " quit request received, terminating... " ) ;
g_main_loop_quit ( main_loop ) ;
}
return FALSE ;
}
2007-02-19 13:09:32 +00:00
static void
setup_signals ( void )
{
struct sigaction action ;
sigset_t mask ;
2011-04-08 14:36:14 -05:00
GIOChannel * quit_channel ;
/* Set up our quit pipe */
if ( pipe ( quit_pipe ) < 0 ) {
fprintf ( stderr , " Failed to initialze SIGTERM pipe: %d " , errno ) ;
exit ( 1 ) ;
}
fcntl ( quit_pipe [ 1 ] , F_SETFL , O_NONBLOCK | fcntl ( quit_pipe [ 1 ] , F_GETFL ) ) ;
quit_channel = g_io_channel_unix_new ( quit_pipe [ 0 ] ) ;
g_io_add_watch_full ( quit_channel , G_PRIORITY_HIGH , G_IO_IN | G_IO_ERR , quit_watch , NULL , NULL ) ;
2007-02-19 13:09:32 +00:00
sigemptyset ( & mask ) ;
action . sa_handler = nm_signal_handler ;
action . sa_mask = mask ;
action . sa_flags = 0 ;
sigaction ( SIGTERM , & action , NULL ) ;
2011-02-15 12:24:05 -06:00
sigaction ( SIGINT , & action , NULL ) ;
2007-02-19 13:09:32 +00:00
sigaction ( SIGILL , & action , NULL ) ;
sigaction ( SIGBUS , & action , NULL ) ;
sigaction ( SIGFPE , & action , NULL ) ;
sigaction ( SIGHUP , & action , NULL ) ;
sigaction ( SIGSEGV , & action , NULL ) ;
sigaction ( SIGABRT , & action , NULL ) ;
sigaction ( SIGUSR1 , & action , NULL ) ;
}
2009-11-03 16:07:43 -08:00
static gboolean
2006-02-27 05:50:28 +00:00
write_pidfile ( const char * pidfile )
{
2006-02-27 20:00:25 +00:00
char pid [ 16 ] ;
2006-02-27 05:50:28 +00:00
int fd ;
2009-11-03 16:07:43 -08:00
gboolean success = FALSE ;
2006-02-27 20:00:25 +00:00
2009-11-03 16:07:43 -08:00
if ( ( fd = open ( pidfile , O_CREAT | O_WRONLY | O_TRUNC , 00644 ) ) < 0 ) {
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " Opening %s failed: %s \n " , pidfile , strerror ( errno ) ) ;
2009-11-03 16:07:43 -08:00
return FALSE ;
2006-02-27 20:00:25 +00:00
}
2009-11-03 16:07:43 -08:00
2006-02-27 20:00:25 +00:00
snprintf ( pid , sizeof ( pid ) , " %d " , getpid ( ) ) ;
if ( write ( fd , pid , strlen ( pid ) ) < 0 )
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " Writing to %s failed: %s \n " , pidfile , strerror ( errno ) ) ;
2009-11-03 16:07:43 -08:00
else
success = TRUE ;
2006-02-27 20:00:25 +00:00
if ( close ( fd ) )
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " Closing %s failed: %s \n " , pidfile , strerror ( errno ) ) ;
2009-11-03 16:07:43 -08:00
return success ;
}
/* Check whether the pidfile already exists and contains PID of a running NetworkManager
* Returns : FALSE - specified pidfile doesn ' t exist or doesn ' t contain PID of a running NM process
* TRUE - specified pidfile already exists and contains PID of a running NM process
*/
static gboolean
check_pidfile ( const char * pidfile )
{
char * contents = NULL ;
gsize len = 0 ;
glong pid ;
char * proc_cmdline = NULL ;
gboolean nm_running = FALSE ;
const char * process_name ;
if ( ! g_file_get_contents ( pidfile , & contents , & len , NULL ) )
return FALSE ;
if ( len < = 0 )
goto done ;
errno = 0 ;
pid = strtol ( contents , NULL , 10 ) ;
if ( pid < = 0 | | pid > 65536 | | errno )
goto done ;
g_free ( contents ) ;
proc_cmdline = g_strdup_printf ( " /proc/%ld/cmdline " , pid ) ;
if ( ! g_file_get_contents ( proc_cmdline , & contents , & len , NULL ) )
goto done ;
process_name = strrchr ( contents , ' / ' ) ;
if ( process_name )
process_name + + ;
else
process_name = contents ;
if ( strcmp ( process_name , " NetworkManager " ) = = 0 ) {
/* Check that the process exists */
if ( kill ( pid , 0 ) = = 0 ) {
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " NetworkManager is already running (pid %ld) \n " , pid ) ;
2009-11-03 16:07:43 -08:00
nm_running = TRUE ;
}
}
done :
g_free ( proc_cmdline ) ;
g_free ( contents ) ;
return nm_running ;
2006-02-27 05:50:28 +00:00
}
2009-11-02 17:29:53 -08:00
static gboolean
parse_state_file ( const char * filename ,
gboolean * net_enabled ,
gboolean * wifi_enabled ,
2009-12-22 23:51:08 -08:00
gboolean * wwan_enabled ,
2011-10-03 15:54:25 +02:00
gboolean * wimax_enabled ,
2009-11-02 17:29:53 -08:00
GError * * error )
{
GKeyFile * state_file ;
GError * tmp_error = NULL ;
2009-12-29 11:27:10 +02:00
gboolean wifi , net , wwan , wimax ;
2009-11-02 17:29:53 -08:00
g_return_val_if_fail ( net_enabled ! = NULL , FALSE ) ;
g_return_val_if_fail ( wifi_enabled ! = NULL , FALSE ) ;
2009-12-22 23:51:08 -08:00
g_return_val_if_fail ( wwan_enabled ! = NULL , FALSE ) ;
2009-12-29 11:27:10 +02:00
g_return_val_if_fail ( wimax_enabled ! = NULL , FALSE ) ;
2009-11-02 17:29:53 -08:00
state_file = g_key_file_new ( ) ;
if ( ! state_file ) {
2011-10-01 00:22:09 +02:00
g_set_error ( error , NM_CONFIG_ERROR , NM_CONFIG_ERROR_NO_MEMORY ,
" Not enough memory to load state file %s. " , filename ) ;
2009-11-02 17:29:53 -08:00
return FALSE ;
}
g_key_file_set_list_separator ( state_file , ' , ' ) ;
if ( ! g_key_file_load_from_file ( state_file , filename , G_KEY_FILE_KEEP_COMMENTS , & tmp_error ) ) {
2011-10-01 00:22:09 +02:00
gboolean ret = FALSE ;
2009-11-02 17:29:53 -08:00
/* This is kinda ugly; create the file and directory if it doesn't
* exist yet . We can ' t rely on distros necessarily creating the
* / var / lib / NetworkManager for us since we have to ensure that
* users upgrading NM get this working too .
*/
if ( tmp_error - > domain = = G_FILE_ERROR
& & tmp_error - > code = = G_FILE_ERROR_NOENT ) {
char * data , * dirname ;
gsize len = 0 ;
2011-10-01 00:22:09 +02:00
g_clear_error ( & tmp_error ) ;
2009-11-02 17:29:53 -08:00
/* try to create the directory if it doesn't exist */
dirname = g_path_get_dirname ( filename ) ;
errno = 0 ;
2011-10-01 00:22:09 +02:00
if ( g_mkdir_with_parents ( dirname , 0755 ) ! = 0 ) {
2009-11-02 17:29:53 -08:00
if ( errno ! = EEXIST ) {
g_set_error ( error , G_FILE_ERROR , G_FILE_ERROR_ACCES ,
2011-10-01 00:22:09 +02:00
" Error creating state directory %s: %s " , dirname , strerror ( errno ) ) ;
2009-11-02 17:29:53 -08:00
g_free ( dirname ) ;
return FALSE ;
}
}
g_free ( dirname ) ;
/* Write out the initial state to the state file */
g_key_file_set_boolean ( state_file , " main " , " NetworkingEnabled " , * net_enabled ) ;
g_key_file_set_boolean ( state_file , " main " , " WirelessEnabled " , * wifi_enabled ) ;
2009-12-22 23:51:08 -08:00
g_key_file_set_boolean ( state_file , " main " , " WWANEnabled " , * wwan_enabled ) ;
2009-12-29 11:27:10 +02:00
g_key_file_set_boolean ( state_file , " main " , " WimaxEnabled " , * wimax_enabled ) ;
2009-11-02 17:29:53 -08:00
data = g_key_file_to_data ( state_file , & len , NULL ) ;
if ( data )
ret = g_file_set_contents ( filename , data , len , error ) ;
g_free ( data ) ;
} else {
2011-10-01 00:22:09 +02:00
/* the error is not "No such file or directory" - propagate the error */
g_propagate_error ( error , tmp_error ) ;
2009-11-02 17:29:53 -08:00
}
2011-10-01 00:22:09 +02:00
return ret ;
2009-11-02 17:29:53 -08:00
}
/* Reading state bits of NetworkManager; an error leaves the passed-in state
* value unchanged .
*/
net = g_key_file_get_boolean ( state_file , " main " , " NetworkingEnabled " , & tmp_error ) ;
2011-10-01 00:22:09 +02:00
if ( tmp_error = = NULL )
2009-11-02 17:29:53 -08:00
* net_enabled = net ;
g_clear_error ( & tmp_error ) ;
2009-12-25 14:33:02 -06:00
wifi = g_key_file_get_boolean ( state_file , " main " , " WirelessEnabled " , & tmp_error ) ;
2011-10-01 00:22:09 +02:00
if ( tmp_error = = NULL )
2009-11-02 17:29:53 -08:00
* wifi_enabled = wifi ;
g_clear_error ( & tmp_error ) ;
2009-12-25 14:42:44 -06:00
wwan = g_key_file_get_boolean ( state_file , " main " , " WWANEnabled " , & tmp_error ) ;
2011-10-01 00:22:09 +02:00
if ( tmp_error = = NULL )
2009-12-25 14:42:44 -06:00
* wwan_enabled = wwan ;
g_clear_error ( & tmp_error ) ;
2009-12-29 11:27:10 +02:00
wimax = g_key_file_get_boolean ( state_file , " main " , " WimaxEnabled " , & tmp_error ) ;
2011-10-01 00:22:09 +02:00
if ( tmp_error = = NULL )
2009-12-29 11:27:10 +02:00
* wimax_enabled = wimax ;
g_clear_error ( & tmp_error ) ;
2011-10-03 15:54:25 +02:00
2009-11-02 17:29:53 -08:00
g_key_file_free ( state_file ) ;
return TRUE ;
}
2004-06-24 14:18:37 +00:00
/*
* main
*
*/
2006-10-13 19:41:47 +00:00
int
main ( int argc , char * argv [ ] )
2004-06-24 14:18:37 +00:00
{
2006-10-13 19:41:47 +00:00
GOptionContext * opt_ctx = NULL ;
2009-06-11 00:39:12 -04:00
gboolean become_daemon = FALSE ;
gboolean g_fatal_warnings = FALSE ;
2011-09-22 10:16:07 -05:00
char * pidfile = NULL , * state_file = NULL ;
char * config_path = NULL , * plugins = NULL ;
2010-04-06 15:23:08 -07:00
char * log_level = NULL , * log_domains = NULL ;
2009-12-29 11:27:10 +02:00
gboolean wifi_enabled = TRUE , net_enabled = TRUE , wwan_enabled = TRUE , wimax_enabled = TRUE ;
2011-04-28 16:53:12 -05:00
gboolean success , show_version = FALSE ;
2007-08-28 15:54:55 +00:00
NMPolicy * policy = NULL ;
2007-02-19 13:09:32 +00:00
NMVPNManager * vpn_manager = NULL ;
2010-09-07 21:50:20 -05:00
NMDnsManager * dns_mgr = NULL ;
2008-10-21 11:07:42 +00:00
NMDBusManager * dbus_mgr = NULL ;
NMSupplicantManager * sup_mgr = NULL ;
NMDHCPManager * dhcp_mgr = NULL ;
2010-10-27 20:05:23 -05:00
NMSettings * settings = NULL ;
2011-09-22 10:16:07 -05:00
NMConfig * config ;
2009-06-11 00:39:12 -04:00
GError * error = NULL ;
2009-11-03 16:07:43 -08:00
gboolean wrote_pidfile = FALSE ;
2006-10-13 19:41:47 +00:00
GOptionEntry options [ ] = {
2011-04-28 16:53:12 -05:00
{ " version " , 0 , 0 , G_OPTION_ARG_NONE , & show_version , " Print NetworkManager version and exit " , NULL } ,
2009-06-11 00:39:12 -04:00
{ " no-daemon " , 0 , 0 , G_OPTION_ARG_NONE , & become_daemon , " Don't become a daemon " , NULL } ,
2009-05-20 13:03:39 -04:00
{ " g-fatal-warnings " , 0 , 0 , G_OPTION_ARG_NONE , & g_fatal_warnings , " Make all warnings fatal " , NULL } ,
2010-02-26 15:05:03 +01:00
{ " pid-file " , 0 , 0 , G_OPTION_ARG_FILENAME , & pidfile , " Specify the location of a PID file " , " filename " } ,
2009-11-02 17:29:53 -08:00
{ " state-file " , 0 , 0 , G_OPTION_ARG_FILENAME , & state_file , " State file location " , " /path/to/state.file " } ,
2011-09-22 10:16:07 -05:00
{ " config " , 0 , 0 , G_OPTION_ARG_FILENAME , & config_path , " Config file location " , " /path/to/config.file " } ,
2010-04-06 15:28:33 -07:00
{ " plugins " , 0 , 0 , G_OPTION_ARG_STRING , & plugins , " List of plugins separated by ',' " , " plugin1,plugin2 " } ,
2010-04-06 15:23:08 -07:00
{ " log-level " , 0 , 0 , G_OPTION_ARG_STRING , & log_level , " Log level: one of [ERR, WARN, INFO, DEBUG] " , " INFO " } ,
2010-04-08 09:11:00 -07:00
{ " log-domains " , 0 , 0 , G_OPTION_ARG_STRING , & log_domains ,
2011-04-28 16:53:12 -05:00
" Log domains separated by ',': any combination of \n "
" [NONE,HW,RFKILL,ETHER,WIFI,BT,MB,DHCP4,DHCP6,PPP, \n "
" WIFI_SCAN,IP4,IP6,AUTOIP4,DNS,VPN,SHARING,SUPPLICANT, \n "
" AGENTS,SETTINGS,SUSPEND,CORE,DEVICE,OLPC,WIMAX] " ,
2010-04-06 15:23:08 -07:00
" HW,RFKILL,WIFI " } ,
2006-10-13 19:41:47 +00:00
{ NULL }
} ;
2009-06-11 00:39:12 -04:00
if ( ! g_module_supported ( ) ) {
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " GModules are not supported on your platform! \n " ) ;
2009-06-11 00:39:12 -04:00
exit ( 1 ) ;
}
2008-03-12 19:44:26 +00:00
bindtextdomain ( GETTEXT_PACKAGE , NMLOCALEDIR ) ;
2006-05-24 14:16:48 +00:00
bind_textdomain_codeset ( GETTEXT_PACKAGE , " UTF-8 " ) ;
textdomain ( GETTEXT_PACKAGE ) ;
2004-06-24 14:18:37 +00:00
/* Parse options */
2007-10-08 18:38:34 +00:00
opt_ctx = g_option_context_new ( " " ) ;
g_option_context_set_translation_domain ( opt_ctx , " UTF-8 " ) ;
g_option_context_set_ignore_unknown_options ( opt_ctx , FALSE ) ;
g_option_context_set_help_enabled ( opt_ctx , TRUE ) ;
g_option_context_add_main_entries ( opt_ctx , options , NULL ) ;
g_option_context_set_summary ( opt_ctx ,
" NetworkManager monitors all network connections and automatically \n chooses the best connection to use. It also allows the user to \n specify wireless access points which wireless cards in the computer \n should associate with. " ) ;
success = g_option_context_parse ( opt_ctx , & argc , & argv , NULL ) ;
g_option_context_free ( opt_ctx ) ;
if ( ! success ) {
fprintf ( stderr , _ ( " Invalid option. Please use --help to see a list of valid options. \n " ) ) ;
exit ( 1 ) ;
2006-05-28 03:30:44 +00:00
}
2004-06-24 14:18:37 +00:00
2011-04-28 16:53:12 -05:00
if ( show_version ) {
fprintf ( stdout , NM_DIST_VERSION " \n " ) ;
exit ( 0 ) ;
}
if ( getuid ( ) ! = 0 ) {
fprintf ( stderr , " You must be root to run NetworkManager! \n " ) ;
exit ( 1 ) ;
}
2010-05-13 10:52:07 -07:00
/* Make GIO ignore the remote VFS service; otherwise it tries to use the
* session bus to contact the remote service , and NM shouldn ' t ever be
* talking on the session bus . See rh # 588745
*/
setenv ( " GIO_USE_VFS " , " local " , 1 ) ;
2010-02-26 15:05:03 +01:00
pidfile = pidfile ? pidfile : g_strdup ( NM_DEFAULT_PID_FILE ) ;
state_file = state_file ? state_file : g_strdup ( NM_DEFAULT_SYSTEM_STATE_FILE ) ;
2009-11-03 16:07:43 -08:00
/* check pid file */
if ( check_pidfile ( pidfile ) )
exit ( 1 ) ;
2011-09-22 10:16:07 -05:00
/* Read the config file and CLI overrides */
config = nm_config_new ( config_path , plugins , log_level , log_domains , & error ) ;
if ( config = = NULL ) {
fprintf ( stderr , " Failed to read configuration: (%d) %s \n " ,
error ? error - > code : - 1 ,
( error & & error - > message ) ? error - > message : " unknown " ) ;
exit ( 1 ) ;
2009-06-11 00:39:12 -04:00
}
2011-09-22 10:16:07 -05:00
2010-04-06 15:57:24 -07:00
/* Logging setup */
2011-09-22 10:16:07 -05:00
if ( ! nm_logging_setup ( nm_config_get_log_level ( config ) ,
nm_config_get_log_domains ( config ) ,
2010-04-06 15:57:24 -07:00
& error ) ) {
fprintf ( stderr ,
_ ( " %s. Please use --help to see a list of valid options. \n " ) ,
error - > message ) ;
exit ( 1 ) ;
}
2009-11-02 17:29:53 -08:00
/* Parse the state file */
2009-12-29 11:27:10 +02:00
if ( ! parse_state_file ( state_file , & net_enabled , & wifi_enabled , & wwan_enabled , & wimax_enabled , & error ) ) {
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " State file %s parsing failed: (%d) %s \n " ,
2010-04-06 15:27:35 -07:00
state_file ,
error ? error - > code : - 1 ,
( error & & error - > message ) ? error - > message : " unknown " ) ;
2009-11-02 17:29:53 -08:00
/* Not a hard failure */
}
2010-03-23 14:12:32 -07:00
g_clear_error ( & error ) ;
2009-11-02 17:29:53 -08:00
2006-10-13 19:41:47 +00:00
/* Tricky: become_daemon is FALSE by default, so unless it's TRUE because
* of a CLI option , it ' ll become TRUE after this
*/
become_daemon = ! become_daemon ;
if ( become_daemon ) {
if ( daemon ( 0 , 0 ) < 0 ) {
2006-02-27 20:06:24 +00:00
int saved_errno ;
2005-03-14 Ray Strode <rstrode@redhat.com>
Fourth (probably working) cut at porting to
dbus 0.30 api and new hal. This cut adds
some new logging macros to make debugging
easier.
* dispatcher-daemon/NetworkManagerDispatcher.c:
* info-daemon/NetworkmanagerInfo.c:
* info-daemon/NetworkManagerInfoPassphraseDialog.c:
* info-daemon/NetworkManagerInfoVPN.c:
* src/NetworkManager.c:
* src/NetworkManagerAP.c:
* src/NetworkManagerAPList.c:
* src/NetworkManagerDHCP.c:
* src/NetworkManagerDbus.c:
* src/NetworkManagerDevice.c:
* src/NetworkManagerPolicy.c:
* src/NetworkManagerSystem.c:
* src/NetworkManagerUtils.c:
* src/NetworkManagerWireless.c:
* src/autoip.c:
* src/nm-dbus-nm.c:
* src/backends/NetworkManagerDebian.c:
* src/backends/NetworkManagerGentoo.c:
* src/backends/NetworkManagerRedHat.c:
* src/backends/NetworkManagerSlackware.c:
use new logging macros.
* dispatcher-daemon/NetworkManagerDispatcher.c:
(nmd_dbus_filter): s/dbus_free/g_free/
* info-daemon/Makefile.am: link in utils library.
* info-daemon/NetworkmanagerInfo.c: use new logging
macros.
(nmi_dbus_get_network): don't assume enumerations
are 32-bit.
(nmi_dbus_nmi_message_handler): don't free what
doesn't belong to us.
* libnm_glib/libnm_glib.c:
(libnm_glib_get_nm_status):
(libnm_glib_init): don't free what doesn't
belong to us.
(libnm_glib_dbus): strdup result, so it doesn't get
lost when message is unref'd.
* panel-applet/NMWirelessAppletDbus.c:
(nmwa_dbus_update_devices): s/dbus_free/g_free/
* src/NetworkManager.c:
(nm_monitor_wired_link_state): request initial status
dump of all cards when we start up, instead of relying
on /sys/.../carrier.
(nm_info_handler), (nm_set_up_log_handlers):
log handlers to specify what syslog priorites
the logging macros default to.
* src/NetworkManagerAPList.c:
(nm_ap_list_populate_from_nmi):
s/dbus_free_string_array/g_strfreev/
* src/NetworkManagerDbus.c:
(nm_dbus_get_network_object):
validate d-bus message argument types.
Advance message iterator after reading argument,
prepend instead of append to GSList.
* src/NetworkManagerDevice.c:
(nm_device_probe_wired_link_status):
remove redundant /sys in /sys path. remove wrong
contents == NULL means has carrier assumption.
* src/nm-netlink-monitor.c
(nm_netlink_monitor_request_status): implement
function to ask kernel to dump interface link
status over netlink socket.
* test/*.c: s/dbus_free/g_free/
* utils/nm-utils.h:
(nm_print_backtrace): new macro to print backtrace.
(nm_get_timestamp): new macro to get sub-second precise
unix timestamp.
(nm_info), (nm_debug), (nm_warning), (nm_error):
new logging functions. nm_info just prints,
nm_debug includes timestamp and function,
nm_warning includes function, nm_error includes
backtrace and sigtrap.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@497 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2005-03-15 05:30:15 +00:00
2006-02-27 20:06:24 +00:00
saved_errno = errno ;
2010-04-06 15:48:31 -07:00
fprintf ( stderr , " Could not daemonize: %s [error %u] \n " ,
2010-04-06 15:27:35 -07:00
g_strerror ( saved_errno ) ,
saved_errno ) ;
2007-10-08 18:38:34 +00:00
exit ( 1 ) ;
2006-02-27 20:06:24 +00:00
}
2009-11-03 16:07:43 -08:00
if ( write_pidfile ( pidfile ) )
wrote_pidfile = TRUE ;
2005-01-22 04:26:48 +00:00
}
2009-05-20 13:03:39 -04:00
if ( g_fatal_warnings ) {
GLogLevelFlags fatal_mask ;
fatal_mask = g_log_set_always_fatal ( G_LOG_FATAL_MASK ) ;
fatal_mask | = G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL ;
g_log_set_always_fatal ( fatal_mask ) ;
}
2006-05-05 19:42:20 +00:00
/*
* Set the umask to 0022 , which results in 0666 & ~ 0022 = 0644.
* Otherwise , if root ( or an su ' ing user ) has a wacky umask , we could
* write out an unreadable resolv . conf .
*/
umask ( 022 ) ;
2004-06-24 14:18:37 +00:00
g_type_init ( ) ;
2011-10-31 11:50:28 +01:00
/*
* Threading is always enabled starting from GLib 2.31 .0 .
* See also http : //developer.gnome.org/glib/2.31/glib-Deprecated-Thread-APIs.html.
*/
# if !GLIB_CHECK_VERSION (2,31,0)
2004-06-24 14:18:37 +00:00
if ( ! g_thread_supported ( ) )
g_thread_init ( NULL ) ;
2005-01-29 23:34:31 +00:00
dbus_g_thread_init ( ) ;
2011-10-31 11:50:28 +01:00
# else
dbus_threads_init_default ( ) ;
# endif
2007-02-19 13:09:32 +00:00
2010-08-11 15:40:25 -05:00
# ifndef HAVE_DBUS_GLIB_DISABLE_LEGACY_PROP_ACCESS
# error HAVE_DBUS_GLIB_DISABLE_LEGACY_PROP_ACCESS not defined
# endif
# if HAVE_DBUS_GLIB_DISABLE_LEGACY_PROP_ACCESS
/* Ensure that non-exported properties don't leak out, and that the
* introspection ' access ' permissions are respected .
*/
dbus_glib_global_set_disable_legacy_property_access ( ) ;
# endif
2007-02-19 13:09:32 +00:00
setup_signals ( ) ;
2010-04-06 15:23:08 -07:00
nm_logging_start ( become_daemon ) ;
2009-02-15 10:14:34 -05:00
2010-04-23 12:12:47 -07:00
nm_log_info ( LOGD_CORE , " NetworkManager (version " NM_DIST_VERSION " ) is starting... " ) ;
2009-02-15 10:14:34 -05:00
success = FALSE ;
2004-08-23 19:20:49 +00:00
2011-09-22 10:16:07 -05:00
nm_log_info ( LOGD_CORE , " Read config file %s " , nm_config_get_path ( config ) ) ;
2010-07-21 16:47:31 -07:00
2007-02-19 13:09:32 +00:00
main_loop = g_main_loop_new ( NULL , FALSE ) ;
2004-08-25 20:52:19 +00:00
2007-02-19 13:09:32 +00:00
/* Create watch functions that monitor cards for link status. */
2010-04-06 15:48:31 -07:00
if ( ! nm_monitor_setup ( & error ) ) {
nm_log_err ( LOGD_CORE , " failed to start monitoring devices: %s. " ,
error & & error - > message ? error - > message : " (unknown) " ) ;
2007-02-19 13:09:32 +00:00
goto done ;
2010-04-06 15:48:31 -07:00
}
2007-02-19 13:09:32 +00:00
2006-10-13 19:41:47 +00:00
/* Initialize our DBus service & connection */
2007-01-04 12:06:26 +00:00
dbus_mgr = nm_dbus_manager_get ( ) ;
2007-02-19 13:09:32 +00:00
2008-03-26 13:43:01 +00:00
vpn_manager = nm_vpn_manager_get ( ) ;
if ( ! vpn_manager ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to start the VPN manager. " ) ;
2008-03-26 13:43:01 +00:00
goto done ;
}
2011-09-22 10:16:07 -05:00
dns_mgr = nm_dns_manager_get ( nm_config_get_dns_plugins ( config ) ) ;
2010-09-07 21:50:20 -05:00
if ( ! dns_mgr ) {
nm_log_err ( LOGD_CORE , " failed to start the DNS manager. " ) ;
2009-06-11 00:39:12 -04:00
goto done ;
}
2011-09-22 10:16:07 -05:00
settings = nm_settings_new ( nm_config_get_path ( config ) ,
nm_config_get_plugins ( config ) ,
& error ) ;
2010-10-27 15:47:10 -05:00
if ( ! settings ) {
2011-02-14 17:18:13 +01:00
nm_log_err ( LOGD_CORE , " failed to initialize settings storage: %s " ,
error & & error - > message ? error - > message : " (unknown) " ) ;
2010-10-27 15:47:10 -05:00
goto done ;
}
2011-09-26 11:30:24 -05:00
manager = nm_manager_new ( settings ,
2009-12-22 23:51:08 -08:00
state_file ,
net_enabled ,
wifi_enabled ,
wwan_enabled ,
2011-02-14 17:18:13 +01:00
wimax_enabled ,
2009-12-22 23:51:08 -08:00
& error ) ;
2007-08-28 15:54:55 +00:00
if ( manager = = NULL ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to initialize the network manager: %s " ,
2011-02-14 17:18:13 +01:00
error & & error - > message ? error - > message : " (unknown) " ) ;
2007-08-28 15:54:55 +00:00
goto done ;
}
2010-10-27 15:47:10 -05:00
policy = nm_policy_new ( manager , vpn_manager , settings ) ;
2007-08-28 15:54:55 +00:00
if ( policy = = NULL ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to initialize the policy. " ) ;
2007-08-28 15:54:55 +00:00
goto done ;
}
2007-03-02 Tambet Ingo <tambet@ximian.com>
* libnm-glib/nm-device-802-11-wireless.c: Cache networks (bssids) list.
We get signalled when it changes.
* libnm-glib/nm-client.c: Cache NMState and device list, we get signalled
when it changes.
* libnm-glib/nm-device.c: Cache the device state property.
* libnm-glib/nm-access-point.c: Cache the strength property.
* src/nm-device-802-11-wireless.c: Fix wireless device scanning scheduler.
The new algorithm is to start from SCAN_INTERVAL_MIN (currently defined as 0)
and add a SCAN_INTERVAL_STEP (currently 20 seconds) with each successful scan
until SCAN_INTERVAL_MAX (currently 120 seconds) is reached. Do not scan while
the device is down, activating, or activated (in case of A/B/G cards).
Remove some old dead ifdef'ed out code that used to configure wireless devices,
it's all done through supplicant now.
* src/supplicant-manager/nm-supplicant-interface.c: Fix the reference
counting issues with pending calls which caused leaks and crashes when
interface was removed (now that the interface actually gets removed).
* src/nm-call-store.c: Make a copy of data before running a foreach
with user callback on it - The most common usage pattern is to cancel
(and thus remove) all pending calls with foreach which would modify
the hash table we're iterating over.
* src/nm-manager.c: When a device is added, make sure it is "up". When
it's removed or disabled due to disabling wireless or networking, bring
it down.
* include/NetworkManager.h: Add new device state NM_DEVICE_STATE_DOWN.
* src/nm-device-802-11-wireless.c:
* src/nm-device-802-3-ethernet.c:
* src/nm-device.c:
- Remove "init" virtual function, all gobjects have a place for that
already (constructor).
- Replace "start" virtual function with "bring_up", devices can be
brought up and down more than just on startup now.
- Add "is_up" virtual function.
- Implement one way to bring a device down instead of previous 4 different
ways, each of witch did something different.
* src/NetworkManagerUtils.c (nm_dev_sock_open): This doesn't need an NMDevice,
all it needs is the device interface.
Get rid of NMData.dev_list (3 members to go).
Get rif of NMData in a lot of places.
* gnome/libnm_glib/libnm_glib.c: Make it compile again.
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@2395 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2007-03-02 09:30:48 +00:00
2006-11-25 15:41:04 +00:00
/* Initialize the supplicant manager */
sup_mgr = nm_supplicant_manager_get ( ) ;
if ( ! sup_mgr ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to initialize the supplicant manager. " ) ;
2006-11-25 15:41:04 +00:00
goto done ;
}
2010-03-06 00:07:06 -08:00
/* Initialize DHCP manager */
2011-09-22 10:16:07 -05:00
dhcp_mgr = nm_dhcp_manager_new ( nm_config_get_dhcp_client ( config ) , & error ) ;
2008-10-21 11:07:42 +00:00
if ( ! dhcp_mgr ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to start the DHCP manager: %s. " , error - > message ) ;
2008-10-21 11:07:42 +00:00
goto done ;
}
2009-03-16 14:31:28 +02:00
nm_dhcp_manager_set_hostname_provider ( dhcp_mgr , NM_HOSTNAME_PROVIDER ( manager ) ) ;
2006-10-13 19:41:47 +00:00
/* Start our DBus service */
if ( ! nm_dbus_manager_start_service ( dbus_mgr ) ) {
2010-04-06 15:48:31 -07:00
nm_log_err ( LOGD_CORE , " failed to start the dbus service. " ) ;
2006-10-13 19:41:47 +00:00
goto done ;
}
2004-12-05 21:28:42 +00:00
2010-12-17 09:22:11 -06:00
/* Clean leftover "# Added by NetworkManager" entries from /etc/hosts */
nm_policy_hosts_clean_etc_hosts ( ) ;
2009-06-11 00:39:12 -04:00
nm_manager_start ( manager ) ;
2004-08-16 19:46:43 +00:00
/* Bring up the loopback interface. */
2004-08-24 00:31:47 +00:00
nm_system_enable_loopback ( ) ;
2004-08-16 19:46:43 +00:00
2009-02-15 10:14:34 -05:00
success = TRUE ;
2007-09-25 08:23:07 +00:00
/* Told to quit before getting to the mainloop by the signal handler */
if ( quit_early = = TRUE )
goto done ;
2007-02-19 13:09:32 +00:00
g_main_loop_run ( main_loop ) ;
2004-08-23 19:20:49 +00:00
2006-10-13 19:41:47 +00:00
done :
2007-08-30 21:54:56 +00:00
if ( policy )
nm_policy_destroy ( policy ) ;
2007-02-08 15:34:26 +00:00
if ( manager )
g_object_unref ( manager ) ;
2010-10-27 15:47:10 -05:00
if ( settings )
g_object_unref ( settings ) ;
2008-03-26 13:43:01 +00:00
if ( vpn_manager )
g_object_unref ( vpn_manager ) ;
2010-09-07 21:50:20 -05:00
if ( dns_mgr )
g_object_unref ( dns_mgr ) ;
2008-10-10 Dan Williams <dcbw@redhat.com>
Rework default route handling to consolidate decisions in the policy,
and to take active VPN connections into account when changing the default
route (bgo #545912)
* src/NetworkManager.c
- (main): pass the vpn_manager to the policy so it knows about active
VPN connections; clean up the named manager which wasn't done before
* src/NetworkManagerPolicy.c
src/NetworkManagerPolicy.h
- (nm_policy_new): get a clue about the vpn_manager
- (update_default_route): remove, fold into update_routing_and_dns()
- (update_routing_and_dns): handle active VPN connections too; an
active VPN connection becomes the default route if it does not have
server-specified or user-specified custom routes. Otherwise, the
best active device gets the default route
- (vpn_connection_activated, vpn_connection_deactivated, nm_policy_new,
nm_policy_destroy): track VPN connection activation and deactivation
and update the default route when appropriate
* src/NetworkManagerSystem.c
src/NetworkManagerSystem.h
- (nm_system_vpn_device_unset_from_ip4_config): remove, put functionality
in the VPN connection itself
- (nm_system_vpn_device_set_from_ip4_config,
nm_system_device_set_from_ip4_config): merge together to make
nm_system_apply_ip4_config()
- (add_vpn_gateway_route): add a route to the VPN's external gateway
via the parent device
- (nm_system_apply_ip4_config): simplify
- (add_ip4_route_to_gateway): new function; add a direct route to the
gateway if needed
- (nm_system_device_replace_default_ip4_route): simplify, break gateway
route stuff out into add_ip4_route_to_gateway() for clarity
* src/nm-device.c
- (nm_device_set_ip4_config): update for nm_system_apply_ip4_config()
* src/vpn-manager/nm-vpn-connection.c
src/vpn-manager/nm-vpn-connection.h
- (nm_vpn_connection_get_ip4_config, nm_vpn_connection_get_ip_iface,
nm_vpn_connection_get_parent_device): add
- (nm_vpn_connection_ip4_config_get): make the requirement of a tunnel
device explicit
- (connection_state_changed): update the named manager now that
nm_system_vpn_device_unset_from_ip4_config() is gone; do something
useful on errors
* src/vpn-manager/nm-vpn-manager.c
src/vpn-manager/nm-vpn-manager.h
- Add a 'connection-activated' signal
- (nm_vpn_manager_get_active_connections): new function; mainly for the
policy to find out about active VPN connections
git-svn-id: http://svn-archive.gnome.org/svn/NetworkManager/trunk@4167 4912f4e0-d625-0410-9fb7-b9a5a253dbdc
2008-10-10 23:05:45 +00:00
2008-10-21 11:07:42 +00:00
if ( dhcp_mgr )
g_object_unref ( dhcp_mgr ) ;
2006-11-25 15:41:04 +00:00
if ( sup_mgr )
g_object_unref ( sup_mgr ) ;
2007-10-09 07:51:03 +00:00
if ( dbus_mgr )
g_object_unref ( dbus_mgr ) ;
2006-02-27 04:31:52 +00:00
nm_logging_shutdown ( ) ;
2004-06-24 14:18:37 +00:00
2009-11-03 16:07:43 -08:00
if ( pidfile & & wrote_pidfile )
2006-02-27 05:50:28 +00:00
unlink ( pidfile ) ;
2011-09-22 10:16:07 -05:00
nm_config_free ( config ) ;
2010-02-26 15:05:03 +01:00
/* Free options */
2006-10-13 19:41:47 +00:00
g_free ( pidfile ) ;
2010-02-26 15:05:03 +01:00
g_free ( state_file ) ;
2011-09-22 10:16:07 -05:00
g_free ( config_path ) ;
2010-02-26 15:05:03 +01:00
g_free ( plugins ) ;
2010-04-06 15:57:24 -07:00
g_free ( log_level ) ;
g_free ( log_domains ) ;
2006-02-27 05:50:28 +00:00
2010-04-06 15:48:31 -07:00
nm_log_info ( LOGD_CORE , " exiting (%s) " , success ? " success " : " error " ) ;
2009-02-15 10:14:34 -05:00
exit ( success ? 0 : 1 ) ;
2004-06-24 14:18:37 +00:00
}