static ni_netdev_t * __ni_objectmodel_tun_newlink(ni_netdev_t *cfg_ifp, const char *ifname, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *new_ifp = NULL; const ni_tun_t *tun; const char *err; int rv; /* There's nothing in the device argument that we could use. */ ni_debug_dbus("TUN.newDevice(name=%s)", ifname); if (ifname == NULL && !(ifname = ni_netdev_make_name(nc, "tun", 0))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create tun - too many interfaces"); goto out; } tun = ni_netdev_get_tun(cfg_ifp); if ((err = ni_tun_validate(tun))) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); goto out; } if ((rv = ni_system_tun_create(nc, ifname, tun, &new_ifp)) < 0) { if (rv != -NI_ERROR_DEVICE_EXISTS || new_ifp == NULL || (ifname && new_ifp && !ni_string_eq(new_ifp->name, ifname))) { ni_dbus_set_error_from_code(error, rv, "unable to create TUN interface %s", ifname); new_ifp = NULL; goto out; } ni_debug_dbus("TUN interface exists (and name matches)"); } if (new_ifp->link.type != NI_IFTYPE_TUN) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create TUN interface: new interface is of type %s", ni_linktype_type_to_name(new_ifp->link.type)); new_ifp = NULL; } out: if (cfg_ifp) ni_netdev_put(cfg_ifp); return new_ifp; }
static ni_netdev_t * __ni_objectmodel_ppp_newlink(ni_netdev_t *cfg, const char *ifname, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *new_dev = NULL; int rv; ni_debug_dbus("PPP.newDevice(name=%s)", ifname); if (ifname == NULL && !(ifname = ni_netdev_make_name(nc, "ppp"))) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create ppp - too many interfaces"); return NULL; } if ((rv = ni_system_ppp_create(nc, ifname, cfg->ppp, &new_dev)) < 0) { if (rv != -NI_ERROR_DEVICE_EXISTS && (ifname != NULL && strcmp(ifname, new_dev->name))) { ni_dbus_set_error_from_code(error, rv, "unable to create PPP interface %s", ifname); return NULL; } ni_debug_dbus("PPP interface exists (and name matches)"); } if (new_dev->link.type != NI_IFTYPE_PPP) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create PPP interface: new interface is of type %s", ni_linktype_type_to_name(new_dev->link.type)); /* FIXME: delete device? */ return NULL; } if (ni_ppp_write_config(new_dev->ppp) < 0) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create PPP interface: failed to write coniguration files"); /* FIXME: delete device */ return NULL; } return new_dev; }
/* * 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; }
/* * Create a new TUN/TAP interface */ static ni_netdev_t * __ni_objectmodel_tuntap_create(ni_netdev_t *cfg, DBusError *error) { ni_netconfig_t *nc = ni_global_state_handle(0); ni_netdev_t *dev = NULL; const char *iftype; const ni_tuntap_t *tuntap; const char *err; int rv; iftype = ni_linktype_type_to_name(cfg->link.type); if (cfg->link.type != NI_IFTYPE_TUN && cfg->link.type != NI_IFTYPE_TAP) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "BUG: Cannot handle %s type in tun/tap factory", iftype); return NULL; } ni_debug_dbus("%s.newDevice(name=%s)", iftype, cfg->name); tuntap = ni_netdev_get_tuntap(cfg); if ((err = ni_tuntap_validate(tuntap))) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "%s", err); return NULL; } if (ni_string_empty(cfg->name)) { if (ni_string_empty(cfg->name) && (cfg->name = (char *) ni_netdev_make_name(nc, iftype, 0))) { ni_string_dup(&cfg->name, cfg->name); } else { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Unable to create %s interface: " "name argument missed", iftype); return NULL; } cfg->name = NULL; } else if(!ni_string_eq(cfg->name, cfg->name)) { ni_string_dup(&cfg->name, cfg->name); } if (cfg->link.type == NI_IFTYPE_TAP && cfg->link.hwaddr.len) { if (cfg->link.hwaddr.type == ARPHRD_VOID) cfg->link.hwaddr.type = ARPHRD_ETHER; if (cfg->link.hwaddr.type != ARPHRD_ETHER || cfg->link.hwaddr.len != ni_link_address_length(ARPHRD_ETHER)) { dbus_set_error(error, DBUS_ERROR_INVALID_ARGS, "Cannot create %s interface: " "invalid ethernet address '%s'", iftype, ni_link_address_print(&cfg->link.hwaddr)); return NULL; } } if ((rv = ni_system_tuntap_create(nc, cfg, &dev)) < 0) { if (rv != -NI_ERROR_DEVICE_EXISTS || dev == NULL || (cfg->name && dev && !ni_string_eq(dev->name, cfg->name))) { ni_dbus_set_error_from_code(error, rv, "Unable to create %s interface %s", iftype, cfg->name); return NULL; } ni_debug_dbus("%s interface exists (and name matches)", iftype); } if (dev->link.type != cfg->link.type) { dbus_set_error(error, DBUS_ERROR_FAILED, "Unable to create %s: existing interface %s is of type %s", iftype, dev->name, ni_linktype_type_to_name(dev->link.type)); return NULL; } return dev; }