diff --git a/Makefile.am b/Makefile.am index e207d373f9..1daf7287dd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -989,7 +989,6 @@ src_cppflags = \ \ -DDHCLIENT_PATH=\"$(DHCLIENT_PATH)\" \ -DDHCPCD_PATH=\"$(DHCPCD_PATH)\" \ - -DPPPD_PLUGIN_DIR=\"$(PPPD_PLUGIN_DIR)\" \ \ $(GUDEV_CFLAGS) \ $(LIBNL_CFLAGS) \ @@ -1318,7 +1317,8 @@ src_libNetworkManager_la_SOURCES = \ src/dnsmasq/nm-dnsmasq-utils.c \ src/dnsmasq/nm-dnsmasq-utils.h \ \ - src/ppp/nm-ppp-manager.c \ + src/ppp/nm-ppp-manager-call.c \ + src/ppp/nm-ppp-manager-call.h \ src/ppp/nm-ppp-manager.h \ src/ppp/nm-ppp-status.h \ \ @@ -1566,6 +1566,7 @@ EXTRA_DIST += \ if WITH_PPP pppd_plugin_LTLIBRARIES += src/ppp/nm-pppd-plugin.la +pkglib_LTLIBRARIES += src/ppp/libnm-ppp-plugin.la src_ppp_nm_pppd_plugin_la_CPPFLAGS = \ -I$(srcdir)/shared \ @@ -1589,6 +1590,36 @@ src_ppp_nm_pppd_plugin_la_LIBADD = \ $(GLIB_LIBS) \ $(DL_LIBS) +src_ppp_libnm_ppp_plugin_la_SOURCES = \ + src/ppp/nm-pppd-plugin.h \ + src/ppp/nm-ppp-manager.c \ + src/ppp/nm-ppp-manager.h \ + src/ppp/nm-ppp-plugin-api.h \ + src/ppp/nm-ppp-status.h + +EXTRA_src_ppp_libnm_ppp_plugin_la_DEPENDENCIES = \ + src/ppp/nm-ppp-plugin.ver + +src_ppp_libnm_ppp_plugin_la_CPPFLAGS = \ + -I${top_srcdir}/src \ + -I${top_builddir}/src \ + -I${top_srcdir}/shared \ + -I$(top_builddir)/shared \ + -I${top_builddir}/libnm-core \ + -I${top_srcdir}/libnm-core \ + -DPPPD_PLUGIN_DIR=\"$(PPPD_PLUGIN_DIR)\" \ + -DG_LOG_DOMAIN=\""NetworkManager"\" \ + -DNETWORKMANAGER_COMPILATION=NM_NETWORKMANAGER_COMPILATION_INSIDE_DAEMON \ + $(GLIB_CFLAGS) + +src_ppp_libnm_ppp_plugin_la_LDFLAGS = \ + -module -avoid-version \ + -Wl,--version-script="$(top_srcdir)/src/ppp/nm-ppp-plugin.ver" + +src_ppp_libnm_ppp_plugin_la_LIBADD = \ + introspection/libnmdbus.la \ + $(GLIB_LIBS) + endif ############################################################################### @@ -4067,6 +4098,7 @@ EXTRA_DIST += \ linker-script-binary.ver \ linker-script-devices.ver \ linker-script-settings.ver \ + src/ppp/nm-ppp-plugin.ver \ Makefile.glib \ autogen.sh \ valgrind.suppressions \ diff --git a/libnm-core/nm-errors.h b/libnm-core/nm-errors.h index 2a572f4e35..35f7dc2f34 100644 --- a/libnm-core/nm-errors.h +++ b/libnm-core/nm-errors.h @@ -186,6 +186,8 @@ GQuark nm_device_error_quark (void); * @NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL: Unknown log level in SetLogging * @NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN: Unknown log domain in SetLogging * @NM_MANAGER_ERROR_INVALID_ARGUMENTS: Invalid arguments for D-Bus request + * @NM_MANAGER_ERROR_MISSING_PLUGIN: A plug-in was needed to complete the + * activation but is not available. * * Errors related to the main "network management" interface of NetworkManager. * These may be returned from #NMClient methods that invoke D-Bus operations on @@ -206,6 +208,7 @@ typedef enum { NM_MANAGER_ERROR_UNKNOWN_LOG_LEVEL, /*< nick=UnknownLogLevel >*/ NM_MANAGER_ERROR_UNKNOWN_LOG_DOMAIN, /*< nick=UnknownLogDomain >*/ NM_MANAGER_ERROR_INVALID_ARGUMENTS, /*< nick=InvalidArguments >*/ + NM_MANAGER_ERROR_MISSING_PLUGIN, /*< nick=MissingPlugin >*/ } NMManagerError; GQuark nm_manager_error_quark (void); diff --git a/src/NetworkManager.ver-orig b/src/NetworkManager.ver-orig index 5b62f41b08..b377620c72 100644 --- a/src/NetworkManager.ver-orig +++ b/src/NetworkManager.ver-orig @@ -5,7 +5,6 @@ global: _nm_dbus_error_has_name; _nm_dbus_proxy_call_finish; _nm_dbus_signal_connect_data; - _nm_exported_object_clear_and_unexport; _nm_log_impl; _nm_logging_enabled_state; _nm_platform_error_to_string; @@ -21,6 +20,7 @@ global: nm_act_request_get_secrets; nm_act_request_get_settings_connection; nm_act_request_get_type; + nm_active_connection_clear_secrets; nm_active_connection_get_specific_object; nm_active_connection_get_type; nm_active_connection_set_specific_object; @@ -39,12 +39,14 @@ global: nm_connection_get_id; nm_connection_get_interface_name; nm_connection_get_path; + nm_connection_get_setting; nm_connection_get_setting_802_1x; nm_connection_get_setting_adsl; nm_connection_get_setting_bluetooth; nm_connection_get_setting_bond; nm_connection_get_setting_bridge; nm_connection_get_setting_bridge_port; + nm_connection_get_setting_by_name; nm_connection_get_setting_cdma; nm_connection_get_setting_connection; nm_connection_get_setting_dcb; @@ -144,6 +146,7 @@ global: nm_ip4_config_add_address; nm_ip4_config_add_nameserver; nm_ip4_config_add_route; + nm_ip4_config_add_wins; nm_ip4_config_get_address; nm_ip4_config_get_nameserver; nm_ip4_config_get_num_nameservers; @@ -169,8 +172,14 @@ global: nm_ip_route_get_prefix; nm_ip_route_new; nm_ip_route_unref; + nm_manager_error_quark; nm_manager_get; nm_manager_get_devices; + nm_manager_ppp_create; + nm_manager_ppp_start; + nm_manager_ppp_stop_async; + nm_manager_ppp_stop_finish; + nm_manager_ppp_stop_sync; nm_manager_set_capability; nm_platform_address_flush; nm_platform_get; @@ -198,10 +207,6 @@ global: nm_platform_wifi_indicate_addressing_running; nm_platform_wifi_set_mode; nm_platform_wifi_set_powersave; - nm_ppp_manager_new; - nm_ppp_manager_start; - nm_ppp_manager_stop; - nm_ppp_manager_stop_finish; nm_route_manager_get; nm_route_manager_route_flush; nm_setting_802_1x_add_eap_method; @@ -257,6 +262,7 @@ global: nm_setting_802_1x_set_phase2_private_key; nm_setting_802_1x_set_private_key; nm_setting_adsl_get_encapsulation; + nm_setting_adsl_get_password; nm_setting_adsl_get_protocol; nm_setting_adsl_get_type; nm_setting_adsl_get_username; @@ -286,6 +292,7 @@ global: nm_setting_bridge_port_new; nm_setting_cdma_get_number; nm_setting_cdma_get_password; + nm_setting_cdma_get_type; nm_setting_cdma_get_username; nm_setting_cdma_new; nm_setting_connection_add_permission; @@ -333,6 +340,7 @@ global: nm_setting_dcb_set_priority_group_id; nm_setting_dcb_set_priority_strict_bandwidth; nm_setting_dcb_set_priority_traffic_class; + nm_setting_duplicate; nm_setting_generic_new; nm_setting_get_secret_flags; nm_setting_get_type; @@ -345,6 +353,7 @@ global: nm_setting_gsm_get_pin; nm_setting_gsm_get_sim_id; nm_setting_gsm_get_sim_operator_id; + nm_setting_gsm_get_type; nm_setting_gsm_get_username; nm_setting_infiniband_get_mac_address; nm_setting_infiniband_get_mtu; @@ -397,14 +406,28 @@ global: nm_setting_olpc_mesh_get_dhcp_anycast_address; nm_setting_olpc_mesh_get_ssid; nm_setting_olpc_mesh_new; + nm_setting_ppp_get_baud; + nm_setting_ppp_get_crtscts; + nm_setting_ppp_get_lcp_echo_failure; + nm_setting_ppp_get_lcp_echo_interval; + nm_setting_ppp_get_mppe_stateful; + nm_setting_ppp_get_mru; + nm_setting_ppp_get_mtu; + nm_setting_ppp_get_no_vj_comp; nm_setting_ppp_get_noauth; + nm_setting_ppp_get_nobsdcomp; + nm_setting_ppp_get_nodeflate; nm_setting_ppp_get_refuse_chap; nm_setting_ppp_get_refuse_eap; nm_setting_ppp_get_refuse_mschap; nm_setting_ppp_get_refuse_mschapv2; nm_setting_ppp_get_refuse_pap; + nm_setting_ppp_get_require_mppe; + nm_setting_ppp_get_require_mppe_128; + nm_setting_ppp_get_type; nm_setting_ppp_new; nm_setting_pppoe_get_password; + nm_setting_pppoe_get_service; nm_setting_pppoe_get_type; nm_setting_pppoe_get_username; nm_setting_pppoe_new; @@ -542,9 +565,11 @@ global: nm_utils_ip4_netmask_to_prefix; nm_utils_ip4_prefix_to_netmask; nm_utils_ipaddr_valid; + nm_utils_ipv6_interface_identifier_get_from_addr; nm_utils_is_empty_ssid; nm_utils_is_json_object; nm_utils_kill_child_async; + nm_utils_modprobe; nm_utils_monotonic_timestamp_as_boottime; nm_utils_rsa_key_encrypt; nm_utils_same_ssid; diff --git a/src/devices/adsl/nm-device-adsl.c b/src/devices/adsl/nm-device-adsl.c index 8783589ebf..6cf808e687 100644 --- a/src/devices/adsl/nm-device-adsl.c +++ b/src/devices/adsl/nm-device-adsl.c @@ -34,7 +34,7 @@ #include "devices/nm-device-private.h" #include "platform/nm-platform.h" -#include "ppp/nm-ppp-manager.h" +#include "ppp/nm-ppp-manager-call.h" #include "ppp/nm-ppp-status.h" #include "nm-setting-adsl.h" #include "nm-utils.h" @@ -477,8 +477,11 @@ act_stage3_ip4_config_start (NMDevice *device, _LOGD (LOGD_ADSL, "starting PPPoA"); } - priv->ppp_manager = nm_ppp_manager_new (ppp_iface); - if (nm_ppp_manager_start (priv->ppp_manager, req, nm_setting_adsl_get_username (s_adsl), 30, 0, &err)) { + priv->ppp_manager = nm_ppp_manager_create (ppp_iface, &err); + if ( priv->ppp_manager + && nm_ppp_manager_start (priv->ppp_manager, req, + nm_setting_adsl_get_username (s_adsl), + 30, 0, &err)) { g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED, G_CALLBACK (ppp_state_changed), self); @@ -490,7 +493,7 @@ act_stage3_ip4_config_start (NMDevice *device, _LOGW (LOGD_ADSL, "PPP failed to start: %s", err->message); g_error_free (err); - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + g_clear_object (&priv->ppp_manager); *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED; } @@ -506,7 +509,8 @@ adsl_cleanup (NMDeviceAdsl *self) if (priv->ppp_manager) { g_signal_handlers_disconnect_by_func (priv->ppp_manager, G_CALLBACK (ppp_state_changed), self); g_signal_handlers_disconnect_by_func (priv->ppp_manager, G_CALLBACK (ppp_ip4_config), self); - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + nm_ppp_manager_stop_sync (priv->ppp_manager); + g_clear_object (&priv->ppp_manager); } g_signal_handlers_disconnect_by_func (NM_PLATFORM_GET, G_CALLBACK (link_changed_cb), self); diff --git a/src/devices/nm-device-ethernet.c b/src/devices/nm-device-ethernet.c index d617e10735..43084d49b9 100644 --- a/src/devices/nm-device-ethernet.c +++ b/src/devices/nm-device-ethernet.c @@ -39,6 +39,7 @@ #include "supplicant/nm-supplicant-interface.h" #include "supplicant/nm-supplicant-config.h" #include "ppp/nm-ppp-manager.h" +#include "ppp/nm-ppp-manager-call.h" #include "ppp/nm-ppp-status.h" #include "platform/nm-platform.h" #include "platform/nm-platform-utils.h" @@ -1011,8 +1012,12 @@ pppoe_stage3_ip4_config_start (NMDeviceEthernet *self, NMDeviceStateReason *reas s_pppoe = (NMSettingPppoe *) nm_device_get_applied_setting ((NMDevice *) self, NM_TYPE_SETTING_PPPOE); g_assert (s_pppoe); - priv->ppp_manager = nm_ppp_manager_new (nm_device_get_iface (NM_DEVICE (self))); - if (nm_ppp_manager_start (priv->ppp_manager, req, nm_setting_pppoe_get_username (s_pppoe), 30, 0, &err)) { + priv->ppp_manager = nm_ppp_manager_create (nm_device_get_iface (NM_DEVICE (self)), + &err); + if ( priv->ppp_manager + && nm_ppp_manager_start (priv->ppp_manager, req, + nm_setting_pppoe_get_username (s_pppoe), + 30, 0, &err)) { g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED, G_CALLBACK (ppp_state_changed), self); @@ -1024,7 +1029,7 @@ pppoe_stage3_ip4_config_start (NMDeviceEthernet *self, NMDeviceStateReason *reas _LOGW (LOGD_DEVICE, "PPPoE failed to start: %s", err->message); g_error_free (err); - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + g_clear_object (&priv->ppp_manager); *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED; } @@ -1389,7 +1394,10 @@ deactivate (NMDevice *device) priv->pending_ip4_config = NULL; } - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + if (priv->ppp_manager) { + nm_ppp_manager_stop_sync (priv->ppp_manager); + g_clear_object (&priv->ppp_manager); + } supplicant_interface_release (self); diff --git a/src/devices/wwan/nm-modem.c b/src/devices/wwan/nm-modem.c index 6c137c0cd1..df71017745 100644 --- a/src/devices/wwan/nm-modem.c +++ b/src/devices/wwan/nm-modem.c @@ -36,6 +36,7 @@ #include "nm-act-request.h" #include "nm-ip4-config.h" #include "nm-ip6-config.h" +#include "ppp/nm-ppp-manager-call.h" #include "ppp/nm-ppp-status.h" /*****************************************************************************/ @@ -558,8 +559,10 @@ ppp_stage3_ip_config_start (NMModem *self, if (port_speed_is_zero (priv->data_port)) baud_override = 57600; - priv->ppp_manager = nm_ppp_manager_new (priv->data_port); - if (nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, ip_timeout, baud_override, &error)) { + priv->ppp_manager = nm_ppp_manager_create (priv->data_port, &error); + if ( priv->ppp_manager + && nm_ppp_manager_start (priv->ppp_manager, req, ppp_name, + ip_timeout, baud_override, &error)) { g_signal_connect (priv->ppp_manager, NM_PPP_MANAGER_STATE_CHANGED, G_CALLBACK (ppp_state_changed), self); @@ -580,7 +583,7 @@ ppp_stage3_ip_config_start (NMModem *self, error->message); g_error_free (error); - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + g_clear_object (&priv->ppp_manager); *reason = NM_DEVICE_STATE_REASON_PPP_START_FAILED; ret = NM_ACT_STAGE_RETURN_FAILURE; @@ -1000,7 +1003,7 @@ deactivate_cleanup (NMModem *self, NMDevice *device) priv->in_bytes = priv->out_bytes = 0; - nm_exported_object_clear_and_unexport (&priv->ppp_manager); + g_clear_object (&priv->ppp_manager); if (device) { g_return_if_fail (NM_IS_DEVICE (device)); @@ -1136,10 +1139,10 @@ deactivate_step (DeactivateContext *ctx) case DEACTIVATE_CONTEXT_STEP_PPP_MANAGER_STOP: /* If we have a PPP manager, stop it */ if (ctx->ppp_manager) { - nm_ppp_manager_stop (ctx->ppp_manager, - ctx->cancellable, - (GAsyncReadyCallback) ppp_manager_stop_ready, - ctx); + nm_ppp_manager_stop_async (ctx->ppp_manager, + ctx->cancellable, + (GAsyncReadyCallback) ppp_manager_stop_ready, + ctx); return; } ctx->step++; diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c index 2927acd375..a0067aafc1 100644 --- a/src/nm-core-utils.c +++ b/src/nm-core-utils.c @@ -3904,3 +3904,4 @@ skip: g_array_free (paths, TRUE); return result; } + diff --git a/src/ppp/nm-ppp-manager-call.c b/src/ppp/nm-ppp-manager-call.c new file mode 100644 index 0000000000..d67c0a99ce --- /dev/null +++ b/src/ppp/nm-ppp-manager-call.c @@ -0,0 +1,142 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* 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. + * + * 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. + * + * Copyright (C) 2016 Red Hat, Inc. + */ + +#include "nm-default.h" + +#include "nm-ppp-manager-call.h" + +#include +#include +#include + +#include "nm-manager.h" +#include "nm-core-utils.h" +#include "nm-ppp-plugin-api.h" + +#define PPP_PLUGIN_PATH NMPLUGINDIR "/libnm-ppp-plugin.so" + +/*****************************************************************************/ + +static NMPPPOps *ppp_ops = NULL; + +NMPPPManager * +nm_ppp_manager_create (const char *iface, GError **error) +{ + NMPPPManager *ret; + GModule *plugin; + GError *error_local = NULL; + NMPPPOps *ops; + struct stat st; + int errsv; + + if (G_UNLIKELY (!ppp_ops)) { + if (stat (PPP_PLUGIN_PATH, &st) != 0) { + errsv = errno; + g_set_error_literal (error, + NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN, + "the PPP plugin " PPP_PLUGIN_PATH " is not installed"); + return NULL; + } + + if (!nm_utils_validate_plugin (PPP_PLUGIN_PATH, &st, &error_local)) { + g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN, + "could not load the PPP plugin " PPP_PLUGIN_PATH ": %s", + error_local->message); + g_clear_error (&error_local); + return NULL; + } + + plugin = g_module_open (PPP_PLUGIN_PATH, G_MODULE_BIND_LOCAL); + if (!plugin) { + g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN, + "could not load the PPP plugin " PPP_PLUGIN_PATH ": %s", + g_module_error ()); + return NULL; + } + + if (!g_module_symbol (plugin, "ppp_ops", (gpointer) &ops)) { + g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_MISSING_PLUGIN, + "error loading the PPP plugin: %s", g_module_error ()); + return NULL; + } + + /* after loading glib types from the plugin, we cannot unload the library anymore. + * Make it resident. */ + g_module_make_resident (plugin); + + nm_assert (ops); + nm_assert (ops->create); + nm_assert (ops->start); + nm_assert (ops->stop_async); + nm_assert (ops->stop_finish); + nm_assert (ops->stop_sync); + + ppp_ops = ops; + + nm_log_info (LOGD_CORE | LOGD_PPP, "loaded PPP plugin " PPP_PLUGIN_PATH); + } + + ret = ppp_ops->create (iface); + g_return_val_if_fail (ret, NULL); + return ret; +} + +gboolean +nm_ppp_manager_start (NMPPPManager *self, + NMActRequest *req, + const char *ppp_name, + guint32 timeout_secs, + guint baud_override, + GError **err) +{ + g_return_val_if_fail (ppp_ops, FALSE); + + return ppp_ops->start (self, req, ppp_name, timeout_secs, baud_override, err); +} + +void +nm_ppp_manager_stop_async (NMPPPManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) +{ + g_return_if_fail (ppp_ops); + + ppp_ops->stop_async (self, cancellable, callback, user_data); +} + +gboolean +nm_ppp_manager_stop_finish (NMPPPManager *self, + GAsyncResult *res, + GError **error) +{ + g_return_val_if_fail (ppp_ops, FALSE); + + return ppp_ops->stop_finish (self, res, error); +} + +void +nm_ppp_manager_stop_sync (NMPPPManager *self) +{ + g_return_if_fail (ppp_ops); + + ppp_ops->stop_sync (self); +} + diff --git a/src/ppp/nm-ppp-manager-call.h b/src/ppp/nm-ppp-manager-call.h new file mode 100644 index 0000000000..f21005f0fd --- /dev/null +++ b/src/ppp/nm-ppp-manager-call.h @@ -0,0 +1,43 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* 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. + * + * 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. + * + * Copyright (C) 2016 Red Hat, Inc. + */ + +#ifndef __NM_PPP_MANAGER_CALL_H__ +#define __NM_PPP_MANAGER_CALL_H__ + +#include "nm-ppp-manager.h" + +NMPPPManager * nm_ppp_manager_create (const char *iface, + GError **error); +gboolean nm_ppp_manager_start (NMPPPManager *self, + NMActRequest *req, + const char *ppp_name, + guint32 timeout_secs, + guint baud_override, + GError **error); +void nm_ppp_manager_stop_async (NMPPPManager *self, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean nm_ppp_manager_stop_finish (NMPPPManager *self, + GAsyncResult *res, + GError **error); +void nm_ppp_manager_stop_sync (NMPPPManager *self); + +#endif /* __NM_PPP_MANAGER_CALL_H__ */ diff --git a/src/ppp/nm-ppp-manager.c b/src/ppp/nm-ppp-manager.c index bee757d373..c8d43299d9 100644 --- a/src/ppp/nm-ppp-manager.c +++ b/src/ppp/nm-ppp-manager.c @@ -49,7 +49,9 @@ #include "nm-act-request.h" #include "nm-ip4-config.h" #include "nm-ip6-config.h" + #include "nm-pppd-plugin.h" +#include "nm-ppp-plugin-api.h" #include "nm-ppp-status.h" #include "introspection/org.freedesktop.NetworkManager.PPP.h" @@ -59,6 +61,17 @@ /*****************************************************************************/ +#define NM_TYPE_PPP_MANAGER (nm_ppp_manager_get_type ()) +#define NM_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PPP_MANAGER, NMPPPManager)) +#define NM_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PPP_MANAGER, NMPPPManagerClass)) +#define NM_IS_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_PPP_MANAGER)) +#define NM_IS_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_PPP_MANAGER)) +#define NM_PPP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_PPP_MANAGER, NMPPPManagerClass)) + +GType nm_ppp_manager_get_type (void); + +/*****************************************************************************/ + enum { STATE_CHANGED, IP4_CONFIG, @@ -98,9 +111,9 @@ struct _NMPPPManager { NMPPPManagerPrivate _priv; }; -struct _NMPPPManagerClass { +typedef struct { NMExportedObjectClass parent; -}; +} NMPPPManagerClass; G_DEFINE_TYPE (NMPPPManager, nm_ppp_manager, NM_TYPE_EXPORTED_OBJECT) @@ -887,13 +900,13 @@ pppoe_fill_defaults (NMSettingPpp *setting) #endif } -gboolean -nm_ppp_manager_start (NMPPPManager *manager, - NMActRequest *req, - const char *ppp_name, - guint32 timeout_secs, - guint baud_override, - GError **err) +static gboolean +_ppp_manager_start (NMPPPManager *manager, + NMActRequest *req, + const char *ppp_name, + guint32 timeout_secs, + guint baud_override, + GError **err) { NMPPPManagerPrivate *priv; NMConnection *connection; @@ -919,6 +932,8 @@ nm_ppp_manager_start (NMPPPManager *manager, return FALSE; #endif + nm_exported_object_export (NM_EXPORTED_OBJECT (manager)); + priv->pid = 0; /* Make sure /dev/ppp exists (bgo #533064) */ @@ -976,6 +991,9 @@ out: if (ppp_cmd) nm_cmd_line_destroy (ppp_cmd); + if (priv->pid <= 0) + nm_exported_object_unexport (NM_EXPORTED_OBJECT (manager)); + return priv->pid > 0; } @@ -1050,10 +1068,10 @@ stop_context_complete_if_cancelled (StopContext *ctx) return FALSE; } -gboolean -nm_ppp_manager_stop_finish (NMPPPManager *manager, - GAsyncResult *res, - GError **error) +static gboolean +_ppp_manager_stop_finish (NMPPPManager *manager, + GAsyncResult *res, + GError **error) { return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); } @@ -1069,21 +1087,23 @@ kill_child_ready (pid_t pid, stop_context_complete (ctx); } -void -nm_ppp_manager_stop (NMPPPManager *manager, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data) +static void +_ppp_manager_stop_async (NMPPPManager *manager, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data) { NMPPPManagerPrivate *priv = NM_PPP_MANAGER_GET_PRIVATE (manager); StopContext *ctx; + nm_exported_object_unexport (NM_EXPORTED_OBJECT (manager)); + ctx = g_slice_new0 (StopContext); ctx->manager = g_object_ref (manager); ctx->result = g_simple_async_result_new (G_OBJECT (manager), callback, user_data, - nm_ppp_manager_stop); + _ppp_manager_stop_async); /* Setup cancellable */ ctx->cancellable = cancellable ? g_object_ref (cancellable) : NULL; @@ -1110,6 +1130,18 @@ nm_ppp_manager_stop (NMPPPManager *manager, priv->pid = 0; } +static void +_ppp_manager_stop_sync (NMPPPManager *manager) +{ + NMExportedObject *exported = NM_EXPORTED_OBJECT (manager); + + if (nm_exported_object_is_exported (exported)) + nm_exported_object_unexport (exported); + + _ppp_cleanup (manager); + _ppp_kill (manager); +} + /*****************************************************************************/ static void @@ -1153,8 +1185,8 @@ nm_ppp_manager_init (NMPPPManager *manager) NM_PPP_MANAGER_GET_PRIVATE (manager)->monitor_fd = -1; } -NMPPPManager * -nm_ppp_manager_new (const char *iface) +static NMPPPManager * +_ppp_manager_new (const char *iface) { g_return_val_if_fail (iface != NULL, NULL); @@ -1200,7 +1232,6 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class) object_class->set_property = set_property; exported_object_class->export_path = NM_DBUS_PATH "/PPP/%u"; - exported_object_class->export_on_construction = TRUE; obj_properties[PROP_PARENT_IFACE] = g_param_spec_string (NM_PPP_MANAGER_PARENT_IFACE, "", "", @@ -1255,3 +1286,10 @@ nm_ppp_manager_class_init (NMPPPManagerClass *manager_class) NULL); } +NMPPPOps ppp_ops = { + .create = _ppp_manager_new, + .start = _ppp_manager_start, + .stop_async = _ppp_manager_stop_async, + .stop_finish = _ppp_manager_stop_finish, + .stop_sync = _ppp_manager_stop_sync, +}; diff --git a/src/ppp/nm-ppp-manager.h b/src/ppp/nm-ppp-manager.h index 12748176a3..a86fe26ae5 100644 --- a/src/ppp/nm-ppp-manager.h +++ b/src/ppp/nm-ppp-manager.h @@ -16,43 +16,15 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Copyright (C) 2008 Novell, Inc. - * Copyright (C) 2008 - 2010 Red Hat, Inc. + * Copyright (C) 2008 - 2016 Red Hat, Inc. */ -#ifndef __NETWORKMANAGER_PPP_MANAGER_H__ -#define __NETWORKMANAGER_PPP_MANAGER_H__ - -#define NM_TYPE_PPP_MANAGER (nm_ppp_manager_get_type ()) -#define NM_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), NM_TYPE_PPP_MANAGER, NMPPPManager)) -#define NM_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), NM_TYPE_PPP_MANAGER, NMPPPManagerClass)) -#define NM_IS_PPP_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NM_TYPE_PPP_MANAGER)) -#define NM_IS_PPP_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), NM_TYPE_PPP_MANAGER)) -#define NM_PPP_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), NM_TYPE_PPP_MANAGER, NMPPPManagerClass)) +#ifndef __NM_PPP_MANAGER_H__ +#define __NM_PPP_MANAGER_H__ #define NM_PPP_MANAGER_PARENT_IFACE "parent-iface" - #define NM_PPP_MANAGER_STATE_CHANGED "state-changed" typedef struct _NMPPPManager NMPPPManager; -typedef struct _NMPPPManagerClass NMPPPManagerClass; -GType nm_ppp_manager_get_type (void); - -NMPPPManager *nm_ppp_manager_new (const char *iface); - -gboolean nm_ppp_manager_start (NMPPPManager *manager, - NMActRequest *req, - const char *ppp_name, - guint32 timeout_secs, - guint baud_override, - GError **err); - -void nm_ppp_manager_stop (NMPPPManager *manager, - GCancellable *cancellable, - GAsyncReadyCallback callback, - gpointer user_data); -gboolean nm_ppp_manager_stop_finish (NMPPPManager *manager, - GAsyncResult *res, - GError **error); - -#endif /* __NETWORKMANAGER_PPP_MANAGER_H__ */ +#endif /* __NM_PPP_MANAGER_H__ */ diff --git a/src/ppp/nm-ppp-plugin-api.h b/src/ppp/nm-ppp-plugin-api.h new file mode 100644 index 0000000000..0a38fe0551 --- /dev/null +++ b/src/ppp/nm-ppp-plugin-api.h @@ -0,0 +1,46 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ +/* 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. + * + * 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. + * + * Copyright (C) 2016 Red Hat, Inc. + */ + +#ifndef __NM_PPP_PLUGIN_API_H__ +#define __NM_PPP_PLUGIN_API_H__ + +typedef const struct { + NMPPPManager *(*create) (const char *iface); + + gboolean (*start) (NMPPPManager *manager, + NMActRequest *req, + const char *ppp_name, + guint32 timeout_secs, + guint baud_override, + GError **err); + + void (*stop_async) (NMPPPManager *manager, + GCancellable *cancellable, + GAsyncReadyCallback callback, + gpointer user_data); + + gboolean (*stop_finish) (NMPPPManager *manager, + GAsyncResult *res, + GError **error); + + void (*stop_sync) (NMPPPManager *manager); +} NMPPPOps; + +#endif /* __NM_PPP_PLUGIN_API_H__ */ diff --git a/src/ppp/nm-ppp-plugin.ver b/src/ppp/nm-ppp-plugin.ver new file mode 100644 index 0000000000..fee5578753 --- /dev/null +++ b/src/ppp/nm-ppp-plugin.ver @@ -0,0 +1,6 @@ +{ +global: + ppp_ops; +local: + *; +}; diff --git a/src/ppp/nm-ppp-status.h b/src/ppp/nm-ppp-status.h index 391b5aa986..d785cc2cc6 100644 --- a/src/ppp/nm-ppp-status.h +++ b/src/ppp/nm-ppp-status.h @@ -16,11 +16,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Copyright (C) 2008 Novell, Inc. - * Copyright (C) 2008 Red Hat, Inc. + * Copyright (C) 2008-2016 Red Hat, Inc. */ -#ifndef __NETWORKMANAGER_PPP_STATUS_H__ -#define __NETWORKMANAGER_PPP_STATUS_H__ +#ifndef __NM_PPP_STATUS_H__ +#define __NM_PPP_STATUS_H__ typedef enum { NM_PPP_STATUS_UNKNOWN, @@ -40,4 +40,4 @@ typedef enum { NM_PPP_STATUS_MASTER } NMPPPStatus; -#endif /* __NETWORKMANAGER_PPP_STATUS_H__ */ +#endif /* __NM_PPP_STATUS_H__ */ diff --git a/tools/create-exports-NetworkManager.sh b/tools/create-exports-NetworkManager.sh index dc0dc03625..c53d7cb5b9 100755 --- a/tools/create-exports-NetworkManager.sh +++ b/tools/create-exports-NetworkManager.sh @@ -46,7 +46,9 @@ EOF } get_symbols_missing() { - (for f in ./src/settings/plugins/*/.libs/*.so ./src/devices/*/.libs/*.so; do + (for f in ./src/settings/plugins/*/.libs/*.so \ + ./src/devices/*/.libs/*.so \ + ./src/ppp/.libs/libnm-ppp-plugin.so; do call_nm "$f" | sed -n 's/^\([U]\) \(\(nm_\|nmp_\|_nm\|NM\|_NM\).*\)$/\2/p' done) |