2019-07-14 13:24:38 +03:00
/*
* virsh - completer - host . c : virsh completer callbacks related to host
*
* Copyright ( C ) 2019 Red Hat , Inc .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation ; either
* version 2.1 of the License , or ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library . If not , see
* < http : //www.gnu.org/licenses/>.
*/
# include <config.h>
# include "virsh-completer-host.h"
# include "viralloc.h"
# include "virsh.h"
# include "virstring.h"
# include "virxml.h"
# include "virutil.h"
static char *
virshPagesizeNodeToString ( xmlNodePtr node )
{
2019-10-15 16:16:31 +03:00
g_autofree char * pagesize = NULL ;
g_autofree char * unit = NULL ;
2019-07-14 13:24:38 +03:00
unsigned long long byteval = 0 ;
const char * suffix = NULL ;
double size = 0 ;
char * ret ;
pagesize = virXMLPropString ( node , " size " ) ;
unit = virXMLPropString ( node , " unit " ) ;
if ( virStrToLong_ull ( pagesize , NULL , 10 , & byteval ) < 0 )
return NULL ;
if ( virScaleInteger ( & byteval , unit , 1024 , UINT_MAX ) < 0 )
return NULL ;
size = vshPrettyCapacity ( byteval , & suffix ) ;
2019-10-22 16:26:14 +03:00
ret = g_strdup_printf ( " %.0f%s " , size , suffix ) ;
2019-07-14 13:24:38 +03:00
return ret ;
}
char * *
virshAllocpagesPagesizeCompleter ( vshControl * ctl ,
2019-10-14 15:44:29 +03:00
const vshCmd * cmd G_GNUC_UNUSED ,
2019-07-14 13:24:38 +03:00
unsigned int flags )
{
2019-10-15 15:47:50 +03:00
g_autoptr ( xmlXPathContext ) ctxt = NULL ;
2019-07-14 13:24:38 +03:00
virshControlPtr priv = ctl - > privData ;
unsigned int npages = 0 ;
2019-10-15 16:16:31 +03:00
g_autofree xmlNodePtr * pages = NULL ;
2019-10-15 15:47:50 +03:00
g_autoptr ( xmlDoc ) doc = NULL ;
2019-07-14 13:24:38 +03:00
size_t i = 0 ;
const char * cellnum = NULL ;
bool cellno = vshCommandOptBool ( cmd , " cellno " ) ;
2019-10-15 16:16:31 +03:00
g_autofree char * path = NULL ;
g_autofree char * cap_xml = NULL ;
2019-07-14 13:24:38 +03:00
VIR_AUTOSTRINGLIST tmp = NULL ;
virCheckFlags ( 0 , NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ! ( cap_xml = virConnectGetCapabilities ( priv - > conn ) ) )
return NULL ;
if ( ! ( doc = virXMLParseStringCtxt ( cap_xml , _ ( " capabilities " ) , & ctxt ) ) )
return NULL ;
if ( cellno & & vshCommandOptStringQuiet ( ctl , cmd , " cellno " , & cellnum ) > 0 ) {
2019-10-22 16:26:14 +03:00
path = g_strdup_printf ( " /capabilities/host/topology/cells/cell[@id= \" %s \" ]/pages " ,
cellnum ) ;
2019-07-14 13:24:38 +03:00
} else {
2019-10-22 16:26:14 +03:00
path = g_strdup ( " /capabilities/host/cpu/pages " ) ;
2019-07-14 13:24:38 +03:00
}
npages = virXPathNodeSet ( path , ctxt , & pages ) ;
if ( npages < = 0 )
return NULL ;
if ( VIR_ALLOC_N ( tmp , npages + 1 ) < 0 )
return NULL ;
for ( i = 0 ; i < npages ; i + + ) {
if ( ! ( tmp [ i ] = virshPagesizeNodeToString ( pages [ i ] ) ) )
return NULL ;
}
2019-10-17 11:10:10 +03:00
return g_steal_pointer ( & tmp ) ;
2019-07-14 13:24:38 +03:00
}
char * *
virshCellnoCompleter ( vshControl * ctl ,
2019-10-14 15:44:29 +03:00
const vshCmd * cmd G_GNUC_UNUSED ,
2019-07-14 13:24:38 +03:00
unsigned int flags )
{
2019-10-15 15:47:50 +03:00
g_autoptr ( xmlXPathContext ) ctxt = NULL ;
2019-07-14 13:24:38 +03:00
virshControlPtr priv = ctl - > privData ;
unsigned int ncells = 0 ;
2019-10-15 16:16:31 +03:00
g_autofree xmlNodePtr * cells = NULL ;
2019-10-15 15:47:50 +03:00
g_autoptr ( xmlDoc ) doc = NULL ;
2019-07-14 13:24:38 +03:00
size_t i = 0 ;
2019-10-15 16:16:31 +03:00
g_autofree char * cap_xml = NULL ;
2019-07-14 13:24:38 +03:00
VIR_AUTOSTRINGLIST tmp = NULL ;
virCheckFlags ( 0 , NULL ) ;
if ( ! priv - > conn | | virConnectIsAlive ( priv - > conn ) < = 0 )
return NULL ;
if ( ! ( cap_xml = virConnectGetCapabilities ( priv - > conn ) ) )
return NULL ;
if ( ! ( doc = virXMLParseStringCtxt ( cap_xml , _ ( " capabilities " ) , & ctxt ) ) )
return NULL ;
ncells = virXPathNodeSet ( " /capabilities/host/topology/cells/cell " , ctxt , & cells ) ;
if ( ncells < = 0 )
return NULL ;
if ( VIR_ALLOC_N ( tmp , ncells + 1 ) )
return NULL ;
for ( i = 0 ; i < ncells ; i + + ) {
if ( ! ( tmp [ i ] = virXMLPropString ( cells [ i ] , " id " ) ) )
return NULL ;
}
2019-10-17 11:10:10 +03:00
return g_steal_pointer ( & tmp ) ;
2019-07-14 13:24:38 +03:00
}