[libvirt] [PATCH] Remove phyp driver

Daniel Henrique Barboza danielhb413 at gmail.com
Wed Dec 18 16:04:09 UTC 2019



On 12/18/19 12:43 PM, Cole Robinson wrote:
> The phyp driver was added in 2009 and does not appear to have had any
> real feature change since 2011. There's virtually no evidence online
> of users actually using it. IMO it's time to kill it.
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>


I understand that this was a feature pushed by IBM years ago. I can't say
about the primary author, but as far as current IBM stance goes, +1
for the removal.

My suggestion would be to put the RFC link in the commit message of this
patch, for reference.


Thanks,


DHB


> ---
> I raised this in 3.5 years ago:
> https://www.redhat.com/archives/libvir-list/2016-April/msg01060.html
> 
> Not much on phyp/ side has changed since then, except dozens of dev
> patches transitioning the code forward.
> 
> That mail also mentions xenapi and hyperv. hyperv saw signs of life
> afterwards and is still around. xenapi has been removed, along with uml.
> 
> Considering the amount of code transitions we are currently undergoing
> (gnulib, glib, memory auto cleanup, etc), phyp/ will probably have an
> uptick of dev energy in the medium term. Let's bite the bullet and
> remove it!
> 
>   docs/aclpolkit.html.in        |    4 -
>   docs/api.html.in              |    2 +-
>   docs/drivers.html.in          |    1 -
>   docs/drvphyp.html.in          |   50 -
>   docs/schemas/capability.rng   |    3 +-
>   docs/schemas/domaincommon.rng |    2 +-
>   libvirt.spec.in               |   11 +-
>   m4/virt-driver-phyp.m4        |   48 -
>   mingw-libvirt.spec.in         |    7 -
>   po/POTFILES.in                |    1 -
>   src/Makefile.am               |    1 -
>   src/README                    |    1 -
>   src/libvirt.c                 |   10 -
>   src/phyp/Makefile.inc.am      |   21 -
>   src/phyp/phyp_driver.c        | 3739 ---------------------------------
>   src/phyp/phyp_driver.h        |   24 -
>   16 files changed, 4 insertions(+), 3921 deletions(-)
>   delete mode 100644 docs/drvphyp.html.in
>   delete mode 100644 m4/virt-driver-phyp.m4
>   delete mode 100644 src/phyp/Makefile.inc.am
>   delete mode 100644 src/phyp/phyp_driver.c
>   delete mode 100644 src/phyp/phyp_driver.h
> 
> diff --git a/docs/aclpolkit.html.in b/docs/aclpolkit.html.in
> index 4a8877d5e7..04cb39006a 100644
> --- a/docs/aclpolkit.html.in
> +++ b/docs/aclpolkit.html.in
> @@ -365,10 +365,6 @@
>             <td>openvz</td>
>             <td>OPENVZ</td>
>           </tr>
> -        <tr>
> -          <td>phyp</td>
> -          <td>PHYP</td>
> -        </tr>
>           <tr>
>             <td>qemu</td>
>             <td>QEMU</td>
> diff --git a/docs/api.html.in b/docs/api.html.in
> index 288b9ecf88..85b196417a 100644
> --- a/docs/api.html.in
> +++ b/docs/api.html.in
> @@ -330,7 +330,7 @@
>       daemon through the <a href="remote.html">remote</a> driver via an
>       <a href="internals/rpc.html">RPC</a>. Some hypervisors do support
>       client-side connections and responses, such as Test, OpenVZ, VMware,
> -    Power VM (phyp), VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo.
> +    VirtualBox (vbox), ESX, Hyper-V, Xen, and Virtuozzo.
>       The libvirtd daemon service is started on the host at system boot
>       time and can also be restarted at any time by a properly privileged
>       user, such as root. The libvirtd daemon uses the same libvirt API
> diff --git a/docs/drivers.html.in b/docs/drivers.html.in
> index 4539eedbcd..8743301ebd 100644
> --- a/docs/drivers.html.in
> +++ b/docs/drivers.html.in
> @@ -34,7 +34,6 @@
>         <li><strong><a href="drvvmware.html">VMware Workstation/Player</a></strong></li>
>         <li><strong><a href="drvxen.html">Xen</a></strong></li>
>         <li><strong><a href="drvhyperv.html">Microsoft Hyper-V</a></strong></li>
> -      <li><strong><a href="drvphyp.html">IBM PowerVM (phyp)</a></strong></li>
>         <li><strong><a href="drvvirtuozzo.html">Virtuozzo</a></strong></li>
>         <li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
>       </ul>
> diff --git a/docs/drvphyp.html.in b/docs/drvphyp.html.in
> deleted file mode 100644
> index 8e0b43c869..0000000000
> --- a/docs/drvphyp.html.in
> +++ /dev/null
> @@ -1,50 +0,0 @@
> -<?xml version="1.0" encoding="UTF-8"?>
> -<!DOCTYPE html>
> -<html xmlns="http://www.w3.org/1999/xhtml">
> -  <body>
> -    <h1>IBM PowerVM hypervisor driver (phyp)</h1>
> -    <ul id="toc"></ul>
> -    <p>
> -        The IBM PowerVM driver can manage both HMC and IVM PowerVM
> -        guests.  VIOS connections are tunneled through HMC.
> -    </p>
> -
> -
> -    <h2><a id="project">Project Links</a></h2>
> -    <ul>
> -      <li>
> -        The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM
> -        PowerVM</a> hypervisor
> -      </li>
> -    </ul>
> -
> -
> -    <h2><a id="uri">Connections to the PowerVM driver</a></h2>
> -    <p>
> -        Some example remote connection URIs for the driver are:
> -    </p>
> -<pre>
> -phyp://user@hmc/system (HMC connection)
> -phyp://user@ivm/system (IVM connection)
> -</pre>
> -    <p>
> -        <strong>Note</strong>: In contrast to other drivers, the
> -        PowerVM (or phyp) driver is a client-side-only driver,
> -        internally using ssh to connect to the specified hmc or ivm
> -        server. Therefore, the <a href="remote.html">remote transport
> -        mechanism</a> provided by the remote driver and libvirtd will
> -        not work, and you cannot use URIs like
> -        <code>phyp+ssh://example.com</code>.
> -    </p>
> -
> -
> -    <h3><a id="uriformat">URI Format</a></h3>
> -    <p>
> -        URIs have this general form (<code>[...]</code> marks an
> -        optional part, <code>{...|...}</code> marks a mandatory choice).
> -    </p>
> -<pre>
> -phyp://[username@]{hmc|ivm}/managed_system
> -</pre>
> -
> -</body></html>
> diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng
> index 26d313d652..91ee523116 100644
> --- a/docs/schemas/capability.rng
> +++ b/docs/schemas/capability.rng
> @@ -408,8 +408,7 @@
>       <element name='os_type'>
>         <choice>
>           <value>xen</value> <!-- Xen 3.0 pv -->
> -        <value>linux</value> <!-- same as 'xen' - meant to be legacy,
> -                                  but is also used by phyp driver -->
> +        <value>linux</value> <!-- same as 'xen' - meant to be legacy -->
>           <value>hvm</value> <!-- unmodified OS -->
>           <value>exe</value> <!-- For container based virt -->
>           <value>uml</value> <!-- user mode linux; NOT USED ANYMORE -->
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index e964773f5e..7238d19268 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -216,7 +216,7 @@
>           <value>vmware</value>
>           <value>hyperv</value>
>           <value>vbox</value>
> -        <value>phyp</value>
> +        <value>phyp</value> <!-- NOT USED ANYMORE -->
>           <value>vz</value>
>           <value>bhyve</value>
>         </choice>
> diff --git a/libvirt.spec.in b/libvirt.spec.in
> index 249a4b5425..5055750d2d 100644
> --- a/libvirt.spec.in
> +++ b/libvirt.spec.in
> @@ -54,7 +54,6 @@
>   # Then the hypervisor drivers that run outside libvirtd, in libvirt.so
>   %define with_openvz        0%{!?_without_openvz:1}
>   %define with_vmware        0%{!?_without_vmware:1}
> -%define with_phyp          0%{!?_without_phyp:1}
>   %define with_esx           0%{!?_without_esx:1}
>   %define with_hyperv        0%{!?_without_hyperv:1}
>   
> @@ -136,7 +135,6 @@
>   %if 0%{?rhel}
>       %define with_openvz 0
>       %define with_vbox 0
> -    %define with_phyp 0
>       %define with_vmware 0
>       %define with_libxl 0
>       %define with_hyperv 0
> @@ -366,7 +364,7 @@ BuildRequires: libcap-ng-devel >= 0.5.0
>   %if %{with_fuse}
>   BuildRequires: fuse-devel >= 2.8.6
>   %endif
> -%if %{with_phyp} || %{with_libssh2}
> +%if %{with_libssh2}
>   BuildRequires: libssh2-devel >= 1.3.0
>   %endif
>   
> @@ -1036,12 +1034,6 @@ exit 1
>       %define arg_libxl --without-libxl
>   %endif
>   
> -%if %{with_phyp}
> -    %define arg_phyp --with-phyp
> -%else
> -    %define arg_phyp --without-phyp
> -%endif
> -
>   %if %{with_esx}
>       %define arg_esx --with-esx
>   %else
> @@ -1164,7 +1156,6 @@ cd %{_vpath_builddir}
>              --with-sasl \
>              --with-polkit \
>              --with-libvirtd \
> -           %{?arg_phyp} \
>              %{?arg_esx} \
>              %{?arg_hyperv} \
>              %{?arg_vmware} \
> diff --git a/m4/virt-driver-phyp.m4 b/m4/virt-driver-phyp.m4
> deleted file mode 100644
> index 7861bf24e1..0000000000
> --- a/m4/virt-driver-phyp.m4
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -dnl The Phyp driver
> -dnl
> -dnl Copyright (C) 2016 Red Hat, Inc.
> -dnl
> -dnl This library is free software; you can redistribute it and/or
> -dnl modify it under the terms of the GNU Lesser General Public
> -dnl License as published by the Free Software Foundation; either
> -dnl version 2.1 of the License, or (at your option) any later version.
> -dnl
> -dnl This library is distributed in the hope that it will be useful,
> -dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
> -dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> -dnl Lesser General Public License for more details.
> -dnl
> -dnl You should have received a copy of the GNU Lesser General Public
> -dnl License along with this library.  If not, see
> -dnl <http://www.gnu.org/licenses/>.
> -dnl
> -
> -AC_DEFUN([LIBVIRT_DRIVER_ARG_PHYP], [
> -  LIBVIRT_ARG_WITH_FEATURE([PHYP], [PHYP], [check])
> -])
> -
> -AC_DEFUN([LIBVIRT_DRIVER_CHECK_PHYP], [
> -  AC_REQUIRE([LIBVIRT_CHECK_SSH2])
> -
> -  if test "$with_phyp" != "no"; then
> -    if test "$with_ssh2" = "no" ; then
> -      if test "$with_phyp" = "check"; then
> -        with_phyp=no
> -      else
> -        AC_MSG_ERROR([libssh2 is required for Phyp driver])
> -      fi
> -    else
> -      with_phyp=yes
> -    fi
> -  fi
> -
> -  if test "$with_phyp" = "yes"; then
> -    AC_DEFINE_UNQUOTED([WITH_PHYP], 1, [whether IBM HMC / IVM driver is enabled])
> -  fi
> -
> -  AM_CONDITIONAL([WITH_PHYP],[test "$with_phyp" = "yes"])
> -])
> -
> -AC_DEFUN([LIBVIRT_DRIVER_RESULT_PHYP], [
> -  LIBVIRT_RESULT([PHYP], [$with_phyp])
> -])
> diff --git a/mingw-libvirt.spec.in b/mingw-libvirt.spec.in
> index f6da67ab52..94d88e2edc 100644
> --- a/mingw-libvirt.spec.in
> +++ b/mingw-libvirt.spec.in
> @@ -19,7 +19,6 @@
>   # The mingw build is client only.  Set up defaults for hypervisor drivers
>   # that talk via a native remote protocol, and for which prereq mingw
>   # libraries exist.
> -%define with_phyp          0%{!?_without_phyp:1}
>   %define with_esx           0%{!?_without_esx:1}
>   # missing libwsman, so can't build hyper-v
>   %define with_hyperv        0%{!?_without_hyperv:0}
> @@ -28,7 +27,6 @@
>   
>   # RHEL ships ESX but not PowerHypervisor, HyperV, or libxenserver (xenapi)
>   %if 0%{?rhel}
> -    %define with_phyp 0
>       %define with_xenapi 0
>       %define with_hyperv 0
>   %endif
> @@ -140,10 +138,6 @@ echo "This RPM requires Fedora >= %{min_fedora}"
>   exit 1
>   %endif
>   
> -%if ! %{with_phyp}
> -    %define _without_phyp --without-phyp
> -%endif
> -
>   %if ! %{with_esx}
>       %define _without_esx --without-esx
>   %endif
> @@ -176,7 +170,6 @@ autoreconf -if
>     --without-sasl \
>     --without-polkit \
>     --without-libvirtd \
> -  %{?_without_phyp} \
>     %{?_without_esx} \
>     %{?_without_hyperv} \
>     --without-vmware \
> diff --git a/po/POTFILES.in b/po/POTFILES.in
> index c26ac9497d..faf173584e 100644
> --- a/po/POTFILES.in
> +++ b/po/POTFILES.in
> @@ -137,7 +137,6 @@
>   @SRCDIR@/src/openvz/openvz_conf.c
>   @SRCDIR@/src/openvz/openvz_driver.c
>   @SRCDIR@/src/openvz/openvz_util.c
> - at SRCDIR@/src/phyp/phyp_driver.c
>   @SRCDIR@/src/qemu/qemu_agent.c
>   @SRCDIR@/src/qemu/qemu_alias.c
>   @SRCDIR@/src/qemu/qemu_backup.c
> diff --git a/src/Makefile.am b/src/Makefile.am
> index cd01796d67..f3d4c28c6d 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -109,7 +109,6 @@ include logging/Makefile.inc.am
>   include locking/Makefile.inc.am
>   include admin/Makefile.inc.am
>   include rpc/Makefile.inc.am
> -include phyp/Makefile.inc.am
>   include test/Makefile.inc.am
>   include esx/Makefile.inc.am
>   include hyperv/Makefile.inc.am
> diff --git a/src/README b/src/README
> index a2260fda68..0c4d3b58c7 100644
> --- a/src/README
> +++ b/src/README
> @@ -30,7 +30,6 @@ Then there are the hypervisor implementations:
>    * hyperv/       - Microsoft Hyper-V support using WinRM
>    * lxc/          - Linux Native Containers
>    * openvz/       - OpenVZ containers using cli tools
> - * phyp/         - IBM Power Hypervisor using CLI tools over SSH
>    * qemu/         - QEMU / KVM using qemu CLI/monitor
>    * remote/       - Generic libvirt native RPC client
>    * test/         - A "mock" driver for testing
> diff --git a/src/libvirt.c b/src/libvirt.c
> index 9d783761e6..c741ebe311 100644
> --- a/src/libvirt.c
> +++ b/src/libvirt.c
> @@ -72,9 +72,6 @@
>   #ifdef WITH_VMWARE
>   # include "vmware/vmware_driver.h"
>   #endif
> -#ifdef WITH_PHYP
> -# include "phyp/phyp_driver.h"
> -#endif
>   #ifdef WITH_ESX
>   # include "esx/esx_driver.h"
>   #endif
> @@ -290,10 +287,6 @@ virGlobalInit(void)
>       if (vmwareRegister() == -1)
>           goto error;
>   #endif
> -#ifdef WITH_PHYP
> -    if (phypRegister() == -1)
> -        goto error;
> -#endif
>   #ifdef WITH_ESX
>       if (esxRegister() == -1)
>           goto error;
> @@ -959,9 +952,6 @@ virConnectOpenInternal(const char *name,
>           if (STREQ(virConnectDriverTab[i]->hypervisorDriver->name, "remote") &&
>               ret->uri != NULL &&
>               (
> -#ifndef WITH_PHYP
> -             STRCASEEQ(ret->uri->scheme, "phyp") ||
> -#endif
>   #ifndef WITH_ESX
>                STRCASEEQ(ret->uri->scheme, "vpx") ||
>                STRCASEEQ(ret->uri->scheme, "esx") ||
> diff --git a/src/phyp/Makefile.inc.am b/src/phyp/Makefile.inc.am
> deleted file mode 100644
> index af556e8589..0000000000
> --- a/src/phyp/Makefile.inc.am
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -# vim: filetype=automake
> -
> -PHYP_DRIVER_SOURCES = \
> -	phyp/phyp_driver.c \
> -	phyp/phyp_driver.h \
> -	$(NULL)
> -
> -DRIVER_SOURCE_FILES += $(addprefix $(srcdir)/,$(PHYP_DRIVER_SOURCES))
> -EXTRA_DIST += $(PHYP_DRIVER_SOURCES)
> -
> -if WITH_PHYP
> -noinst_LTLIBRARIES += libvirt_driver_phyp.la
> -libvirt_la_BUILT_LIBADD += libvirt_driver_phyp.la
> -libvirt_driver_phyp_la_LIBADD = $(SSH2_LIBS)
> -libvirt_driver_phyp_la_CFLAGS = \
> -	$(SSH2_CFLAGS) \
> -	-I$(srcdir)/conf \
> -	$(AM_CFLAGS) \
> -	$(NULL)
> -libvirt_driver_phyp_la_SOURCES = $(PHYP_DRIVER_SOURCES)
> -endif WITH_PHYP
> diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
> deleted file mode 100644
> index 6bd37a6925..0000000000
> --- a/src/phyp/phyp_driver.c
> +++ /dev/null
> @@ -1,3739 +0,0 @@
> -/*
> - * Copyright (C) 2010-2015 Red Hat, Inc.
> - * Copyright IBM Corp. 2009
> - *
> - * phyp_driver.c: ssh layer to access Power Hypervisors
> - *
> - * 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 <sys/types.h>
> -#include <sys/stat.h>
> -#include <stdarg.h>
> -#include <unistd.h>
> -#include <libssh2.h>
> -#include <netinet/in.h>
> -#include <arpa/inet.h>
> -#include <sys/socket.h>
> -#include <netdb.h>
> -#include <fcntl.h>
> -#include <domain_event.h>
> -#include <poll.h>
> -
> -#include "internal.h"
> -#include "virauth.h"
> -#include "datatypes.h"
> -#include "virbuffer.h"
> -#include "viralloc.h"
> -#include "virlog.h"
> -#include "driver.h"
> -#include "virerror.h"
> -#include "viruuid.h"
> -#include "domain_conf.h"
> -#include "storage_conf.h"
> -#include "virfile.h"
> -#include "interface_conf.h"
> -#include "phyp_driver.h"
> -#include "virstring.h"
> -
> -#define VIR_FROM_THIS VIR_FROM_PHYP
> -
> -VIR_LOG_INIT("phyp.phyp_driver");
> -
> -#define LPAR_EXEC_ERR (-1)
> -#define SSH_CONN_ERR (-2)         /* error while trying to connect to remote host */
> -#define SSH_CMD_ERR (-3)          /* error while trying to execute the remote cmd */
> -
> -/* This is the lpar (domain) struct that relates
> - * the ID with UUID generated by the API
> - * */
> -typedef struct _lpar lpar_t;
> -typedef lpar_t *lparPtr;
> -struct _lpar {
> -    unsigned char uuid[VIR_UUID_BUFLEN];
> -    int id;
> -};
> -
> -/* Struct that holds how many lpars (domains) we're
> - * handling and a pointer to an array of lpar structs
> - * */
> -typedef struct _uuid_table uuid_table_t;
> -typedef uuid_table_t *uuid_tablePtr;
> -struct _uuid_table {
> -    size_t nlpars;
> -    lparPtr *lpars;
> -};
> -
> -/* This is the main structure of the driver
> - * */
> -typedef struct _phyp_driver phyp_driver_t;
> -typedef phyp_driver_t *phyp_driverPtr;
> -struct _phyp_driver {
> -    LIBSSH2_SESSION *session;
> -    int sock;
> -
> -    uuid_tablePtr uuid_table;
> -    virCapsPtr caps;
> -    virDomainXMLOptionPtr xmlopt;
> -    int vios_id;
> -
> -    /* system_type:
> -     * 0 = hmc
> -     * 127 = ivm
> -     * */
> -    int system_type;
> -    char *managed_system;
> -};
> -
> -/*
> - * URI: phyp://user@[hmc|ivm]/managed_system
> - * */
> -
> -enum {
> -    HMC = 0,
> -    PHYP_IFACENAME_SIZE = 24,
> -    PHYP_MAC_SIZE = 12,
> -};
> -
> -static int
> -waitsocket(int socket_fd, LIBSSH2_SESSION * session)
> -{
> -    struct pollfd fds[1];
> -    int dir;
> -
> -    memset(fds, 0, sizeof(fds));
> -    fds[0].fd = socket_fd;
> -
> -    /* now make sure we wait in the correct direction */
> -    dir = libssh2_session_block_directions(session);
> -
> -    if (dir & LIBSSH2_SESSION_BLOCK_INBOUND)
> -        fds[0].events |= POLLIN;
> -
> -    if (dir & LIBSSH2_SESSION_BLOCK_OUTBOUND)
> -        fds[0].events |= POLLOUT;
> -
> -    return poll(fds, G_N_ELEMENTS(fds), -1);
> -}
> -
> -/* this function is the layer that manipulates the ssh channel itself
> - * and executes the commands on the remote machine */
> -static char *phypExec(LIBSSH2_SESSION *, const char *, int *, virConnectPtr)
> -    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
> -    ATTRIBUTE_NONNULL(4);
> -static char *
> -phypExec(LIBSSH2_SESSION *session, const char *cmd, int *exit_status,
> -         virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_CHANNEL *channel;
> -    virBuffer tex_ret = VIR_BUFFER_INITIALIZER;
> -    char *buffer = NULL;
> -    size_t buffer_size = 16384;
> -    int exitcode;
> -    int bytecount = 0;
> -    int sock = phyp_driver->sock;
> -    int rc = 0;
> -
> -    if (VIR_ALLOC_N(buffer, buffer_size) < 0)
> -        return NULL;
> -
> -    /* Exec non-blocking on the remove host */
> -    while ((channel = libssh2_channel_open_session(session)) == NULL &&
> -           libssh2_session_last_error(session, NULL, NULL, 0) ==
> -           LIBSSH2_ERROR_EAGAIN) {
> -        if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -            virReportSystemError(errno, "%s",
> -                                 _("unable to wait on libssh2 socket"));
> -            goto err;
> -        }
> -    }
> -
> -    if (channel == NULL)
> -        goto err;
> -
> -    while ((rc = libssh2_channel_exec(channel, cmd)) ==
> -           LIBSSH2_ERROR_EAGAIN) {
> -        if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -            virReportSystemError(errno, "%s",
> -                                 _("unable to wait on libssh2 socket"));
> -            goto err;
> -        }
> -    }
> -
> -    if (rc != 0)
> -        goto err;
> -
> -    for (;;) {
> -        /* loop until we block */
> -        do {
> -            rc = libssh2_channel_read(channel, buffer, buffer_size);
> -            if (rc > 0) {
> -                bytecount += rc;
> -                virBufferAdd(&tex_ret, buffer, -1);
> -            }
> -        }
> -        while (rc > 0);
> -
> -        /* this is due to blocking that would occur otherwise so we loop on
> -         * this condition */
> -        if (rc == LIBSSH2_ERROR_EAGAIN) {
> -            if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -                virReportSystemError(errno, "%s",
> -                                     _("unable to wait on libssh2 socket"));
> -                goto err;
> -            }
> -        } else {
> -            break;
> -        }
> -    }
> -
> -    exitcode = 127;
> -
> -    while ((rc = libssh2_channel_close(channel)) == LIBSSH2_ERROR_EAGAIN) {
> -        if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -            virReportSystemError(errno, "%s",
> -                                 _("unable to wait on libssh2 socket"));
> -            goto err;
> -        }
> -    }
> -
> -    if (rc == 0)
> -        exitcode = libssh2_channel_get_exit_status(channel);
> -
> -    (*exit_status) = exitcode;
> -    libssh2_channel_free(channel);
> -    channel = NULL;
> -    VIR_FREE(buffer);
> -
> -    return virBufferContentAndReset(&tex_ret);
> -
> - err:
> -    (*exit_status) = SSH_CMD_ERR;
> -    virBufferFreeAndReset(&tex_ret);
> -    VIR_FREE(buffer);
> -    return NULL;
> -}
> -
> -/* Convenience wrapper function */
> -static char *phypExecBuffer(LIBSSH2_SESSION *, virBufferPtr buf, int *,
> -                            virConnectPtr, bool) ATTRIBUTE_NONNULL(1)
> -    ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
> -static char *
> -phypExecBuffer(LIBSSH2_SESSION *session, virBufferPtr buf, int *exit_status,
> -               virConnectPtr conn, bool strip_newline)
> -{
> -    char *cmd;
> -    char *ret;
> -
> -    cmd = virBufferContentAndReset(buf);
> -    ret = phypExec(session, cmd, exit_status, conn);
> -    VIR_FREE(cmd);
> -    if (ret && *exit_status == 0 && strip_newline) {
> -        char *nl = strchr(ret, '\n');
> -        if (nl)
> -            *nl = '\0';
> -    }
> -    return ret;
> -}
> -
> -/* Convenience wrapper function */
> -static int phypExecInt(LIBSSH2_SESSION *, virBufferPtr, virConnectPtr, int *)
> -    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
> -static int
> -phypExecInt(LIBSSH2_SESSION *session, virBufferPtr buf, virConnectPtr conn,
> -            int *result)
> -{
> -    char *str;
> -    int ret;
> -    char *char_ptr;
> -
> -    str = phypExecBuffer(session, buf, &ret, conn, true);
> -    if (!str || ret) {
> -        VIR_FREE(str);
> -        return -1;
> -    }
> -    ret = virStrToLong_i(str, &char_ptr, 10, result);
> -    if (ret == 0 && *char_ptr)
> -        VIR_WARN("ignoring suffix during integer parsing of '%s'", str);
> -    VIR_FREE(str);
> -    return ret;
> -}
> -
> -static int
> -phypGetSystemType(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -
> -    ret = phypExec(session, "lshmc -V", &exit_status, conn);
> -
> -    VIR_FREE(ret);
> -    return exit_status;
> -}
> -
> -static int
> -phypGetVIOSPartitionID(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int id = -1;
> -    char *managed_system = phyp_driver->managed_system;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAddLit(&buf, " -r lpar -F lpar_id,lpar_env"
> -                    "|sed -n '/vioserver/ {\n s/,.*$//\n p\n}'");
> -    phypExecInt(session, &buf, conn, &id);
> -    return id;
> -}
> -
> -
> -static virCapsPtr
> -phypCapsInit(void)
> -{
> -    virCapsPtr caps;
> -    virCapsGuestPtr guest;
> -
> -    if ((caps = virCapabilitiesNew(virArchFromHost(),
> -                                   false, false)) == NULL)
> -        goto no_memory;
> -
> -    /* Some machines have problematic NUMA topology causing
> -     * unexpected failures. We don't want to break the QEMU
> -     * driver in this scenario, so log errors & carry on
> -     */
> -    if (!(caps->host.numa = virCapabilitiesHostNUMANewHost()))
> -        goto no_memory;
> -
> -    if (virCapabilitiesInitCaches(caps) < 0)
> -        VIR_WARN("Failed to get host CPU cache info");
> -
> -    if ((guest = virCapabilitiesAddGuest(caps,
> -                                         VIR_DOMAIN_OSTYPE_LINUX,
> -                                         caps->host.arch,
> -                                         NULL, NULL, 0, NULL)) == NULL)
> -        goto no_memory;
> -
> -    if (virCapabilitiesAddGuestDomain(guest, VIR_DOMAIN_VIRT_PHYP,
> -                                      NULL, NULL, 0, NULL) == NULL)
> -        goto no_memory;
> -
> -    return caps;
> -
> - no_memory:
> -    virObjectUnref(caps);
> -    return NULL;
> -}
> -
> -/* This is a generic function that won't be used directly by
> - * libvirt api. The function returns the number of domains
> - * in different states: Running, Not Activated and all:
> - *
> - * type: 0 - Running
> - *       1 - Not Activated
> - *       * - All
> - * */
> -static int
> -phypConnectNumOfDomainsGeneric(virConnectPtr conn, unsigned int type)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int ndom = -1;
> -    char *managed_system = phyp_driver->managed_system;
> -    const char *state;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (type == 0) {
> -        state = "|grep Running";
> -    } else if (type == 1) {
> -        if (system_type == HMC) {
> -            state = "|grep \"Not Activated\"";
> -        } else {
> -            state = "|grep \"Open Firmware\"";
> -        }
> -    } else {
> -        state = " ";
> -    }
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -F lpar_id,state %s |grep -c '^[0-9][0-9]*'",
> -                      state);
> -    phypExecInt(session, &buf, conn, &ndom);
> -    return ndom;
> -}
> -
> -/* This is a generic function that won't be used directly by
> - * libvirt api. The function returns the ids of domains
> - * in different states: Running, and all:
> - *
> - * type: 0 - Running
> - *       1 - all
> - * */
> -static int
> -phypConnectListDomainsGeneric(virConnectPtr conn, int *ids, int nids,
> -                              unsigned int type)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    int got = -1;
> -    char *ret = NULL;
> -    char *line, *next_line;
> -    const char *state;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (type == 0)
> -        state = "|grep Running";
> -    else
> -        state = " ";
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -F lpar_id,state %s | sed -e 's/,.*$//'",
> -                      state);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    /* I need to parse the textual return in order to get the ids */
> -    line = ret;
> -    got = 0;
> -    while (*line && got < nids) {
> -        if (virStrToLong_i(line, &next_line, 10, &ids[got]) == -1) {
> -            VIR_ERROR(_("Cannot parse number from '%s'"), line);
> -            got = -1;
> -            goto cleanup;
> -        }
> -        got++;
> -        line = next_line;
> -        while (*line == '\n')
> -            line++; /* skip \n */
> -    }
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    return got;
> -}
> -
> -static int
> -phypUUIDTable_WriteFile(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    size_t i = 0;
> -    int fd = -1;
> -    char local_file[] = "./uuid_table";
> -
> -    if ((fd = creat(local_file, 0755)) == -1)
> -        goto err;
> -
> -    for (i = 0; i < uuid_table->nlpars; i++) {
> -        if (safewrite(fd, &uuid_table->lpars[i]->id,
> -                      sizeof(uuid_table->lpars[i]->id)) !=
> -            sizeof(uuid_table->lpars[i]->id)) {
> -            VIR_ERROR(_("Unable to write information to local file."));
> -            goto err;
> -        }
> -
> -        if (safewrite(fd, uuid_table->lpars[i]->uuid, VIR_UUID_BUFLEN) !=
> -            VIR_UUID_BUFLEN) {
> -            VIR_ERROR(_("Unable to write information to local file."));
> -            goto err;
> -        }
> -    }
> -
> -    if (VIR_CLOSE(fd) < 0) {
> -        virReportSystemError(errno, _("Could not close %s"),
> -                             local_file);
> -        goto err;
> -    }
> -    return 0;
> -
> - err:
> -    VIR_FORCE_CLOSE(fd);
> -    return -1;
> -}
> -
> -static int
> -phypUUIDTable_Push(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    LIBSSH2_CHANNEL *channel = NULL;
> -    struct stat local_fileinfo;
> -    char buffer[1024];
> -    int rc = 0;
> -    FILE *f = NULL;
> -    size_t nread, sent;
> -    char *ptr;
> -    char local_file[] = "./uuid_table";
> -    char *remote_file = NULL;
> -    int ret = -1;
> -
> -    remote_file = g_strdup_printf("/home/%s/libvirt_uuid_table",
> -                                  NULLSTR(conn->uri->user));
> -
> -    if (stat(local_file, &local_fileinfo) == -1) {
> -        VIR_WARN("Unable to stat local file.");
> -        goto cleanup;
> -    }
> -
> -    if (!(f = fopen(local_file, "rb"))) {
> -        VIR_WARN("Unable to open local file.");
> -        goto cleanup;
> -    }
> -
> -    do {
> -        channel =
> -            libssh2_scp_send(session, remote_file,
> -                             0x1FF & local_fileinfo.st_mode,
> -                             (unsigned long)local_fileinfo.st_size);
> -
> -        if ((!channel) && (libssh2_session_last_errno(session) !=
> -                           LIBSSH2_ERROR_EAGAIN))
> -            goto cleanup;
> -    } while (!channel);
> -
> -    do {
> -        nread = fread(buffer, 1, sizeof(buffer), f);
> -        if (nread <= 0) {
> -            if (feof(f)) {
> -                /* end of file */
> -                break;
> -            } else {
> -                VIR_ERROR(_("Failed to read from %s"), local_file);
> -                goto cleanup;
> -            }
> -        }
> -        ptr = buffer;
> -        sent = 0;
> -
> -        do {
> -            /* write the same data over and over, until error or completion */
> -            rc = libssh2_channel_write(channel, ptr, nread);
> -            if (LIBSSH2_ERROR_EAGAIN == rc) {   /* must loop around */
> -                continue;
> -            } else if (rc > 0) {
> -                /* rc indicates how many bytes were written this time */
> -                sent += rc;
> -            }
> -            ptr += sent;
> -            nread -= sent;
> -        } while (rc > 0 && sent < nread);
> -    } while (1);
> -
> -    ret = 0;
> -
> - cleanup:
> -    VIR_FREE(remote_file);
> -    if (channel) {
> -        libssh2_channel_send_eof(channel);
> -        libssh2_channel_wait_eof(channel);
> -        libssh2_channel_wait_closed(channel);
> -        libssh2_channel_free(channel);
> -        channel = NULL;
> -    }
> -    VIR_FORCE_FCLOSE(f);
> -    return ret;
> -}
> -
> -static int
> -phypUUIDTable_RemLpar(virConnectPtr conn, int id)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    size_t i = 0;
> -
> -    for (i = 0; i <= uuid_table->nlpars; i++) {
> -        if (uuid_table->lpars[i]->id == id) {
> -            uuid_table->lpars[i]->id = -1;
> -            memset(uuid_table->lpars[i]->uuid, 0, VIR_UUID_BUFLEN);
> -        }
> -    }
> -
> -    if (phypUUIDTable_WriteFile(conn) == -1)
> -        goto err;
> -
> -    if (phypUUIDTable_Push(conn) == -1)
> -        goto err;
> -
> -    return 0;
> -
> - err:
> -    return -1;
> -}
> -
> -static int
> -phypUUIDTable_AddLpar(virConnectPtr conn, unsigned char *uuid, int id)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    lparPtr item = NULL;
> -
> -    if (VIR_ALLOC(item) < 0)
> -        goto err;
> -
> -    item->id = id;
> -    memcpy(item->uuid, uuid, VIR_UUID_BUFLEN);
> -
> -    if (VIR_APPEND_ELEMENT_COPY(uuid_table->lpars, uuid_table->nlpars, item) < 0)
> -        goto err;
> -
> -    if (phypUUIDTable_WriteFile(conn) == -1)
> -        goto err;
> -
> -    if (phypUUIDTable_Push(conn) == -1)
> -        goto err;
> -
> -    return 0;
> -
> - err:
> -    VIR_FREE(item);
> -    return -1;
> -}
> -
> -static int
> -phypUUIDTable_ReadFile(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    size_t i = 0;
> -    int fd = -1;
> -    char local_file[] = "./uuid_table";
> -    int rc = 0;
> -    int id;
> -
> -    if ((fd = open(local_file, O_RDONLY)) == -1) {
> -        VIR_WARN("Unable to read information from local file.");
> -        goto err;
> -    }
> -
> -    /* Creating a new data base and writing to local file */
> -    if (VIR_ALLOC_N(uuid_table->lpars, uuid_table->nlpars) >= 0) {
> -        for (i = 0; i < uuid_table->nlpars; i++) {
> -
> -            rc = read(fd, &id, sizeof(int));
> -            if (rc == sizeof(int)) {
> -                if (VIR_ALLOC(uuid_table->lpars[i]) < 0)
> -                    goto err;
> -                uuid_table->lpars[i]->id = id;
> -            } else {
> -                VIR_WARN
> -                    ("Unable to read from information from local file.");
> -                goto err;
> -            }
> -
> -            rc = read(fd, uuid_table->lpars[i]->uuid, VIR_UUID_BUFLEN);
> -            if (rc != VIR_UUID_BUFLEN) {
> -                VIR_WARN("Unable to read information from local file.");
> -                goto err;
> -            }
> -        }
> -    }
> -
> -    VIR_FORCE_CLOSE(fd);
> -    return 0;
> -
> - err:
> -    VIR_FORCE_CLOSE(fd);
> -    return -1;
> -}
> -
> -static int
> -phypUUIDTable_Pull(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    LIBSSH2_CHANNEL *channel = NULL;
> -    struct stat fileinfo;
> -    char buffer[1024];
> -    int rc = 0;
> -    int fd = -1;
> -    int got = 0;
> -    int amount = 0;
> -    int total = 0;
> -    int sock = 0;
> -    char local_file[] = "./uuid_table";
> -    char *remote_file = NULL;
> -    int ret = -1;
> -
> -    remote_file = g_strdup_printf("/home/%s/libvirt_uuid_table",
> -                                  NULLSTR(conn->uri->user));
> -
> -    /* Trying to stat the remote file. */
> -    do {
> -        channel = libssh2_scp_recv(session, remote_file, &fileinfo);
> -
> -        if (!channel) {
> -            if (libssh2_session_last_errno(session) !=
> -                LIBSSH2_ERROR_EAGAIN) {
> -                goto cleanup;
> -            } else {
> -                if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -                    virReportSystemError(errno, "%s",
> -                                         _("unable to wait on libssh2 socket"));
> -                    goto cleanup;
> -                }
> -            }
> -        }
> -    } while (!channel);
> -
> -    /* Creating a new data base based on remote file */
> -    if ((fd = creat(local_file, 0755)) == -1)
> -        goto cleanup;
> -
> -    /* Request a file via SCP */
> -    while (got < fileinfo.st_size) {
> -        do {
> -            amount = sizeof(buffer);
> -
> -            if ((fileinfo.st_size - got) < amount)
> -                amount = fileinfo.st_size - got;
> -
> -            rc = libssh2_channel_read(channel, buffer, amount);
> -            if (rc > 0) {
> -                if (safewrite(fd, buffer, rc) != rc)
> -                    VIR_WARN
> -                        ("Unable to write information to local file.");
> -
> -                got += rc;
> -                total += rc;
> -            }
> -        } while (rc > 0);
> -
> -        if ((rc == LIBSSH2_ERROR_EAGAIN)
> -            && (got < fileinfo.st_size)) {
> -            /* this is due to blocking that would occur otherwise
> -             * so we loop on this condition */
> -
> -            /* now we wait */
> -            if (waitsocket(sock, session) < 0 && errno != EINTR) {
> -                virReportSystemError(errno, "%s",
> -                                     _("unable to wait on libssh2 socket"));
> -                goto cleanup;
> -            }
> -            continue;
> -        }
> -        break;
> -    }
> -    if (VIR_CLOSE(fd) < 0) {
> -        virReportSystemError(errno, _("Could not close %s"),
> -                             local_file);
> -        goto cleanup;
> -    }
> -
> -    ret = 0;
> -
> - cleanup:
> -    if (channel) {
> -        libssh2_channel_send_eof(channel);
> -        libssh2_channel_wait_eof(channel);
> -        libssh2_channel_wait_closed(channel);
> -        libssh2_channel_free(channel);
> -        channel = NULL;
> -    }
> -    VIR_FORCE_CLOSE(fd);
> -    return ret;
> -}
> -
> -static int
> -phypUUIDTable_Init(virConnectPtr conn)
> -{
> -    uuid_tablePtr uuid_table = NULL;
> -    phyp_driverPtr phyp_driver;
> -    int nids_numdomains = 0;
> -    int nids_listdomains = 0;
> -    int *ids = NULL;
> -    size_t i = 0;
> -    int ret = -1;
> -    bool table_created = false;
> -
> -    if ((nids_numdomains = phypConnectNumOfDomainsGeneric(conn, 2)) < 0)
> -        goto cleanup;
> -
> -    if (VIR_ALLOC_N(ids, nids_numdomains) < 0)
> -        goto cleanup;
> -
> -    if ((nids_listdomains =
> -         phypConnectListDomainsGeneric(conn, ids, nids_numdomains, 1)) < 0)
> -        goto cleanup;
> -
> -    /* exit early if there are no domains */
> -    if (nids_numdomains == 0 && nids_listdomains == 0) {
> -        ret = 0;
> -        goto cleanup;
> -    }
> -    if (nids_numdomains != nids_listdomains) {
> -        VIR_ERROR(_("Unable to determine number of domains."));
> -        goto cleanup;
> -    }
> -
> -    phyp_driver = conn->privateData;
> -    uuid_table = phyp_driver->uuid_table;
> -    uuid_table->nlpars = nids_listdomains;
> -
> -    /* try to get the table from server */
> -    if (phypUUIDTable_Pull(conn) == -1) {
> -        /* file not found in the server, creating a new one */
> -        table_created = true;
> -        if (VIR_ALLOC_N(uuid_table->lpars, uuid_table->nlpars) >= 0) {
> -            for (i = 0; i < uuid_table->nlpars; i++) {
> -                if (VIR_ALLOC(uuid_table->lpars[i]) < 0)
> -                    goto cleanup;
> -                uuid_table->lpars[i]->id = ids[i];
> -
> -                if (virUUIDGenerate(uuid_table->lpars[i]->uuid) < 0)
> -                    VIR_WARN("Unable to generate UUID for domain %d",
> -                             ids[i]);
> -            }
> -        } else {
> -            goto cleanup;
> -        }
> -
> -        if (phypUUIDTable_WriteFile(conn) == -1)
> -            goto cleanup;
> -
> -        if (phypUUIDTable_Push(conn) == -1)
> -            goto cleanup;
> -    } else {
> -        if (phypUUIDTable_ReadFile(conn) == -1)
> -            goto cleanup;
> -    }
> -
> -    ret = 0;
> -
> - cleanup:
> -    if (ret < 0 && table_created) {
> -        for (i = 0; i < uuid_table->nlpars; i++)
> -            VIR_FREE(uuid_table->lpars[i]);
> -        VIR_FREE(uuid_table->lpars);
> -    }
> -    VIR_FREE(ids);
> -    return ret;
> -}
> -
> -static void
> -phypUUIDTable_Free(uuid_tablePtr uuid_table)
> -{
> -    size_t i;
> -
> -    if (uuid_table == NULL)
> -        return;
> -
> -    for (i = 0; i < uuid_table->nlpars; i++)
> -        VIR_FREE(uuid_table->lpars[i]);
> -
> -    VIR_FREE(uuid_table->lpars);
> -    VIR_FREE(uuid_table);
> -}
> -
> -#define SPECIALCHARACTER_CASES \
> -    case '&': case ';': case '`': case '@': case '"': case '|': case '*': \
> -    case '?': case '~': case '<': case '>': case '^': case '(': case ')': \
> -    case '[': case ']': case '{': case '}': case '$': case '%': case '#': \
> -    case '\\': case '\n': case '\r': case '\t':
> -
> -static bool
> -contains_specialcharacters(const char *src)
> -{
> -    size_t len = strlen(src);
> -    size_t i = 0;
> -
> -    if (len == 0)
> -        return false;
> -
> -    for (i = 0; i < len; i++) {
> -        switch (src[i]) {
> -        SPECIALCHARACTER_CASES
> -            return true;
> -        default:
> -            continue;
> -        }
> -    }
> -
> -    return false;
> -}
> -
> -static char *
> -escape_specialcharacters(const char *src)
> -{
> -    size_t len = strlen(src);
> -    size_t i = 0, j = 0;
> -    char *dst;
> -
> -    if (len == 0)
> -        return NULL;
> -
> -    if (VIR_ALLOC_N(dst, len + 1) < 0)
> -        return NULL;
> -
> -    for (i = 0; i < len; i++) {
> -        switch (src[i]) {
> -        SPECIALCHARACTER_CASES
> -            continue;
> -        default:
> -            dst[j] = src[i];
> -            j++;
> -        }
> -    }
> -
> -    dst[j] = '\0';
> -
> -    return dst;
> -}
> -
> -static LIBSSH2_SESSION *
> -openSSHSession(virConnectPtr conn, virConnectAuthPtr auth,
> -               int *internal_socket)
> -{
> -    LIBSSH2_SESSION *session;
> -    const char *hostname = conn->uri->server;
> -    char *username = NULL;
> -    char *password = NULL;
> -    int sock = -1;
> -    int rc;
> -    struct addrinfo *ai = NULL, *cur;
> -    struct addrinfo hints;
> -    int ret;
> -    char *pubkey = NULL;
> -    char *pvtkey = NULL;
> -    char *userhome = virGetUserDirectory();
> -    struct stat pvt_stat, pub_stat;
> -
> -    if (userhome == NULL)
> -        goto err;
> -
> -    pubkey = g_strdup_printf("%s/.ssh/id_rsa.pub", userhome);
> -
> -    pvtkey = g_strdup_printf("%s/.ssh/id_rsa", userhome);
> -
> -    if (conn->uri->user != NULL) {
> -        username = g_strdup(conn->uri->user);
> -    } else {
> -        if (!(username = virAuthGetUsername(conn, auth, "ssh", NULL,
> -                                            conn->uri->server)))
> -            goto err;
> -    }
> -
> -    memset(&hints, 0, sizeof(hints));
> -    hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICSERV;
> -    hints.ai_socktype = SOCK_STREAM;
> -    hints.ai_protocol = 0;
> -
> -    ret = getaddrinfo(hostname, "22", &hints, &ai);
> -    if (ret != 0) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       _("Error while getting %s address info"), hostname);
> -        goto err;
> -    }
> -
> -    cur = ai;
> -    while (cur != NULL) {
> -        sock = socket(cur->ai_family, cur->ai_socktype, cur->ai_protocol);
> -        if (sock >= 0) {
> -            if (connect(sock, cur->ai_addr, cur->ai_addrlen) == 0) {
> -                freeaddrinfo(ai);
> -                goto connected;
> -            }
> -            VIR_FORCE_CLOSE(sock);
> -        }
> -        cur = cur->ai_next;
> -    }
> -
> -    virReportError(VIR_ERR_INTERNAL_ERROR,
> -                   _("Failed to connect to %s"), hostname);
> -    freeaddrinfo(ai);
> -    goto err;
> -
> - connected:
> -
> -    (*internal_socket) = sock;
> -
> -    /* Create a session instance */
> -    session = libssh2_session_init();
> -    if (!session)
> -        goto err;
> -
> -    /* tell libssh2 we want it all done non-blocking */
> -    libssh2_session_set_blocking(session, 0);
> -
> -    while ((rc = libssh2_session_startup(session, sock)) ==
> -           LIBSSH2_ERROR_EAGAIN);
> -    if (rc) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       "%s", _("Failure establishing SSH session."));
> -        goto disconnect;
> -    }
> -
> -    /* Trying authentication by pubkey */
> -    if (stat(pvtkey, &pvt_stat) || stat(pubkey, &pub_stat)) {
> -        rc = LIBSSH2_ERROR_SOCKET_NONE;
> -        goto keyboard_interactive;
> -    }
> -
> -    while ((rc =
> -            libssh2_userauth_publickey_fromfile(session, username,
> -                                                pubkey,
> -                                                pvtkey,
> -                                                NULL)) ==
> -           LIBSSH2_ERROR_EAGAIN);
> -
> - keyboard_interactive:
> -    if (rc == LIBSSH2_ERROR_SOCKET_NONE
> -        || rc == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED
> -        || rc == LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) {
> -
> -        if (!(password = virAuthGetPassword(conn, auth, "ssh", username,
> -                                            conn->uri->server)))
> -            goto disconnect;
> -
> -        while ((rc =
> -                libssh2_userauth_password(session, username,
> -                                          password)) ==
> -               LIBSSH2_ERROR_EAGAIN);
> -
> -        if (rc) {
> -            virReportError(VIR_ERR_AUTH_FAILED,
> -                           "%s", _("Authentication failed"));
> -            goto disconnect;
> -        } else {
> -            goto exit;
> -        }
> -
> -    } else if (rc == LIBSSH2_ERROR_NONE) {
> -        goto exit;
> -
> -    } else if (rc == LIBSSH2_ERROR_ALLOC || rc == LIBSSH2_ERROR_SOCKET_SEND
> -               || rc == LIBSSH2_ERROR_SOCKET_TIMEOUT) {
> -        goto err;
> -    }
> -
> - disconnect:
> -    libssh2_session_disconnect(session, "Disconnecting...");
> -    libssh2_session_free(session);
> - err:
> -    VIR_FORCE_CLOSE(sock);
> -    VIR_FREE(userhome);
> -    VIR_FREE(pubkey);
> -    VIR_FREE(pvtkey);
> -    VIR_FREE(username);
> -    VIR_FREE(password);
> -    return NULL;
> -
> - exit:
> -    VIR_FREE(userhome);
> -    VIR_FREE(pubkey);
> -    VIR_FREE(pvtkey);
> -    VIR_FREE(username);
> -    VIR_FREE(password);
> -    return session;
> -}
> -
> -
> -static int
> -phypDomainDefPostParse(virDomainDefPtr def,
> -                       unsigned int parseFlags G_GNUC_UNUSED,
> -                       void *opaque,
> -                       void *parseOpaque G_GNUC_UNUSED)
> -{
> -    phyp_driverPtr driver = opaque;
> -    if (!virCapabilitiesDomainSupported(driver->caps, def->os.type,
> -                                        def->os.arch,
> -                                        def->virtType))
> -        return -1;
> -
> -    return 0;
> -}
> -
> -
> -static int
> -phypDomainDeviceDefPostParse(virDomainDeviceDefPtr dev G_GNUC_UNUSED,
> -                             const virDomainDef *def G_GNUC_UNUSED,
> -                             unsigned int parseFlags G_GNUC_UNUSED,
> -                             void *opaque G_GNUC_UNUSED,
> -                             void *parseOpaque G_GNUC_UNUSED)
> -{
> -    return 0;
> -}
> -
> -
> -virDomainDefParserConfig virPhypDriverDomainDefParserConfig = {
> -    .devicesPostParseCallback = phypDomainDeviceDefPostParse,
> -    .domainPostParseCallback = phypDomainDefPostParse,
> -    .features = VIR_DOMAIN_DEF_FEATURE_NAME_SLASH,
> -};
> -
> -
> -static virDrvOpenStatus
> -phypConnectOpen(virConnectPtr conn,
> -                virConnectAuthPtr auth,
> -                virConfPtr conf G_GNUC_UNUSED,
> -                unsigned int flags)
> -{
> -    LIBSSH2_SESSION *session = NULL;
> -    int internal_socket = -1;
> -    uuid_tablePtr uuid_table = NULL;
> -    phyp_driverPtr phyp_driver = NULL;
> -    char *char_ptr;
> -    char *managed_system = NULL;
> -
> -    virCheckFlags(VIR_CONNECT_RO, VIR_DRV_OPEN_ERROR);
> -
> -    if (VIR_ALLOC(phyp_driver) < 0)
> -        goto failure;
> -
> -    phyp_driver->sock = -1;
> -
> -    if (VIR_ALLOC(uuid_table) < 0)
> -        goto failure;
> -
> -    if (conn->uri->path[0] != '\0') {
> -        /* need to shift one byte in order to remove the first "/" of URI component */
> -        managed_system = g_strdup(conn->uri->path + (conn->uri->path[0] == '/'));
> -
> -        /* here we are handling only the first component of the path,
> -         * so skipping the second:
> -         * */
> -        char_ptr = strchr(managed_system, '/');
> -
> -        if (char_ptr)
> -            *char_ptr = '\0';
> -
> -        if (contains_specialcharacters(conn->uri->path)) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           "%s",
> -                           _("Error parsing 'path'. Invalid characters."));
> -            goto failure;
> -        }
> -    }
> -
> -    if ((session = openSSHSession(conn, auth, &internal_socket)) == NULL) {
> -        virReportError(VIR_ERR_INTERNAL_ERROR,
> -                       "%s", _("Error while opening SSH session."));
> -        goto failure;
> -    }
> -
> -    phyp_driver->session = session;
> -    phyp_driver->sock = internal_socket;
> -
> -    uuid_table->nlpars = 0;
> -    uuid_table->lpars = NULL;
> -
> -    if (conn->uri->path)
> -        phyp_driver->managed_system = managed_system;
> -
> -    phyp_driver->uuid_table = uuid_table;
> -    if ((phyp_driver->caps = phypCapsInit()) == NULL)
> -        goto failure;
> -
> -    virPhypDriverDomainDefParserConfig.priv = phyp_driver;
> -    if (!(phyp_driver->xmlopt = virDomainXMLOptionNew(&virPhypDriverDomainDefParserConfig,
> -                                                      NULL, NULL, NULL, NULL)))
> -        goto failure;
> -
> -    conn->privateData = phyp_driver;
> -
> -    if ((phyp_driver->system_type = phypGetSystemType(conn)) == -1)
> -        goto failure;
> -
> -    if (phypUUIDTable_Init(conn) == -1)
> -        goto failure;
> -
> -    if (phyp_driver->system_type == HMC) {
> -        if ((phyp_driver->vios_id = phypGetVIOSPartitionID(conn)) == -1)
> -            goto failure;
> -    }
> -
> -    return VIR_DRV_OPEN_SUCCESS;
> -
> - failure:
> -    VIR_FREE(managed_system);
> -
> -    if (phyp_driver != NULL) {
> -        virObjectUnref(phyp_driver->caps);
> -        virObjectUnref(phyp_driver->xmlopt);
> -        VIR_FREE(phyp_driver);
> -    }
> -
> -    phypUUIDTable_Free(uuid_table);
> -
> -    if (session != NULL) {
> -        libssh2_session_disconnect(session, "Disconnecting...");
> -        libssh2_session_free(session);
> -    }
> -
> -    VIR_FORCE_CLOSE(internal_socket);
> -
> -    return VIR_DRV_OPEN_ERROR;
> -}
> -
> -static int
> -phypConnectClose(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -
> -    libssh2_session_disconnect(session, "Disconnecting...");
> -    libssh2_session_free(session);
> -
> -    virObjectUnref(phyp_driver->caps);
> -    virObjectUnref(phyp_driver->xmlopt);
> -    phypUUIDTable_Free(phyp_driver->uuid_table);
> -    VIR_FREE(phyp_driver->managed_system);
> -    VIR_FORCE_CLOSE(phyp_driver->sock);
> -    VIR_FREE(phyp_driver);
> -    return 0;
> -}
> -
> -
> -static int
> -phypConnectIsEncrypted(virConnectPtr conn G_GNUC_UNUSED)
> -{
> -    /* Phyp uses an SSH tunnel, so is always encrypted */
> -    return 1;
> -}
> -
> -
> -static int
> -phypConnectIsSecure(virConnectPtr conn G_GNUC_UNUSED)
> -{
> -    /* Phyp uses an SSH tunnel, so is always secure */
> -    return 1;
> -}
> -
> -
> -static int
> -phypConnectIsAlive(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    /* XXX we should be able to do something better but this is simple, safe,
> -     * and good enough for now. In worst case, the function will return true
> -     * even though the connection is not alive.
> -     */
> -    if (phyp_driver->session)
> -        return 1;
> -    else
> -        return 0;
> -}
> -
> -
> -static int
> -phypDomainIsUpdated(virDomainPtr conn G_GNUC_UNUSED)
> -{
> -    return 0;
> -}
> -
> -/* return the lpar_id given a name and a managed system name */
> -static int
> -phypGetLparID(LIBSSH2_SESSION * session, const char *managed_system,
> -              const char *name, virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    int system_type = phyp_driver->system_type;
> -    int lpar_id = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " --filter lpar_names=%s -F lpar_id", name);
> -    phypExecInt(session, &buf, conn, &lpar_id);
> -    return lpar_id;
> -}
> -
> -/* return the lpar name given a lpar_id and a managed system name */
> -static char *
> -phypGetLparNAME(LIBSSH2_SESSION * session, const char *managed_system,
> -                unsigned int lpar_id, virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    int system_type = phyp_driver->system_type;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " --filter lpar_ids=%d -F name", lpar_id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -
> -/* Search into the uuid_table for a lpar_uuid given a lpar_id
> - * and a managed system name
> - *
> - * return:  0 - record found
> - *         -1 - not found
> - * */
> -static int
> -phypGetLparUUID(unsigned char *uuid, int lpar_id, virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    lparPtr *lpars = uuid_table->lpars;
> -    size_t i = 0;
> -
> -    for (i = 0; i < uuid_table->nlpars; i++) {
> -        if (lpars[i]->id == lpar_id) {
> -            memcpy(uuid, lpars[i]->uuid, VIR_UUID_BUFLEN);
> -            return 0;
> -        }
> -    }
> -
> -    return -1;
> -}
> -
> -/*
> - * type:
> - * 0 - maxmem
> - * 1 - memory
> - * */
> -static unsigned long
> -phypGetLparMem(virConnectPtr conn, const char *managed_system, int lpar_id,
> -               int type)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int memory = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (type != 1 && type != 0)
> -        return 0;
> -
> -    virBufferAddLit(&buf, "lshwres");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r mem --level lpar -F %s --filter lpar_ids=%d",
> -                      type ? "curr_mem" : "curr_max_mem", lpar_id);
> -    phypExecInt(session, &buf, conn, &memory);
> -    return memory;
> -}
> -
> -static unsigned long
> -phypGetLparCPUGeneric(virConnectPtr conn, const char *managed_system,
> -                      int lpar_id, int type)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int vcpus = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lshwres");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r proc --level lpar -F %s --filter lpar_ids=%d",
> -                      type ? "curr_max_procs" : "curr_procs", lpar_id);
> -    phypExecInt(session, &buf, conn, &vcpus);
> -    return vcpus;
> -}
> -
> -static unsigned long
> -phypGetLparCPU(virConnectPtr conn, const char *managed_system, int lpar_id)
> -{
> -    return phypGetLparCPUGeneric(conn, managed_system, lpar_id, 0);
> -}
> -
> -static int
> -phypDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
> -{
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    char *managed_system = phyp_driver->managed_system;
> -
> -    if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
> -        virReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
> -        return -1;
> -    }
> -
> -    return phypGetLparCPUGeneric(dom->conn, managed_system, dom->id, 1);
> -}
> -
> -static int
> -phypDomainGetMaxVcpus(virDomainPtr dom)
> -{
> -    return phypDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
> -                                         VIR_DOMAIN_VCPU_MAXIMUM));
> -}
> -
> -static int
> -phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
> -                  const char *lpar_name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int remote_slot = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lshwres");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r virtualio --rsubtype scsi -F "
> -                      "remote_slot_num --filter lpar_names=%s", lpar_name);
> -    phypExecInt(session, &buf, conn, &remote_slot);
> -    return remote_slot;
> -}
> -
> -/* XXX - is this needed? */
> -static char *phypGetBackingDevice(virConnectPtr, const char *, char *)
> -    G_GNUC_UNUSED;
> -static char *
> -phypGetBackingDevice(virConnectPtr conn, const char *managed_system,
> -                     char *lpar_name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *ret = NULL;
> -    int remote_slot = 0;
> -    int exit_status = 0;
> -    char *char_ptr;
> -    char *backing_device = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if ((remote_slot =
> -         phypGetRemoteSlot(conn, managed_system, lpar_name)) == -1)
> -        return NULL;
> -
> -    virBufferAddLit(&buf, "lshwres");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r virtualio --rsubtype scsi -F "
> -                      "backing_devices --filter slots=%d", remote_slot);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    /* here is a little trick to deal returns of this kind:
> -     *
> -     * 0x8100000000000000//lv01
> -     *
> -     * the information we really need is only lv01, so we
> -     * need to skip a lot of things on the string.
> -     * */
> -    char_ptr = strchr(ret, '/');
> -
> -    if (char_ptr) {
> -        char_ptr++;
> -        if (char_ptr[0] == '/')
> -            char_ptr++;
> -        else
> -            goto cleanup;
> -
> -        backing_device = g_strdup(char_ptr);
> -    } else {
> -        backing_device = g_steal_pointer(&ret);
> -    }
> -
> -    char_ptr = strchr(backing_device, '\n');
> -
> -    if (char_ptr)
> -        *char_ptr = '\0';
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return backing_device;
> -}
> -
> -static char *
> -phypGetLparProfile(virConnectPtr conn, int lpar_id)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r prof --filter lpar_ids=%d -F name|head -n 1",
> -                      lpar_id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -static int
> -phypGetVIOSNextSlotNumber(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    char *profile = NULL;
> -    int slot = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (!(profile = phypGetLparProfile(conn, vios_id))) {
> -        VIR_ERROR(_("Unable to get VIOS profile name."));
> -        return -1;
> -    }
> -
> -    virBufferAddLit(&buf, "lssyscfg");
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -
> -    virBufferAsprintf(&buf, " -r prof --filter "
> -                      "profile_names=%s -F virtual_eth_adapters,"
> -                      "virtual_opti_pool_id,virtual_scsi_adapters,"
> -                      "virtual_serial_adapters|sed -e 's/\"//g' -e "
> -                      "'s/,/\\n/g'|sed -e 's/\\(^[0-9][0-9]\\*\\).*$/\\1/'"
> -                      "|sort|tail -n 1", profile);
> -    if (phypExecInt(session, &buf, conn, &slot) < 0)
> -        return -1;
> -    return slot + 1;
> -}
> -
> -static int
> -phypCreateServerSCSIAdapter(virConnectPtr conn)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    char *profile = NULL;
> -    int slot = 0;
> -    char *vios_name = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (!
> -        (vios_name =
> -         phypGetLparNAME(session, managed_system, vios_id, conn))) {
> -        VIR_ERROR(_("Unable to get VIOS name"));
> -        goto cleanup;
> -    }
> -
> -    if (!(profile = phypGetLparProfile(conn, vios_id))) {
> -        VIR_ERROR(_("Unable to get VIOS profile name."));
> -        goto cleanup;
> -    }
> -
> -    if ((slot = phypGetVIOSNextSlotNumber(conn)) == -1) {
> -        VIR_ERROR(_("Unable to get free slot number"));
> -        goto cleanup;
> -    }
> -
> -    /* Listing all the virtual_scsi_adapter interfaces, the new adapter must
> -     * be appended to this list
> -     * */
> -    virBufferAddLit(&buf, "lssyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r prof --filter lpar_ids=%d,profile_names=%s"
> -                      " -F virtual_scsi_adapters|sed -e s/\\\"//g",
> -                      vios_id, profile);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    /* Here I change the VIOS configuration to append the new adapter
> -     * with the free slot I got with phypGetVIOSNextSlotNumber.
> -     * */
> -    virBufferAddLit(&buf, "chsyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r prof -i 'name=%s,lpar_id=%d,"
> -                      "\"virtual_scsi_adapters=%s,%d/server/any/any/1\"'",
> -                      vios_name, vios_id, ret, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    /* Finally I add the new scsi adapter to VIOS using the same slot
> -     * I used in the VIOS configuration.
> -     * */
> -    virBufferAddLit(&buf, "chhwres -r virtualio --rsubtype scsi");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -p %s -o a -s %d -d 0 -a \"adapter_type=server\"",
> -                      vios_name, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(profile);
> -    VIR_FREE(vios_name);
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static char *
> -phypGetVIOSFreeSCSIAdapter(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAddLit(&buf, "lsmap -all -field svsa backing -fmt , ");
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed '/,[^.*]/d; s/,//g; q'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -
> -static int
> -phypDomainAttachDeviceFlags(virDomainPtr domain,
> -                            const char *xml,
> -                            unsigned int flags)
> -{
> -    int result = -1;
> -    virConnectPtr conn = domain->conn;
> -    phyp_driverPtr phyp_driver = domain->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    char *scsi_adapter = NULL;
> -    int slot = 0;
> -    char *vios_name = NULL;
> -    char *profile = NULL;
> -    virDomainDeviceDefPtr dev = NULL;
> -    virDomainDefPtr def = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *domain_name = NULL;
> -
> -    virCheckFlags(0, -1);
> -
> -    if (!(def = virDomainDefNew()))
> -        goto cleanup;
> -
> -    domain_name = escape_specialcharacters(domain->name);
> -
> -    if (domain_name == NULL)
> -        goto cleanup;
> -
> -    def->os.type = VIR_DOMAIN_OSTYPE_LINUX;
> -
> -    dev = virDomainDeviceDefParse(xml, def, NULL, NULL,
> -                                  VIR_DOMAIN_DEF_PARSE_INACTIVE);
> -    if (!dev)
> -        goto cleanup;
> -
> -    if (!
> -        (vios_name =
> -         phypGetLparNAME(session, managed_system, vios_id, conn))) {
> -        VIR_ERROR(_("Unable to get VIOS name"));
> -        goto cleanup;
> -    }
> -
> -    /* First, let's look for a free SCSI Adapter
> -     * */
> -    if (!(scsi_adapter = phypGetVIOSFreeSCSIAdapter(conn))) {
> -        /* If not found, let's create one.
> -         * */
> -        if (phypCreateServerSCSIAdapter(conn) == -1) {
> -            VIR_ERROR(_("Unable to create new virtual adapter"));
> -            goto cleanup;
> -        } else {
> -            if (!(scsi_adapter = phypGetVIOSFreeSCSIAdapter(conn))) {
> -                VIR_ERROR(_("Unable to create new virtual adapter"));
> -                goto cleanup;
> -            }
> -        }
> -    }
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "mkvdev -vdev %s -vadapter %s",
> -                      virDomainDiskGetSource(dev->data.disk), scsi_adapter);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    if (!(profile = phypGetLparProfile(conn, domain->id))) {
> -        VIR_ERROR(_("Unable to get VIOS profile name."));
> -        goto cleanup;
> -    }
> -
> -    /* Let's get the slot number for the adapter we just created
> -     * */
> -    virBufferAddLit(&buf, "lshwres -r virtualio --rsubtype scsi");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " slot_num,backing_device|grep %s|cut -d, -f1",
> -                      virDomainDiskGetSource(dev->data.disk));
> -    if (phypExecInt(session, &buf, conn, &slot) < 0)
> -        goto cleanup;
> -
> -    /* Listing all the virtual_scsi_adapter interfaces, the new adapter must
> -     * be appended to this list
> -     * */
> -    virBufferAddLit(&buf, "lssyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r prof --filter lpar_ids=%d,profile_names=%s"
> -                      " -F virtual_scsi_adapters|sed -e 's/\"//g'",
> -                      vios_id, profile);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    /* Here I change the LPAR configuration to append the new adapter
> -     * with the new slot we just created
> -     * */
> -    virBufferAddLit(&buf, "chsyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r prof -i 'name=%s,lpar_id=%d,"
> -                      "\"virtual_scsi_adapters=%s,%d/client/%d/%s/0\"'",
> -                      domain_name, domain->id, ret, slot,
> -                      vios_id, vios_name);
> -    if (phypExecInt(session, &buf, conn, &slot) < 0)
> -        goto cleanup;
> -
> -    /* Finally I add the new scsi adapter to VIOS using the same slot
> -     * I used in the VIOS configuration.
> -     * */
> -    virBufferAddLit(&buf, "chhwres -r virtualio --rsubtype scsi");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -p %s -o a -s %d -d 0 -a \"adapter_type=server\"",
> -                      domain_name, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL) {
> -        VIR_ERROR(_
> -                   ("Possibly you don't have IBM Tools installed in your LPAR."
> -                    "Contact your support to enable this feature."));
> -        goto cleanup;
> -    }
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    virDomainDeviceDefFree(dev);
> -    virDomainDefFree(def);
> -    VIR_FREE(vios_name);
> -    VIR_FREE(scsi_adapter);
> -    VIR_FREE(profile);
> -    VIR_FREE(domain_name);
> -
> -    return result;
> -}
> -
> -static int
> -phypDomainAttachDevice(virDomainPtr domain, const char *xml)
> -{
> -    return phypDomainAttachDeviceFlags(domain, xml, 0);
> -}
> -
> -static char *
> -phypStorageVolGetKey(virConnectPtr conn, const char *name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lslv %s -field lvid", name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed -e 's/^LV IDENTIFIER://' -e 's/ //g'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -static char *
> -phypGetStoragePoolDevice(virConnectPtr conn, char *name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lssp -detail -sp %s -field name", name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed '1d; s/ //g'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -static unsigned long int
> -phypGetStoragePoolSize(virConnectPtr conn, char *name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int sp_size = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lssp -detail -sp %s -field size", name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed '1d; s/ //g'");
> -    phypExecInt(session, &buf, conn, &sp_size);
> -    return sp_size;
> -}
> -
> -static char *
> -phypBuildVolume(virConnectPtr conn, const char *lvname, const char *spname,
> -                unsigned int capacity)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int vios_id = phyp_driver->vios_id;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *key = NULL;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "mklv -lv %s %s %d", lvname, spname, capacity);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0) {
> -        VIR_ERROR(_("Unable to create Volume: %s"), NULLSTR(ret));
> -        goto cleanup;
> -    }
> -
> -    key = phypStorageVolGetKey(conn, lvname);
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return key;
> -}
> -
> -static virStorageVolPtr
> -phypStorageVolLookupByName(virStoragePoolPtr pool, const char *volname)
> -{
> -    char *key;
> -    virStorageVolPtr vol;
> -
> -    key = phypStorageVolGetKey(pool->conn, volname);
> -
> -    if (key == NULL)
> -        return NULL;
> -
> -    vol = virGetStorageVol(pool->conn, pool->name, volname, key, NULL, NULL);
> -
> -    VIR_FREE(key);
> -
> -    return vol;
> -}
> -
> -static virStorageVolPtr
> -phypStorageVolCreateXML(virStoragePoolPtr pool,
> -                        const char *xml, unsigned int flags)
> -{
> -    virCheckFlags(0, NULL);
> -
> -    virStorageVolPtr vol = NULL;
> -    virStorageVolPtr dup_vol = NULL;
> -    char *key = NULL;
> -    g_autoptr(virStorageVolDef) voldef = NULL;
> -    g_autoptr(virStoragePoolDef) spdef = NULL;
> -
> -    if (VIR_ALLOC(spdef) < 0)
> -        return NULL;
> -
> -    /* Filling spdef manually
> -     * */
> -    if (pool->name != NULL) {
> -        spdef->name = pool->name;
> -    } else {
> -        VIR_ERROR(_("Unable to determine storage pool's name."));
> -        goto err;
> -    }
> -
> -    if (memcpy(spdef->uuid, pool->uuid, VIR_UUID_BUFLEN) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage pool's uuid."));
> -        goto err;
> -    }
> -
> -    if ((spdef->capacity =
> -         phypGetStoragePoolSize(pool->conn, pool->name)) == -1) {
> -        VIR_ERROR(_("Unable to determine storage pools's size."));
> -        goto err;
> -    }
> -
> -    /* Information not available */
> -    spdef->allocation = 0;
> -    spdef->available = 0;
> -
> -    spdef->source.ndevice = 1;
> -
> -    /*XXX source adapter not working properly, should show hdiskX */
> -    if ((spdef->source.adapter.data.scsi_host.name =
> -         phypGetStoragePoolDevice(pool->conn, pool->name)) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage pools's source adapter."));
> -        goto err;
> -    }
> -
> -    if ((voldef = virStorageVolDefParseString(spdef, xml, 0)) == NULL) {
> -        VIR_ERROR(_("Error parsing volume XML."));
> -        goto err;
> -    }
> -
> -    /* checking if this name already exists on this system */
> -    if ((dup_vol = phypStorageVolLookupByName(pool, voldef->name)) != NULL) {
> -        VIR_ERROR(_("StoragePool name already exists."));
> -        virObjectUnref(dup_vol);
> -        goto err;
> -    }
> -
> -    /* The key must be NULL, the Power Hypervisor creates a key
> -     * in the moment you create the volume.
> -     * */
> -    if (voldef->key) {
> -        VIR_ERROR(_("Key must be empty, Power Hypervisor will create one for you."));
> -        goto err;
> -    }
> -
> -    if (!voldef->target.capacity) {
> -        VIR_ERROR(_("Capacity cannot be empty."));
> -        goto err;
> -    }
> -
> -    key = phypBuildVolume(pool->conn, voldef->name, spdef->name,
> -                          voldef->target.capacity);
> -
> -    if (key == NULL)
> -        goto err;
> -
> -    if ((vol =
> -         virGetStorageVol(pool->conn, pool->name, voldef->name,
> -                          key, NULL, NULL)) == NULL)
> -        goto err;
> -
> -    VIR_FREE(key);
> -
> -    return vol;
> -
> - err:
> -    VIR_FREE(key);
> -    virObjectUnref(vol);
> -    return NULL;
> -}
> -
> -static char *
> -phypStorageVolGetPhysicalVolumeByStoragePool(virStorageVolPtr vol, char *sp)
> -{
> -    virConnectPtr conn = vol->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lssp -detail -sp %s -field pvname", sp);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed 1d");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0)
> -        VIR_FREE(ret);
> -    return ret;
> -}
> -
> -static virStorageVolPtr
> -phypStorageVolLookupByPath(virConnectPtr conn, const char *volname)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    char *key = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    virStorageVolPtr vol = NULL;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lslv %s -field vgname", volname);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed -e 's/^VOLUME GROUP://g' -e 's/ //g'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    key = phypStorageVolGetKey(conn, volname);
> -
> -    if (key == NULL)
> -        goto cleanup;
> -
> -    vol = virGetStorageVol(conn, ret, volname, key, NULL, NULL);
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    VIR_FREE(key);
> -
> -    return vol;
> -}
> -
> -static int
> -phypGetStoragePoolUUID(virConnectPtr conn, unsigned char *uuid,
> -                       const char *name)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lsdev -dev %s -attr vgserial_id", name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed '1,2d'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    if (memcpy(uuid, ret, VIR_UUID_BUFLEN) == NULL)
> -        goto cleanup;
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static virStoragePoolPtr
> -phypStoragePoolLookupByName(virConnectPtr conn, const char *name)
> -{
> -    unsigned char uuid[VIR_UUID_BUFLEN];
> -
> -    if (phypGetStoragePoolUUID(conn, uuid, name) == -1)
> -        return NULL;
> -
> -    return virGetStoragePool(conn, name, uuid, NULL, NULL);
> -}
> -
> -static char *
> -phypStorageVolGetXMLDesc(virStorageVolPtr vol, unsigned int flags)
> -{
> -    virStorageVolDef voldef;
> -    virStoragePoolDef pool;
> -    virStoragePoolPtr sp;
> -    char *xml = NULL;
> -
> -    virCheckFlags(0, NULL);
> -
> -    memset(&voldef, 0, sizeof(virStorageVolDef));
> -    memset(&pool, 0, sizeof(virStoragePoolDef));
> -
> -    sp = phypStoragePoolLookupByName(vol->conn, vol->pool);
> -
> -    if (!sp)
> -        goto cleanup;
> -
> -    if (sp->name != NULL) {
> -        pool.name = sp->name;
> -    } else {
> -        VIR_ERROR(_("Unable to determine storage sp's name."));
> -        goto cleanup;
> -    }
> -
> -    if (memcpy(pool.uuid, sp->uuid, VIR_UUID_BUFLEN) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage sp's uuid."));
> -        goto cleanup;
> -    }
> -
> -    if ((pool.capacity = phypGetStoragePoolSize(sp->conn, sp->name)) == -1) {
> -        VIR_ERROR(_("Unable to determine storage sps's size."));
> -        goto cleanup;
> -    }
> -
> -    /* Information not available */
> -    pool.allocation = 0;
> -    pool.available = 0;
> -
> -    pool.source.ndevice = 1;
> -
> -    if ((pool.source.adapter.data.scsi_host.name =
> -         phypGetStoragePoolDevice(sp->conn, sp->name)) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage sps's source adapter."));
> -        goto cleanup;
> -    }
> -
> -    if (vol->name != NULL) {
> -        voldef.name = vol->name;
> -    } else {
> -        VIR_ERROR(_("Unable to determine storage pool's name."));
> -        goto cleanup;
> -    }
> -
> -    voldef.key = g_strdup(vol->key);
> -
> -    voldef.type = VIR_STORAGE_POOL_LOGICAL;
> -
> -    xml = virStorageVolDefFormat(&pool, &voldef);
> -
> -    VIR_FREE(voldef.key);
> -
> - cleanup:
> -    virObjectUnref(sp);
> -    return xml;
> -}
> -
> -/* The Volume Group path here will be treated as suggested in the
> - * email on the libvirt mailling list. As soon as I can't get the
> - * path for every volume, the path will be a representation in
> - * the form:
> - *
> - * /physical_volume/storage_pool/logical_volume
> - *
> - * */
> -static char *
> -phypStorageVolGetPath(virStorageVolPtr vol)
> -{
> -    virConnectPtr conn = vol->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    char *path = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *pv;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lslv %s -field vgname", vol->name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAsprintf(&buf,
> -                      "|sed -e 's/^VOLUME GROUP://g' -e 's/ //g'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    pv = phypStorageVolGetPhysicalVolumeByStoragePool(vol, ret);
> -
> -    if (!pv)
> -        goto cleanup;
> -
> -    path = g_strdup_printf("/%s/%s/%s", pv, ret, vol->name);
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    VIR_FREE(path);
> -
> -    return path;
> -}
> -
> -static int
> -phypStoragePoolListVolumes(virStoragePoolPtr pool, char **const volumes,
> -                           int nvolumes)
> -{
> -    bool success = false;
> -    virConnectPtr conn = pool->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    int got = 0;
> -    size_t i;
> -    char *ret = NULL;
> -    char *volumes_list = NULL;
> -    char *char_ptr = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "lsvg -lv %s -field lvname", pool->name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|sed '1,2d'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    /* I need to parse the textual return in order to get the volumes */
> -    if (exit_status < 0 || ret == NULL) {
> -        goto cleanup;
> -    } else {
> -        volumes_list = ret;
> -
> -        while (got < nvolumes) {
> -            char_ptr = strchr(volumes_list, '\n');
> -
> -            if (char_ptr) {
> -                *char_ptr = '\0';
> -                volumes[got++] = g_strdup(volumes_list);
> -                char_ptr++;
> -                volumes_list = char_ptr;
> -            } else {
> -                break;
> -            }
> -        }
> -    }
> -
> -    success = true;
> -
> - cleanup:
> -    if (!success) {
> -        for (i = 0; i < got; i++)
> -            VIR_FREE(volumes[i]);
> -
> -        got = -1;
> -    }
> -    VIR_FREE(ret);
> -    return got;
> -}
> -
> -static int
> -phypStoragePoolNumOfVolumes(virStoragePoolPtr pool)
> -{
> -    virConnectPtr conn = pool->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int nvolumes = -1;
> -    char *managed_system = phyp_driver->managed_system;
> -    int vios_id = phyp_driver->vios_id;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -    virBufferAsprintf(&buf, "lsvg -lv %s -field lvname", pool->name);
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    virBufferAddLit(&buf, "|grep -c '^.*$'");
> -    if (phypExecInt(session, &buf, conn, &nvolumes) < 0)
> -        return -1;
> -
> -    /* We need to remove 2 line from the header text output */
> -    return nvolumes - 2;
> -}
> -
> -static int
> -phypStoragePoolDestroy(virStoragePoolPtr pool)
> -{
> -    int result = -1;
> -    virConnectPtr conn = pool->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int vios_id = phyp_driver->vios_id;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "rmsp %s", pool->name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0) {
> -        VIR_ERROR(_("Unable to destroy Storage Pool: %s"), NULLSTR(ret));
> -        goto cleanup;
> -    }
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static int
> -phypBuildStoragePool(virConnectPtr conn, virStoragePoolDefPtr def)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virStoragePoolSource source = def->source;
> -    int vios_id = phyp_driver->vios_id;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (source.adapter.type != VIR_STORAGE_ADAPTER_TYPE_SCSI_HOST) {
> -        virReportError(VIR_ERR_XML_ERROR, "%s",
> -                       _("Only 'scsi_host' adapter is supported"));
> -        goto cleanup;
> -    }
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAsprintf(&buf, "mksp -f %schild %s", def->name,
> -                      source.adapter.data.scsi_host.name);
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0) {
> -        VIR_ERROR(_("Unable to create Storage Pool: %s"), NULLSTR(ret));
> -        goto cleanup;
> -    }
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -
> -}
> -
> -static int
> -phypConnectNumOfStoragePools(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    int nsp = -1;
> -    char *managed_system = phyp_driver->managed_system;
> -    int vios_id = phyp_driver->vios_id;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAddLit(&buf, "lsvg");
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -
> -    virBufferAddLit(&buf, "|grep -c '^.*$'");
> -    phypExecInt(session, &buf, conn, &nsp);
> -    return nsp;
> -}
> -
> -static int
> -phypConnectListStoragePools(virConnectPtr conn, char **const pools, int npools)
> -{
> -    bool success = false;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    int got = 0;
> -    size_t i;
> -    char *ret = NULL;
> -    char *storage_pools = NULL;
> -    char *char_ptr = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "viosvrcmd -m %s --id %d -c '",
> -                          managed_system, vios_id);
> -
> -    virBufferAddLit(&buf, "lsvg");
> -
> -    if (system_type == HMC)
> -        virBufferAddChar(&buf, '\'');
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    /* I need to parse the textual return in order to get the storage pools */
> -    if (exit_status < 0 || ret == NULL) {
> -        goto cleanup;
> -    } else {
> -        storage_pools = ret;
> -
> -        while (got < npools) {
> -            char_ptr = strchr(storage_pools, '\n');
> -
> -            if (char_ptr) {
> -                *char_ptr = '\0';
> -                pools[got++] = g_strdup(storage_pools);
> -                char_ptr++;
> -                storage_pools = char_ptr;
> -            } else {
> -                break;
> -            }
> -        }
> -    }
> -
> -    success = true;
> -
> - cleanup:
> -    if (!success) {
> -        for (i = 0; i < got; i++)
> -            VIR_FREE(pools[i]);
> -
> -        got = -1;
> -    }
> -    VIR_FREE(ret);
> -    return got;
> -}
> -
> -static virStoragePoolPtr
> -phypStoragePoolLookupByUUID(virConnectPtr conn,
> -                            const unsigned char *uuid)
> -{
> -    virStoragePoolPtr sp = NULL;
> -    int npools = 0;
> -    int gotpools = 0;
> -    char **pools = NULL;
> -    size_t i = 0;
> -    unsigned char *local_uuid = NULL;
> -
> -    if (VIR_ALLOC_N(local_uuid, VIR_UUID_BUFLEN) < 0)
> -        goto err;
> -
> -    if ((npools = phypConnectNumOfStoragePools(conn)) == -1)
> -        goto err;
> -
> -    if (VIR_ALLOC_N(pools, npools) < 0)
> -        goto err;
> -
> -    if ((gotpools = phypConnectListStoragePools(conn, pools, npools)) == -1)
> -        goto err;
> -
> -    if (gotpools != npools) {
> -        virReportOOMError();
> -        goto err;
> -    }
> -
> -    for (i = 0; i < gotpools; i++) {
> -        if (phypGetStoragePoolUUID(conn, local_uuid, pools[i]) == -1)
> -            continue;
> -
> -        if (!memcmp(local_uuid, uuid, VIR_UUID_BUFLEN)) {
> -            sp = virGetStoragePool(conn, pools[i], uuid, NULL, NULL);
> -            VIR_FREE(local_uuid);
> -            VIR_FREE(pools);
> -
> -            if (sp)
> -                return sp;
> -            else
> -                goto err;
> -        }
> -    }
> -
> - err:
> -    VIR_FREE(local_uuid);
> -    VIR_FREE(pools);
> -    return NULL;
> -}
> -
> -static virStoragePoolPtr
> -phypStoragePoolCreateXML(virConnectPtr conn,
> -                         const char *xml, unsigned int flags)
> -{
> -    virCheckFlags(0, NULL);
> -
> -    virStoragePoolDefPtr def = NULL;
> -    virStoragePoolPtr dup_sp = NULL;
> -    virStoragePoolPtr sp = NULL;
> -
> -    if (!(def = virStoragePoolDefParseString(xml)))
> -        goto err;
> -
> -    /* checking if this name already exists on this system */
> -    if ((dup_sp = phypStoragePoolLookupByName(conn, def->name)) != NULL) {
> -        VIR_WARN("StoragePool name already exists.");
> -        virObjectUnref(dup_sp);
> -        goto err;
> -    }
> -
> -    /* checking if ID or UUID already exists on this system */
> -    if ((dup_sp = phypStoragePoolLookupByUUID(conn, def->uuid)) != NULL) {
> -        VIR_WARN("StoragePool uuid already exists.");
> -        virObjectUnref(dup_sp);
> -        goto err;
> -    }
> -
> -    if ((sp = virGetStoragePool(conn, def->name, def->uuid, NULL, NULL)) == NULL)
> -        goto err;
> -
> -    if (phypBuildStoragePool(conn, def) == -1)
> -        goto err;
> -
> -    return sp;
> -
> - err:
> -    virStoragePoolDefFree(def);
> -    virObjectUnref(sp);
> -    return NULL;
> -}
> -
> -static char *
> -phypStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags)
> -{
> -    virCheckFlags(0, NULL);
> -
> -    virStoragePoolDef def;
> -    memset(&def, 0, sizeof(virStoragePoolDef));
> -
> -    if (pool->name != NULL) {
> -        def.name = pool->name;
> -    } else {
> -        VIR_ERROR(_("Unable to determine storage pool's name."));
> -        goto err;
> -    }
> -
> -    if (memcpy(def.uuid, pool->uuid, VIR_UUID_BUFLEN) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage pool's uuid."));
> -        goto err;
> -    }
> -
> -    if ((def.capacity =
> -         phypGetStoragePoolSize(pool->conn, pool->name)) == -1) {
> -        VIR_ERROR(_("Unable to determine storage pools's size."));
> -        goto err;
> -    }
> -
> -    /* Information not available */
> -    def.allocation = 0;
> -    def.available = 0;
> -
> -    def.source.ndevice = 1;
> -
> -    /*XXX source adapter not working properly, should show hdiskX */
> -    if ((def.source.adapter.data.scsi_host.name =
> -         phypGetStoragePoolDevice(pool->conn, pool->name)) == NULL) {
> -        VIR_ERROR(_("Unable to determine storage pools's source adapter."));
> -        goto err;
> -    }
> -
> -    return virStoragePoolDefFormat(&def);
> -
> - err:
> -    return NULL;
> -}
> -
> -static int
> -phypInterfaceDestroy(virInterfacePtr iface,
> -                     unsigned int flags)
> -{
> -    virCheckFlags(0, -1);
> -
> -    phyp_driverPtr phyp_driver = iface->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int exit_status = 0;
> -    int slot_num = 0;
> -    int lpar_id = 0;
> -    char *ret = NULL;
> -    int rv = -1;
> -
> -    /* Getting the remote slot number */
> -
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth --level lpar "
> -                      " -F mac_addr,slot_num|"
> -                      " sed -n '/%s/ s/^.*,//p'", iface->mac);
> -    if (phypExecInt(session, &buf, iface->conn, &slot_num) < 0)
> -        goto cleanup;
> -
> -    /* Getting the remote slot number */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth --level lpar "
> -                      " -F mac_addr,lpar_id|"
> -                      " sed -n '/%s/ s/^.*,//p'", iface->mac);
> -    if (phypExecInt(session, &buf, iface->conn, &lpar_id) < 0)
> -        goto cleanup;
> -
> -    /* excluding interface */
> -    virBufferAddLit(&buf, "chhwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth"
> -                      " --id %d -o r -s %d", lpar_id, slot_num);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, iface->conn, false);
> -
> -    if (exit_status < 0 || ret != NULL)
> -        goto cleanup;
> -
> -    rv = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    return rv;
> -}
> -
> -static virInterfacePtr
> -phypInterfaceDefineXML(virConnectPtr conn, const char *xml,
> -                       unsigned int flags)
> -{
> -    virCheckFlags(0, NULL);
> -
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int exit_status = 0;
> -    int slot = 0;
> -    char *ret = NULL;
> -    char name[PHYP_IFACENAME_SIZE];
> -    char mac[PHYP_MAC_SIZE];
> -    virInterfaceDefPtr def;
> -    virInterfacePtr result = NULL;
> -
> -    if (!(def = virInterfaceDefParseString(xml)))
> -        goto cleanup;
> -
> -    /* Now need to get the next free slot number */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype slot --level slot"
> -                      " -Fslot_num --filter lpar_names=%s"
> -                      " |sort|tail -n 1", def->name);
> -    if (phypExecInt(session, &buf, conn, &slot) < 0)
> -        goto cleanup;
> -
> -    /* The next free slot itself: */
> -    slot++;
> -
> -    /* Now adding the new network interface */
> -    virBufferAddLit(&buf, "chhwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth"
> -                      " -p %s -o a -s %d -a port_vlan_id=1,"
> -                      "ieee_virtual_eth=0", def->name, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret != NULL)
> -        goto cleanup;
> -
> -    /* Need to sleep a little while to wait for the HMC to
> -     * complete the execution of the command.
> -     * */
> -    sleep(1);
> -
> -    /* Getting the new interface name */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype slot --level slot"
> -                      " |sed '/lpar_name=%s/!d; /slot_num=%d/!d; "
> -                      "s/^.*drc_name=//'", def->name, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL) {
> -        /* roll back and excluding interface if error*/
> -        virBufferAddLit(&buf, "chhwres ");
> -        if (system_type == HMC)
> -            virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -        virBufferAsprintf(&buf,
> -                " -r virtualio --rsubtype eth"
> -                " -p %s -o r -s %d", def->name, slot);
> -        VIR_FREE(ret);
> -        ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -        goto cleanup;
> -    }
> -
> -    memcpy(name, ret, PHYP_IFACENAME_SIZE-1);
> -
> -    /* Getting the new interface mac addr */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      "-r virtualio --rsubtype eth --level lpar "
> -                      " |sed '/lpar_name=%s/!d; /slot_num=%d/!d; "
> -                      "s/^.*mac_addr=//'", def->name, slot);
> -    VIR_FREE(ret);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    memcpy(mac, ret, PHYP_MAC_SIZE-1);
> -
> -    result = virGetInterface(conn, name, mac);
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    virInterfaceDefFree(def);
> -    return result;
> -}
> -
> -static virInterfacePtr
> -phypInterfaceLookupByName(virConnectPtr conn, const char *name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    int slot = 0;
> -    int lpar_id = 0;
> -    char mac[PHYP_MAC_SIZE];
> -    virInterfacePtr result = NULL;
> -
> -    /*Getting the slot number for the interface */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype slot --level slot "
> -                      " -F drc_name,slot_num |"
> -                      " sed -n '/%s/ s/^.*,//p'", name);
> -    if (phypExecInt(session, &buf, conn, &slot) < 0)
> -        goto cleanup;
> -
> -    /*Getting the lpar_id for the interface */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype slot --level slot "
> -                      " -F drc_name,lpar_id |"
> -                      " sed -n '/%s/ s/^.*,//p'", name);
> -    if (phypExecInt(session, &buf, conn, &lpar_id) < 0)
> -        goto cleanup;
> -
> -    /*Getting the interface mac */
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth --level lpar "
> -                      " -F lpar_id,slot_num,mac_addr|"
> -                      " sed -n '/%d,%d/ s/^.*,//p'", lpar_id, slot);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    memcpy(mac, ret, PHYP_MAC_SIZE-1);
> -
> -    result = virGetInterface(conn, name, ret);
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    return result;
> -}
> -
> -static int
> -phypInterfaceIsActive(virInterfacePtr iface)
> -{
> -    phyp_driverPtr phyp_driver = iface->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int state = -1;
> -
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      " -r virtualio --rsubtype eth --level lpar "
> -                      " -F mac_addr,state |"
> -                      " sed -n '/%s/ s/^.*,//p'", iface->mac);
> -    phypExecInt(session, &buf, iface->conn, &state);
> -    return state;
> -}
> -
> -static int
> -phypConnectListInterfaces(virConnectPtr conn, char **const names, int nnames)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int vios_id = phyp_driver->vios_id;
> -    int exit_status = 0;
> -    int got = 0;
> -    size_t i;
> -    char *ret = NULL;
> -    char *networks = NULL;
> -    char *char_ptr = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -    bool success = false;
> -
> -    virBufferAddLit(&buf, "lshwres");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r virtualio --rsubtype slot  --level slot|"
> -                      " sed '/eth/!d; /lpar_id=%d/d; s/^.*drc_name=//g'",
> -                      vios_id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    /* I need to parse the textual return in order to get the network
> -     * interfaces */
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    networks = ret;
> -
> -    while (got < nnames) {
> -        char_ptr = strchr(networks, '\n');
> -
> -        if (char_ptr) {
> -            *char_ptr = '\0';
> -            names[got++] = g_strdup(networks);
> -            char_ptr++;
> -            networks = char_ptr;
> -        } else {
> -            break;
> -        }
> -    }
> -
> - cleanup:
> -    if (!success) {
> -        for (i = 0; i < got; i++)
> -            VIR_FREE(names[i]);
> -    }
> -    VIR_FREE(ret);
> -    return got;
> -}
> -
> -static int
> -phypConnectNumOfInterfaces(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    int system_type = phyp_driver->system_type;
> -    int vios_id = phyp_driver->vios_id;
> -    int nnets = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lshwres ");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, "-m %s ", managed_system);
> -
> -    virBufferAsprintf(&buf,
> -                      "-r virtualio --rsubtype eth --level lpar|"
> -                      "grep -v lpar_id=%d|grep -c lpar_name", vios_id);
> -    phypExecInt(session, &buf, conn, &nnets);
> -    return nnets;
> -}
> -
> -static int
> -phypGetLparState(virConnectPtr conn, unsigned int lpar_id)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    char *managed_system = phyp_driver->managed_system;
> -    int state = VIR_DOMAIN_NOSTATE;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -F state --filter lpar_ids=%d", lpar_id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    if (STREQ(ret, "Running"))
> -        state = VIR_DOMAIN_RUNNING;
> -    else if (STREQ(ret, "Not Activated"))
> -        state = VIR_DOMAIN_SHUTOFF;
> -    else if (STREQ(ret, "Shutting Down"))
> -        state = VIR_DOMAIN_SHUTDOWN;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    return state;
> -}
> -
> -/* XXX - is this needed? */
> -static int phypDiskType(virConnectPtr, char *) G_GNUC_UNUSED;
> -static int
> -phypDiskType(virConnectPtr conn, char *backing_device)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    char *managed_system = phyp_driver->managed_system;
> -    int vios_id = phyp_driver->vios_id;
> -    int disk_type = -1;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "viosvrcmd");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -p %d -c \"lssp -field name type "
> -                      "-fmt , -all|sed -n '/%s/ {\n s/^.*,//\n p\n}'\"",
> -                      vios_id, backing_device);
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, true);
> -
> -    if (exit_status < 0 || ret == NULL)
> -        goto cleanup;
> -
> -    if (STREQ(ret, "LVPOOL"))
> -        disk_type = VIR_STORAGE_TYPE_BLOCK;
> -    else if (STREQ(ret, "FBPOOL"))
> -        disk_type = VIR_STORAGE_TYPE_FILE;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -    return disk_type;
> -}
> -
> -static int
> -phypConnectNumOfDefinedDomains(virConnectPtr conn)
> -{
> -    return phypConnectNumOfDomainsGeneric(conn, 1);
> -}
> -
> -static int
> -phypConnectNumOfDomains(virConnectPtr conn)
> -{
> -    return phypConnectNumOfDomainsGeneric(conn, 0);
> -}
> -
> -static int
> -phypConnectListDomains(virConnectPtr conn, int *ids, int nids)
> -{
> -    return phypConnectListDomainsGeneric(conn, ids, nids, 0);
> -}
> -
> -static int
> -phypConnectListDefinedDomains(virConnectPtr conn, char **const names, int nnames)
> -{
> -    bool success = false;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    int got = 0;
> -    size_t i;
> -    char *ret = NULL;
> -    char *domains = NULL;
> -    char *char_ptr = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "lssyscfg -r lpar");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAddLit(&buf, " -F name,state"
> -                      "|sed -n '/Not Activated/ {\n s/,.*$//\n p\n}'");
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    /* I need to parse the textual return in order to get the domains */
> -    if (exit_status < 0 || ret == NULL) {
> -        goto cleanup;
> -    } else {
> -        domains = ret;
> -
> -        while (got < nnames) {
> -            char_ptr = strchr(domains, '\n');
> -
> -            if (char_ptr) {
> -                *char_ptr = '\0';
> -                names[got++] = g_strdup(domains);
> -                char_ptr++;
> -                domains = char_ptr;
> -            } else {
> -                break;
> -            }
> -        }
> -    }
> -
> -    success = true;
> -
> - cleanup:
> -    if (!success) {
> -        for (i = 0; i < got; i++)
> -            VIR_FREE(names[i]);
> -
> -        got = -1;
> -    }
> -    VIR_FREE(ret);
> -    return got;
> -}
> -
> -static virDomainPtr
> -phypDomainLookupByName(virConnectPtr conn, const char *lpar_name)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int lpar_id = 0;
> -    char *managed_system = phyp_driver->managed_system;
> -    unsigned char lpar_uuid[VIR_UUID_BUFLEN];
> -
> -    lpar_id = phypGetLparID(session, managed_system, lpar_name, conn);
> -    if (lpar_id == -1)
> -        return NULL;
> -
> -    if (phypGetLparUUID(lpar_uuid, lpar_id, conn) == -1)
> -        return NULL;
> -
> -    return virGetDomain(conn, lpar_name, lpar_uuid, lpar_id);
> -}
> -
> -static virDomainPtr
> -phypDomainLookupByID(virConnectPtr conn, int lpar_id)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virDomainPtr dom = NULL;
> -    char *managed_system = phyp_driver->managed_system;
> -    unsigned char lpar_uuid[VIR_UUID_BUFLEN];
> -
> -    char *lpar_name = phypGetLparNAME(session, managed_system, lpar_id,
> -                                      conn);
> -
> -    if (phypGetLparUUID(lpar_uuid, lpar_id, conn) == -1)
> -        goto cleanup;
> -
> -    dom = virGetDomain(conn, lpar_name, lpar_uuid, lpar_id);
> -
> - cleanup:
> -    VIR_FREE(lpar_name);
> -
> -    return dom;
> -}
> -
> -static char *
> -phypDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
> -{
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virDomainDef def;
> -    char *managed_system = phyp_driver->managed_system;
> -    unsigned long long memory;
> -    unsigned int vcpus;
> -
> -    virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS, NULL);
> -
> -    memset(&def, 0, sizeof(virDomainDef));
> -
> -    def.virtType = VIR_DOMAIN_VIRT_PHYP;
> -    def.id = dom->id;
> -
> -    char *lpar_name = phypGetLparNAME(session, managed_system, def.id,
> -                                      dom->conn);
> -
> -    if (lpar_name == NULL) {
> -        VIR_ERROR(_("Unable to determine domain's name."));
> -        goto err;
> -    }
> -
> -    if (phypGetLparUUID(def.uuid, dom->id, dom->conn) == -1) {
> -        VIR_ERROR(_("Unable to generate random uuid."));
> -        goto err;
> -    }
> -
> -    if ((memory = phypGetLparMem(dom->conn, managed_system, dom->id, 0)) == 0) {
> -        VIR_ERROR(_("Unable to determine domain's max memory."));
> -        goto err;
> -    }
> -
> -    virDomainDefSetMemoryTotal(&def, memory);
> -
> -    if ((def.mem.cur_balloon =
> -         phypGetLparMem(dom->conn, managed_system, dom->id, 1)) == 0) {
> -        VIR_ERROR(_("Unable to determine domain's memory."));
> -        goto err;
> -    }
> -
> -    if ((vcpus = phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0) {
> -        VIR_ERROR(_("Unable to determine domain's CPU."));
> -        goto err;
> -    }
> -
> -    if (virDomainDefSetVcpusMax(&def, vcpus, phyp_driver->xmlopt) < 0)
> -        goto err;
> -
> -    if (virDomainDefSetVcpus(&def, vcpus) < 0)
> -        goto err;
> -
> -    return virDomainDefFormat(&def, phyp_driver->xmlopt,
> -                              virDomainDefFormatConvertXMLFlags(flags));
> -
> - err:
> -    return NULL;
> -}
> -
> -static int
> -phypDomainResume(virDomainPtr dom)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virBufferAddLit(&buf, "chsysstate");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r lpar -o on --id %d -f %s",
> -                      dom->id, dom->name);
> -    ret = phypExecBuffer(session, &buf, &exit_status, dom->conn, false);
> -
> -    if (exit_status < 0)
> -        goto cleanup;
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static int
> -phypDomainReboot(virDomainPtr dom, unsigned int flags)
> -{
> -    int result = -1;
> -    virConnectPtr conn = dom->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virCheckFlags(0, -1);
> -
> -    virBufferAddLit(&buf, "chsysstate");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf,
> -                      " -r lpar -o shutdown --id %d --immed --restart",
> -                      dom->id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, dom->conn, false);
> -
> -    if (exit_status < 0)
> -        goto cleanup;
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static int
> -phypDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
> -{
> -    int result = -1;
> -    virConnectPtr conn = dom->conn;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virCheckFlags(0, -1);
> -
> -    virBufferAddLit(&buf, "chsysstate");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r lpar -o shutdown --id %d", dom->id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, dom->conn, false);
> -
> -    if (exit_status < 0)
> -        goto cleanup;
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static int
> -phypDomainShutdown(virDomainPtr dom)
> -{
> -    return phypDomainShutdownFlags(dom, 0);
> -}
> -
> -static int
> -phypDomainGetInfo(virDomainPtr dom, virDomainInfoPtr info)
> -{
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    char *managed_system = phyp_driver->managed_system;
> -
> -    info->state = phypGetLparState(dom->conn, dom->id);
> -
> -    if ((info->maxMem =
> -         phypGetLparMem(dom->conn, managed_system, dom->id, 0)) == 0)
> -        VIR_WARN("Unable to determine domain's max memory.");
> -
> -    if ((info->memory =
> -         phypGetLparMem(dom->conn, managed_system, dom->id, 1)) == 0)
> -        VIR_WARN("Unable to determine domain's memory.");
> -
> -    if ((info->nrVirtCpu =
> -         phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0)
> -        VIR_WARN("Unable to determine domain's CPU.");
> -
> -    return 0;
> -}
> -
> -static int
> -phypDomainGetState(virDomainPtr dom,
> -                   int *state,
> -                   int *reason,
> -                   unsigned int flags)
> -{
> -    virCheckFlags(0, -1);
> -
> -    *state = phypGetLparState(dom->conn, dom->id);
> -    if (reason)
> -        *reason = 0;
> -
> -    return 0;
> -}
> -
> -static int
> -phypDomainDestroyFlags(virDomainPtr dom,
> -                       unsigned int flags)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    virCheckFlags(0, -1);
> -
> -    virBufferAddLit(&buf, "rmsyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r lpar --id %d", dom->id);
> -    ret = phypExecBuffer(session, &buf, &exit_status, dom->conn, false);
> -
> -    if (exit_status < 0)
> -        goto cleanup;
> -
> -    if (phypUUIDTable_RemLpar(dom->conn, dom->id) == -1)
> -        goto cleanup;
> -
> -    dom->id = -1;
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static int
> -phypDomainDestroy(virDomainPtr dom)
> -{
> -    return phypDomainDestroyFlags(dom, 0);
> -}
> -
> -static int
> -phypBuildLpar(virConnectPtr conn, virDomainDefPtr def)
> -{
> -    int result = -1;
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    char *ret = NULL;
> -    int exit_status = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (!def->mem.cur_balloon) {
> -        virReportError(VIR_ERR_XML_ERROR, "%s",
> -                       _("Field <currentMemory> on the domain XML file is "
> -                         "missing or has invalid value"));
> -        goto cleanup;
> -    }
> -
> -    if (!virDomainDefGetMemoryInitial(def)) {
> -        virReportError(VIR_ERR_XML_ERROR, "%s",
> -                       _("Field <memory> on the domain XML file is missing or "
> -                         "has invalid value"));
> -        goto cleanup;
> -    }
> -
> -    if (def->ndisks < 1) {
> -        virReportError(VIR_ERR_XML_ERROR, "%s",
> -                       _("Domain XML must contain at least one <disk> element."));
> -        goto cleanup;
> -    }
> -
> -    if (!virDomainDiskGetSource(def->disks[0])) {
> -        virReportError(VIR_ERR_XML_ERROR, "%s",
> -                       _("Field <src> under <disk> on the domain XML file is "
> -                         "missing."));
> -        goto cleanup;
> -    }
> -
> -    virBufferAddLit(&buf, "mksyscfg");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " -r lpar -p %s -i min_mem=%lld,desired_mem=%lld,"
> -                      "max_mem=%lld,desired_procs=%u,virtual_scsi_adapters=%s",
> -                      def->name, def->mem.cur_balloon,
> -                      def->mem.cur_balloon,
> -                      virDomainDefGetMemoryInitial(def),
> -                      virDomainDefGetVcpus(def),
> -                      virDomainDiskGetSource(def->disks[0]));
> -    ret = phypExecBuffer(session, &buf, &exit_status, conn, false);
> -
> -    if (exit_status < 0) {
> -        VIR_ERROR(_("Unable to create LPAR. Reason: '%s'"), NULLSTR(ret));
> -        goto cleanup;
> -    }
> -
> -    if (phypUUIDTable_AddLpar(conn, def->uuid, def->id) == -1) {
> -        VIR_ERROR(_("Unable to add LPAR to the table"));
> -        goto cleanup;
> -    }
> -
> -    result = 0;
> -
> - cleanup:
> -    VIR_FREE(ret);
> -
> -    return result;
> -}
> -
> -static virDomainPtr
> -phypDomainCreateXML(virConnectPtr conn,
> -                    const char *xml, unsigned int flags)
> -{
> -    virCheckFlags(0, NULL);
> -
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    virDomainDefPtr def = NULL;
> -    virDomainPtr dom = NULL;
> -    uuid_tablePtr uuid_table = phyp_driver->uuid_table;
> -    lparPtr *lpars = uuid_table->lpars;
> -    size_t i = 0;
> -    char *managed_system = phyp_driver->managed_system;
> -    unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE;
> -
> -    virCheckFlags(VIR_DOMAIN_START_VALIDATE, NULL);
> -
> -    if (flags & VIR_DOMAIN_START_VALIDATE)
> -        parse_flags |= VIR_DOMAIN_DEF_PARSE_VALIDATE_SCHEMA;
> -
> -    if (!(def = virDomainDefParseString(xml,
> -                                        phyp_driver->xmlopt,
> -                                        NULL,
> -                                        parse_flags)))
> -        goto err;
> -
> -    /* checking if this name already exists on this system */
> -    if (phypGetLparID(session, managed_system, def->name, conn) != -1) {
> -        VIR_WARN("LPAR name already exists.");
> -        goto err;
> -    }
> -
> -    /* checking if ID or UUID already exists on this system */
> -    for (i = 0; i < uuid_table->nlpars; i++) {
> -        if (lpars[i]->id == def->id || lpars[i]->uuid == def->uuid) {
> -            VIR_WARN("LPAR ID or UUID already exists.");
> -            goto err;
> -        }
> -    }
> -
> -    if ((dom = virGetDomain(conn, def->name, def->uuid, def->id)) == NULL)
> -        goto err;
> -
> -    if (phypBuildLpar(conn, def) == -1)
> -        goto err;
> -
> -    if (phypDomainResume(dom) == -1)
> -        goto err;
> -
> -    return dom;
> -
> - err:
> -    virDomainDefFree(def);
> -    virObjectUnref(dom);
> -    return NULL;
> -}
> -
> -static char *
> -phypConnectGetCapabilities(virConnectPtr conn)
> -{
> -    phyp_driverPtr phyp_driver = conn->privateData;
> -
> -    return virCapabilitiesFormatXML(phyp_driver->caps);
> -}
> -
> -static int
> -phypDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
> -                        unsigned int flags)
> -{
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    int system_type = phyp_driver->system_type;
> -    char *managed_system = phyp_driver->managed_system;
> -    int exit_status = 0;
> -    char *ret = NULL;
> -    char operation;
> -    unsigned long ncpus = 0;
> -    unsigned int amount = 0;
> -    virBuffer buf = VIR_BUFFER_INITIALIZER;
> -
> -    if (flags != VIR_DOMAIN_VCPU_LIVE) {
> -        virReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"), flags);
> -        return -1;
> -    }
> -
> -    if ((ncpus = phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0)
> -        return 0;
> -
> -    if (nvcpus > phypDomainGetMaxVcpus(dom)) {
> -        VIR_ERROR(_("You are trying to set a number of CPUs bigger than "
> -                     "the max possible."));
> -        return 0;
> -    }
> -
> -    if (ncpus > nvcpus) {
> -        operation = 'r';
> -        amount = nvcpus - ncpus;
> -    } else if (ncpus < nvcpus) {
> -        operation = 'a';
> -        amount = nvcpus - ncpus;
> -    } else {
> -        return 0;
> -    }
> -
> -    virBufferAddLit(&buf, "chhwres -r proc");
> -    if (system_type == HMC)
> -        virBufferAsprintf(&buf, " -m %s", managed_system);
> -    virBufferAsprintf(&buf, " --id %d -o %c --procunits %d 2>&1 |sed "
> -                      "-e 's/^.*\\([0-9][0-9]*.[0-9][0-9]*\\).*$/\\1/'",
> -                      dom->id, operation, amount);
> -    ret = phypExecBuffer(session, &buf, &exit_status, dom->conn, false);
> -
> -    if (exit_status < 0) {
> -        VIR_ERROR(_
> -                   ("Possibly you don't have IBM Tools installed in your LPAR."
> -                    " Contact your support to enable this feature."));
> -    }
> -
> -    VIR_FREE(ret);
> -    return 0;
> -
> -}
> -
> -static int
> -phypDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
> -{
> -    return phypDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
> -}
> -
> -static int
> -phypDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
> -{
> -    phyp_driverPtr phyp_driver = dom->conn->privateData;
> -    LIBSSH2_SESSION *session = phyp_driver->session;
> -    char *managed_system = phyp_driver->managed_system;
> -    char *lpar_name = NULL;
> -    int ret = -1;
> -
> -    virCheckFlags(0, -1);
> -
> -    lpar_name = phypGetLparNAME(session, managed_system, dom->id, dom->conn);
> -
> -    if (lpar_name == NULL) {
> -        VIR_ERROR(_("Unable to determine domain's name."));
> -        goto cleanup;
> -    }
> -
> -    ret = 0;
> -
> - cleanup:
> -    VIR_FREE(lpar_name);
> -    return ret;
> -}
> -
> -static virHypervisorDriver phypHypervisorDriver = {
> -    .name = "PHYP",
> -    .connectOpen = phypConnectOpen, /* 0.7.0 */
> -    .connectClose = phypConnectClose, /* 0.7.0 */
> -    .connectGetCapabilities = phypConnectGetCapabilities, /* 0.7.3 */
> -    .connectListDomains = phypConnectListDomains, /* 0.7.0 */
> -    .connectNumOfDomains = phypConnectNumOfDomains, /* 0.7.0 */
> -    .domainCreateXML = phypDomainCreateXML, /* 0.7.3 */
> -    .domainLookupByID = phypDomainLookupByID, /* 0.7.0 */
> -    .domainLookupByName = phypDomainLookupByName, /* 0.7.0 */
> -    .domainResume = phypDomainResume, /* 0.7.0 */
> -    .domainShutdown = phypDomainShutdown, /* 0.7.0 */
> -    .domainShutdownFlags = phypDomainShutdownFlags, /* 5.6.0 */
> -    .domainReboot = phypDomainReboot, /* 0.9.1 */
> -    .domainDestroy = phypDomainDestroy, /* 0.7.3 */
> -    .domainDestroyFlags = phypDomainDestroyFlags, /* 0.9.4 */
> -    .domainGetInfo = phypDomainGetInfo, /* 0.7.0 */
> -    .domainGetState = phypDomainGetState, /* 0.9.2 */
> -    .domainSetVcpus = phypDomainSetVcpus, /* 0.7.3 */
> -    .domainSetVcpusFlags = phypDomainSetVcpusFlags, /* 0.8.5 */
> -    .domainGetVcpusFlags = phypDomainGetVcpusFlags, /* 0.8.5 */
> -    .domainGetMaxVcpus = phypDomainGetMaxVcpus, /* 0.7.3 */
> -    .domainGetXMLDesc = phypDomainGetXMLDesc, /* 0.7.0 */
> -    .connectListDefinedDomains = phypConnectListDefinedDomains, /* 0.7.0 */
> -    .connectNumOfDefinedDomains = phypConnectNumOfDefinedDomains, /* 0.7.0 */
> -    .domainAttachDevice = phypDomainAttachDevice, /* 0.8.2 */
> -    .domainAttachDeviceFlags = phypDomainAttachDeviceFlags, /* 5.6.0 */
> -    .connectIsEncrypted = phypConnectIsEncrypted, /* 0.7.3 */
> -    .connectIsSecure = phypConnectIsSecure, /* 0.7.3 */
> -    .domainIsUpdated = phypDomainIsUpdated, /* 0.8.6 */
> -    .connectIsAlive = phypConnectIsAlive, /* 0.9.8 */
> -    .domainHasManagedSaveImage = phypDomainHasManagedSaveImage, /* 1.2.13 */
> -};
> -
> -static virStorageDriver phypStorageDriver = {
> -    .connectNumOfStoragePools = phypConnectNumOfStoragePools, /* 0.8.2 */
> -    .connectListStoragePools = phypConnectListStoragePools, /* 0.8.2 */
> -    .storagePoolLookupByName = phypStoragePoolLookupByName, /* 0.8.2 */
> -    .storagePoolLookupByUUID = phypStoragePoolLookupByUUID, /* 0.8.2 */
> -    .storagePoolCreateXML = phypStoragePoolCreateXML, /* 0.8.2 */
> -    .storagePoolDestroy = phypStoragePoolDestroy, /* 0.8.2 */
> -    .storagePoolGetXMLDesc = phypStoragePoolGetXMLDesc, /* 0.8.2 */
> -    .storagePoolNumOfVolumes = phypStoragePoolNumOfVolumes, /* 0.8.2 */
> -    .storagePoolListVolumes = phypStoragePoolListVolumes, /* 0.8.2 */
> -
> -    .storageVolLookupByName = phypStorageVolLookupByName, /* 0.8.2 */
> -    .storageVolLookupByPath = phypStorageVolLookupByPath, /* 0.8.2 */
> -    .storageVolCreateXML = phypStorageVolCreateXML, /* 0.8.2 */
> -    .storageVolGetXMLDesc = phypStorageVolGetXMLDesc, /* 0.8.2 */
> -    .storageVolGetPath = phypStorageVolGetPath, /* 0.8.2 */
> -};
> -
> -static virInterfaceDriver phypInterfaceDriver = {
> -    .connectNumOfInterfaces = phypConnectNumOfInterfaces, /* 0.9.1 */
> -    .connectListInterfaces = phypConnectListInterfaces, /* 0.9.1 */
> -    .interfaceLookupByName = phypInterfaceLookupByName, /* 0.9.1 */
> -    .interfaceDefineXML = phypInterfaceDefineXML, /* 0.9.1 */
> -    .interfaceDestroy = phypInterfaceDestroy, /* 0.9.1 */
> -    .interfaceIsActive = phypInterfaceIsActive /* 0.9.1 */
> -};
> -
> -static virConnectDriver phypConnectDriver = {
> -    .remoteOnly = true,
> -    .uriSchemes = (const char *[]){ "phyp", NULL },
> -    .hypervisorDriver = &phypHypervisorDriver,
> -    .interfaceDriver = &phypInterfaceDriver,
> -    .storageDriver = &phypStorageDriver,
> -};
> -
> -int
> -phypRegister(void)
> -{
> -    return virRegisterConnectDriver(&phypConnectDriver,
> -                                    false);
> -}
> diff --git a/src/phyp/phyp_driver.h b/src/phyp/phyp_driver.h
> deleted file mode 100644
> index d7076e3697..0000000000
> --- a/src/phyp/phyp_driver.h
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -/*
> - * Copyright (C) 2010, 2013 Red Hat, Inc.
> - * Copyright IBM Corp. 2009
> - *
> - * phyp_driver.c: ssh layer to access Power Hypervisors
> - *
> - * 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/>.
> - */
> -
> -#pragma once
> -
> -int phypRegister(void);
> 




More information about the libvir-list mailing list