void ni_objectmodel_unregister_managed_device(ni_managed_device_t *mdev) { if (mdev->object) { ni_dbus_object_free(mdev->object); mdev->object = NULL; } }
/* * Create client handle for addrconf forwarder */ static dbus_bool_t ni_objectmodel_addrconf_forwarder_call(ni_dbus_addrconf_forwarder_t *forwarder, ni_netdev_t *dev, const char *method_name, const ni_uuid_t *uuid, const ni_dbus_variant_t *dict, DBusError *error) { ni_dbus_object_t *object; char object_path[256]; ni_dbus_variant_t argv[2]; int argc = 0; dbus_bool_t rv; if (forwarder->supplicant.client == NULL) { forwarder->supplicant.client = ni_create_dbus_client(forwarder->supplicant.bus_name); if (forwarder->supplicant.client == NULL) { dbus_set_error(error, "unable to create call forwarder for %s", forwarder->supplicant.bus_name); return FALSE; } ni_dbus_client_add_signal_handler(forwarder->supplicant.client, forwarder->supplicant.bus_name, /* sender must be the supplicant */ NULL, /* any object */ NI_OBJECTMODEL_ADDRCONF_INTERFACE, /* interface */ ni_objectmodel_addrconf_signal_handler, forwarder); } /* Build the path of the object to talk to in the supplicant service */ snprintf(object_path, sizeof(object_path), "%s/%u", forwarder->supplicant.object_path, dev->link.ifindex); object = ni_dbus_client_object_new(forwarder->supplicant.client, &forwarder->class, object_path, forwarder->supplicant.interface, NULL); /* Build the arguments. Note that we don't clone the dict, we just assign it * to argv[1]. Thus, we must make sure we never call ni_dbus_variant_destroy on argv[1] */ memset(argv, 0, sizeof(argv)); ni_dbus_variant_set_uuid(&argv[argc++], uuid); if (dict) argv[argc++] = *dict; /* Call the supplicant's method */ rv = ni_dbus_object_call_variant(object, forwarder->supplicant.interface, method_name, argc, argv, 0, NULL, error); ni_dbus_object_free(object); ni_dbus_variant_destroy(&argv[0]); return rv; }
/* * Common helper function to extract some specific properties of device info from a dbus dict */ static ni_netdev_t * __ni_objectmodel_protocol_arg(const ni_dbus_variant_t *dict, const ni_dbus_service_t *service) { ni_dbus_object_t *dev_object; ni_netdev_t *dev; dbus_bool_t rv; dev = ni_netdev_new(NULL, 0); dev->link.type = NI_IFTYPE_ETHERNET; dev_object = ni_objectmodel_wrap_netif(dev); rv = ni_dbus_object_set_properties_from_dict(dev_object, service, dict, NULL); ni_dbus_object_free(dev_object); if (!rv) { ni_netdev_put(dev); dev = NULL; } return dev; }
/* * InfinibandChild.delete method */ static dbus_bool_t ni_objectmodel_ib_delete(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netdev_t *ifp; if (!(ifp = ni_objectmodel_unwrap_netif(object, error))) return FALSE; NI_TRACE_ENTER_ARGS("ifp=%s", ifp->name); if (ni_system_infiniband_child_delete(ifp) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to delete infiniband child interface", ifp->name); return FALSE; } ni_client_state_drop(ifp->link.ifindex); ni_dbus_object_free(object); return TRUE; }
/* * Bridge.delete method */ static dbus_bool_t ni_objectmodel_delete_bridge(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *dev; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return FALSE; NI_TRACE_ENTER_ARGS("dev=%s", dev->name); if (ni_system_bridge_delete(nc, dev) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Error deleting bridge interface", dev->name); return FALSE; } ni_client_state_drop(dev->link.ifindex); ni_dbus_object_free(object); return TRUE; }
/* * Delete a PPP interface */ dbus_bool_t ni_objectmodel_ppp_delete(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netdev_t *dev; int rv; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return FALSE; NI_TRACE_ENTER_ARGS("dev=%s", dev->name); if ((rv = ni_system_ppp_delete(dev)) < 0) { ni_dbus_set_error_from_code(error, rv, "Unable to delete PPP interface %s: %s", dev->name, ni_strerror(rv)); return FALSE; } ni_dbus_object_free(object); return TRUE; }
/* * Delete a TUN interface */ dbus_bool_t ni_objectmodel_tun_delete(ni_dbus_object_t *object, const ni_dbus_method_t *method, unsigned int argc, const ni_dbus_variant_t *argv, ni_dbus_message_t *reply, DBusError *error) { ni_netdev_t *dev; int rv; if (!(dev = ni_objectmodel_unwrap_netif(object, error))) return FALSE; NI_TRACE_ENTER_ARGS("dev=%s", dev->name); if ((rv = ni_system_tun_delete(dev)) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Error deleting TUN interface %s: %s", dev->name, ni_strerror(rv)); return FALSE; } ni_client_state_drop(dev->link.ifindex); ni_dbus_object_free(object); return TRUE; }