2012-12-11 10:59:45 +00:00
|
|
|
/*
|
2014-03-07 13:38:51 +00:00
|
|
|
* parallels_network.c: core privconn functions for managing
|
2012-12-11 10:59:45 +00:00
|
|
|
* Parallels Cloud Server hosts
|
|
|
|
*
|
2014-04-20 20:07:46 +00:00
|
|
|
* Copyright (C) 2013-2014 Red Hat, Inc.
|
2012-12-11 10:59:45 +00:00
|
|
|
* Copyright (C) 2012 Parallels, Inc.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library. If not, see
|
|
|
|
* <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <config.h>
|
|
|
|
|
|
|
|
#include "datatypes.h"
|
2013-04-25 20:24:42 +00:00
|
|
|
#include "dirname.h"
|
2012-12-12 18:06:53 +00:00
|
|
|
#include "viralloc.h"
|
2012-12-13 18:21:53 +00:00
|
|
|
#include "virerror.h"
|
2013-05-09 18:59:04 +00:00
|
|
|
#include "virfile.h"
|
2012-12-11 10:59:45 +00:00
|
|
|
#include "md5.h"
|
|
|
|
#include "parallels_utils.h"
|
2013-04-03 10:36:23 +00:00
|
|
|
#include "virstring.h"
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_PARALLELS
|
2012-12-11 10:59:48 +00:00
|
|
|
#define PARALLELS_ROUTED_NETWORK_UUID "eb593dd1-6846-45b0-84a0-de0729286982"
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
#define parallelsParseError() \
|
|
|
|
virReportErrorHelper(VIR_FROM_TEST, VIR_ERR_OPERATION_FAILED, __FILE__, \
|
|
|
|
__FUNCTION__, __LINE__, _("Can't parse prlctl output"))
|
|
|
|
|
2012-12-11 10:59:47 +00:00
|
|
|
#define SYSFS_NET_DIR "/sys/class/net"
|
|
|
|
|
|
|
|
static int parallelsGetBridgedNetInfo(virNetworkDefPtr def, virJSONValuePtr jobj)
|
|
|
|
{
|
|
|
|
const char *ifname;
|
|
|
|
char *bridgeLink = NULL;
|
|
|
|
char *bridgePath = NULL;
|
|
|
|
char *bridgeAddressPath = NULL;
|
|
|
|
char *bridgeAddress = NULL;
|
|
|
|
int len = 0;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
if (!(ifname = virJSONValueObjectGetString(jobj, "Bound To"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virAsprintf(&bridgeLink, "%s/%s/brport/bridge",
|
2013-07-04 10:13:24 +00:00
|
|
|
SYSFS_NET_DIR, ifname) < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virFileResolveLink(bridgeLink, &bridgePath) < 0) {
|
|
|
|
virReportSystemError(errno, _("cannot read link '%s'"), bridgeLink);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(def->bridge, last_component(bridgePath)) < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (virAsprintf(&bridgeAddressPath, "%s/%s/brport/bridge/address",
|
2013-07-04 10:13:24 +00:00
|
|
|
SYSFS_NET_DIR, ifname) < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if ((len = virFileReadAll(bridgeAddressPath, 18, &bridgeAddress)) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Error reading file '%s'"), bridgeAddressPath);
|
|
|
|
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (len < VIR_MAC_STRING_BUFLEN) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Error reading MAC from '%s'"), bridgeAddressPath);
|
|
|
|
}
|
|
|
|
|
|
|
|
bridgeAddress[VIR_MAC_STRING_BUFLEN - 1] = '\0';
|
|
|
|
if (virMacAddrParse(bridgeAddress, &def->mac) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR,
|
|
|
|
_("Can't parse MAC '%s'"), bridgeAddress);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
def->mac_specified = 1;
|
|
|
|
|
|
|
|
ret = 0;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:47 +00:00
|
|
|
VIR_FREE(bridgeLink);
|
|
|
|
VIR_FREE(bridgePath);
|
|
|
|
VIR_FREE(bridgeAddress);
|
|
|
|
VIR_FREE(bridgeAddressPath);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int parallelsGetHostOnlyNetInfo(virNetworkDefPtr def, const char *name)
|
|
|
|
{
|
|
|
|
const char *tmp;
|
|
|
|
virJSONValuePtr jobj = NULL, jobj2;
|
|
|
|
int ret = -1;
|
|
|
|
|
2013-07-04 10:13:24 +00:00
|
|
|
if (VIR_EXPAND_N(def->ips, def->nips, 1) < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
jobj = parallelsParseOutput("prlsrvctl", "net", "info", "-j", name, NULL);
|
|
|
|
|
|
|
|
if (!jobj) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(jobj2 = virJSONValueObjectGet(jobj, "Parallels adapter"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(def->ips[0].family, "ipv4") < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
2013-05-03 12:46:03 +00:00
|
|
|
|
2012-12-11 10:59:47 +00:00
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj2, "IP address"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virSocketAddrParseIPv4(&def->ips[0].address, tmp) < 0) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj2, "Subnet mask"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virSocketAddrParseIPv4(&def->ips[0].netmask, tmp) < 0) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(jobj2 = virJSONValueObjectGet(jobj, "DHCPv4 server"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2013-07-04 10:13:24 +00:00
|
|
|
if (VIR_EXPAND_N(def->ips[0].ranges, def->ips[0].nranges, 1) < 0)
|
2012-12-11 10:59:47 +00:00
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj2, "IP scope start address"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virSocketAddrParseIPv4(&def->ips[0].ranges[0].start, tmp) < 0) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj2, "IP scope end address"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (virSocketAddrParseIPv4(&def->ips[0].ranges[0].end, tmp) < 0) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = 0;
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:47 +00:00
|
|
|
virJSONValueFree(jobj);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2012-12-11 10:59:45 +00:00
|
|
|
static virNetworkObjPtr
|
|
|
|
parallelsLoadNetwork(parallelsConnPtr privconn, virJSONValuePtr jobj)
|
|
|
|
{
|
|
|
|
virNetworkObjPtr net;
|
|
|
|
virNetworkDefPtr def;
|
|
|
|
const char *tmp;
|
|
|
|
/* MD5_DIGEST_SIZE = VIR_UUID_BUFLEN = 16 */
|
|
|
|
unsigned char md5[MD5_DIGEST_SIZE];
|
|
|
|
|
|
|
|
if (VIR_ALLOC(def) < 0)
|
2013-07-04 10:13:24 +00:00
|
|
|
goto cleanup;
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj, "Network ID"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(def->name, tmp) < 0)
|
|
|
|
goto cleanup;
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
/* Network names are unique in Parallels Cloud Server, so we can make
|
2014-04-20 20:07:46 +00:00
|
|
|
* a UUID from it */
|
2012-12-11 10:59:45 +00:00
|
|
|
md5_buffer(tmp, strlen(tmp), md5);
|
|
|
|
memcpy(def->uuid, md5, VIR_UUID_BUFLEN);
|
|
|
|
def->uuid_specified = 1;
|
|
|
|
|
2012-12-11 10:59:47 +00:00
|
|
|
if (!(tmp = virJSONValueObjectGetString(jobj, "Type"))) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (STREQ(tmp, "bridged")) {
|
|
|
|
def->forward.type = VIR_NETWORK_FORWARD_BRIDGE;
|
|
|
|
|
|
|
|
if (parallelsGetBridgedNetInfo(def, jobj) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
} else if (STREQ(tmp, "host-only")) {
|
|
|
|
def->forward.type = VIR_NETWORK_FORWARD_NONE;
|
|
|
|
|
|
|
|
if (parallelsGetHostOnlyNetInfo(def, def->name) < 0)
|
|
|
|
goto cleanup;
|
|
|
|
} else {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
2014-08-27 11:32:11 +00:00
|
|
|
if (!(net = virNetworkAssignDef(&privconn->networks, def, false)))
|
2012-12-11 10:59:45 +00:00
|
|
|
goto cleanup;
|
|
|
|
net->active = 1;
|
|
|
|
net->autostart = 1;
|
|
|
|
virNetworkObjUnlock(net);
|
|
|
|
return net;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkDefFree(def);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-12-11 10:59:48 +00:00
|
|
|
static virNetworkObjPtr
|
|
|
|
parallelsAddRoutedNetwork(parallelsConnPtr privconn)
|
|
|
|
{
|
|
|
|
virNetworkObjPtr net;
|
|
|
|
virNetworkDefPtr def;
|
|
|
|
|
|
|
|
if (VIR_ALLOC(def) < 0)
|
2013-07-04 10:13:24 +00:00
|
|
|
goto cleanup;
|
2012-12-11 10:59:48 +00:00
|
|
|
|
|
|
|
def->forward.type = VIR_NETWORK_FORWARD_ROUTE;
|
|
|
|
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(def->name, PARALLELS_ROUTED_NETWORK_NAME) < 0)
|
|
|
|
goto cleanup;
|
2012-12-11 10:59:48 +00:00
|
|
|
|
|
|
|
if (virUUIDParse(PARALLELS_ROUTED_NETWORK_UUID, def->uuid) < 0) {
|
|
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
|
|
_("Can't parse UUID"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
def->uuid_specified = 1;
|
|
|
|
|
|
|
|
if (!(net = virNetworkAssignDef(&privconn->networks, def, false))) {
|
|
|
|
virNetworkDefFree(def);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
net->active = 1;
|
|
|
|
net->autostart = 1;
|
|
|
|
virNetworkObjUnlock(net);
|
|
|
|
|
|
|
|
return net;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:48 +00:00
|
|
|
virNetworkDefFree(def);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2012-12-11 10:59:45 +00:00
|
|
|
static int parallelsLoadNetworks(parallelsConnPtr privconn)
|
|
|
|
{
|
|
|
|
virJSONValuePtr jobj, jobj2;
|
|
|
|
virNetworkObjPtr net;
|
|
|
|
int ret = -1;
|
Convert 'int i' to 'size_t i' in src/parallels/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int count;
|
|
|
|
size_t i;
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
jobj = parallelsParseOutput("prlsrvctl", "net", "list", "-j", NULL);
|
|
|
|
|
|
|
|
if (!jobj) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
count = virJSONValueArraySize(jobj);
|
|
|
|
if (count < 0) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < count; i++) {
|
|
|
|
jobj2 = virJSONValueArrayGet(jobj, i);
|
|
|
|
if (!jobj2) {
|
|
|
|
parallelsParseError();
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
net = parallelsLoadNetwork(privconn, jobj2);
|
|
|
|
if (!net)
|
|
|
|
goto cleanup;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2012-12-11 10:59:48 +00:00
|
|
|
if (!parallelsAddRoutedNetwork(privconn))
|
|
|
|
goto cleanup;
|
|
|
|
|
2012-12-11 10:59:45 +00:00
|
|
|
ret = 0;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
virJSONValueFree(jobj);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2015-01-20 16:16:26 +00:00
|
|
|
virDrvOpenStatus
|
2013-04-23 12:50:18 +00:00
|
|
|
parallelsNetworkOpen(virConnectPtr conn,
|
2012-12-11 10:59:45 +00:00
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
|
|
|
|
|
|
|
|
if (STRNEQ(conn->driver->name, "Parallels"))
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
|
|
|
|
if (parallelsLoadNetworks(conn->privateData) < 0)
|
|
|
|
return VIR_DRV_OPEN_DECLINED;
|
|
|
|
|
|
|
|
return VIR_DRV_OPEN_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2015-01-20 16:16:26 +00:00
|
|
|
int parallelsNetworkClose(virConnectPtr conn)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
virNetworkObjListFree(&privconn->networks);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2013-04-23 12:50:18 +00:00
|
|
|
static int parallelsConnectNumOfNetworks(virConnectPtr conn)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
Convert 'int i' to 'size_t i' in src/parallels/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int nactive = 0;
|
|
|
|
size_t i;
|
2012-12-11 10:59:45 +00:00
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < privconn->networks.count; i++) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjLock(privconn->networks.objs[i]);
|
|
|
|
if (virNetworkObjIsActive(privconn->networks.objs[i]))
|
|
|
|
nactive++;
|
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
}
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
|
|
|
|
return nactive;
|
|
|
|
}
|
|
|
|
|
2013-04-23 12:50:18 +00:00
|
|
|
static int parallelsConnectListNetworks(virConnectPtr conn,
|
|
|
|
char **const names,
|
|
|
|
int nnames)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
Convert 'int i' to 'size_t i' in src/parallels/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int got = 0;
|
|
|
|
size_t i;
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < privconn->networks.count && got < nnames; i++) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjLock(privconn->networks.objs[i]);
|
|
|
|
if (virNetworkObjIsActive(privconn->networks.objs[i])) {
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(names[got], privconn->networks.objs[i]->def->name) < 0) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
got++;
|
|
|
|
}
|
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
}
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
|
|
|
|
return got;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
parallelsDriverUnlock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < got; i++)
|
2012-12-11 10:59:45 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2013-04-23 12:50:18 +00:00
|
|
|
static int parallelsConnectNumOfDefinedNetworks(virConnectPtr conn)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
Convert 'int i' to 'size_t i' in src/parallels/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int ninactive = 0;
|
|
|
|
size_t i;
|
2012-12-11 10:59:45 +00:00
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < privconn->networks.count; i++) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjLock(privconn->networks.objs[i]);
|
|
|
|
if (!virNetworkObjIsActive(privconn->networks.objs[i]))
|
|
|
|
ninactive++;
|
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
}
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
|
|
|
|
return ninactive;
|
|
|
|
}
|
|
|
|
|
2013-04-23 12:50:18 +00:00
|
|
|
static int parallelsConnectListDefinedNetworks(virConnectPtr conn,
|
|
|
|
char **const names,
|
|
|
|
int nnames)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
Convert 'int i' to 'size_t i' in src/parallels/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 14:09:33 +00:00
|
|
|
int got = 0;
|
|
|
|
size_t i;
|
2012-12-11 10:59:45 +00:00
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < privconn->networks.count && got < nnames; i++) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjLock(privconn->networks.objs[i]);
|
|
|
|
if (!virNetworkObjIsActive(privconn->networks.objs[i])) {
|
2013-05-03 12:46:03 +00:00
|
|
|
if (VIR_STRDUP(names[got], privconn->networks.objs[i]->def->name) < 0) {
|
2012-12-11 10:59:45 +00:00
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
got++;
|
|
|
|
}
|
|
|
|
virNetworkObjUnlock(privconn->networks.objs[i]);
|
|
|
|
}
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
return got;
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
parallelsDriverUnlock(privconn);
|
2013-05-21 07:21:20 +00:00
|
|
|
for (i = 0; i < got; i++)
|
2012-12-11 10:59:45 +00:00
|
|
|
VIR_FREE(names[i]);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2013-04-23 12:50:18 +00:00
|
|
|
static int parallelsConnectListAllNetworks(virConnectPtr conn,
|
|
|
|
virNetworkPtr **nets,
|
|
|
|
unsigned int flags)
|
2012-12-11 10:59:45 +00:00
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
virCheckFlags(VIR_CONNECT_LIST_NETWORKS_FILTERS_ALL, -1);
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
2013-06-26 15:42:27 +00:00
|
|
|
ret = virNetworkObjListExport(conn, privconn->networks, nets, NULL, flags);
|
2012-12-11 10:59:45 +00:00
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static virNetworkPtr parallelsNetworkLookupByUUID(virConnectPtr conn,
|
|
|
|
const unsigned char *uuid)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
virNetworkObjPtr network;
|
|
|
|
virNetworkPtr ret = NULL;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
network = virNetworkFindByUUID(&privconn->networks, uuid);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
if (!network) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK,
|
|
|
|
"%s", _("no network with matching uuid"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = virGetNetwork(conn, network->def->name, network->def->uuid);
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (network)
|
|
|
|
virNetworkObjUnlock(network);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static virNetworkPtr parallelsNetworkLookupByName(virConnectPtr conn,
|
|
|
|
const char *name)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = conn->privateData;
|
|
|
|
virNetworkObjPtr network;
|
|
|
|
virNetworkPtr ret = NULL;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
network = virNetworkFindByName(&privconn->networks, name);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
if (!network) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK,
|
|
|
|
_("no network with matching name '%s'"), name);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = virGetNetwork(conn, network->def->name, network->def->uuid);
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (network)
|
|
|
|
virNetworkObjUnlock(network);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *parallelsNetworkGetXMLDesc(virNetworkPtr net,
|
|
|
|
unsigned int flags)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = net->conn->privateData;
|
|
|
|
virNetworkObjPtr network;
|
|
|
|
char *ret = NULL;
|
|
|
|
|
|
|
|
virCheckFlags(VIR_NETWORK_XML_INACTIVE, NULL);
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
network = virNetworkFindByUUID(&privconn->networks, net->uuid);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
|
|
|
|
if (!network) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK,
|
|
|
|
"%s", _("no network with matching uuid"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
ret = virNetworkDefFormat(network->def, flags);
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (network)
|
|
|
|
virNetworkObjUnlock(network);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int parallelsNetworkIsActive(virNetworkPtr net)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = net->conn->privateData;
|
|
|
|
virNetworkObjPtr obj;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
obj = virNetworkFindByUUID(&privconn->networks, net->uuid);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
if (!obj) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK, NULL);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
ret = virNetworkObjIsActive(obj);
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (obj)
|
|
|
|
virNetworkObjUnlock(obj);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int parallelsNetworkIsPersistent(virNetworkPtr net)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = net->conn->privateData;
|
|
|
|
virNetworkObjPtr obj;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
obj = virNetworkFindByUUID(&privconn->networks, net->uuid);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
if (!obj) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK, NULL);
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
ret = obj->persistent;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (obj)
|
|
|
|
virNetworkObjUnlock(obj);
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int parallelsNetworkGetAutostart(virNetworkPtr net,
|
|
|
|
int *autostart)
|
|
|
|
{
|
|
|
|
parallelsConnPtr privconn = net->conn->privateData;
|
|
|
|
virNetworkObjPtr network;
|
|
|
|
int ret = -1;
|
|
|
|
|
|
|
|
parallelsDriverLock(privconn);
|
|
|
|
network = virNetworkFindByUUID(&privconn->networks, net->uuid);
|
|
|
|
parallelsDriverUnlock(privconn);
|
|
|
|
if (!network) {
|
|
|
|
virReportError(VIR_ERR_NO_NETWORK,
|
|
|
|
"%s", _("no network with matching uuid"));
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
|
|
|
|
*autostart = network->autostart;
|
|
|
|
ret = 0;
|
|
|
|
|
2014-03-25 06:57:01 +00:00
|
|
|
cleanup:
|
2012-12-11 10:59:45 +00:00
|
|
|
if (network)
|
|
|
|
virNetworkObjUnlock(network);
|
|
|
|
return ret;
|
|
|
|
}
|
2015-01-20 16:16:26 +00:00
|
|
|
|
|
|
|
virNetworkDriver parallelsNetworkDriver = {
|
|
|
|
.name = "Parallels",
|
2013-04-23 12:50:18 +00:00
|
|
|
.connectNumOfNetworks = parallelsConnectNumOfNetworks, /* 1.0.1 */
|
|
|
|
.connectListNetworks = parallelsConnectListNetworks, /* 1.0.1 */
|
|
|
|
.connectNumOfDefinedNetworks = parallelsConnectNumOfDefinedNetworks, /* 1.0.1 */
|
|
|
|
.connectListDefinedNetworks = parallelsConnectListDefinedNetworks, /* 1.0.1 */
|
|
|
|
.connectListAllNetworks = parallelsConnectListAllNetworks, /* 1.0.1 */
|
2012-12-11 10:59:45 +00:00
|
|
|
.networkLookupByUUID = parallelsNetworkLookupByUUID, /* 1.0.1 */
|
|
|
|
.networkLookupByName = parallelsNetworkLookupByName, /* 1.0.1 */
|
|
|
|
.networkGetXMLDesc = parallelsNetworkGetXMLDesc, /* 1.0.1 */
|
|
|
|
.networkGetAutostart = parallelsNetworkGetAutostart, /* 1.0.1 */
|
|
|
|
.networkIsActive = parallelsNetworkIsActive, /* 1.0.1 */
|
|
|
|
.networkIsPersistent = parallelsNetworkIsPersistent, /* 1.0.1 */
|
|
|
|
};
|