2016-04-26 16:04:55 +03:00
/*
* Copyright ( C ) 2016 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 <dlfcn.h>
# include "internal.h"
# include "viralloc.h"
# include "virjson.h"
# include "qemu/qemu_monitor.h"
# include "qemu/qemu_monitor_json.h"
2017-11-03 15:09:47 +03:00
# define REAL_SYM(realFunc) \
do { \
if ( ! realFunc & & ! ( realFunc = dlsym ( RTLD_NEXT , __FUNCTION__ ) ) ) { \
fprintf ( stderr , " Cannot find real '%s' symbol \n " , \
__FUNCTION__ ) ; \
abort ( ) ; \
} \
2016-04-26 16:04:55 +03:00
} while ( 0 )
2018-05-03 18:29:36 +03:00
static bool first = true ;
2016-04-26 16:04:55 +03:00
2018-05-03 18:34:43 +03:00
static void
printLineSkipEmpty ( const char * line ,
FILE * fp )
{
const char * p ;
for ( p = line ; * p ; p + + ) {
if ( p [ 0 ] = = ' \n ' & & p [ 1 ] = = ' \n ' )
continue ;
fputc ( * p , fp ) ;
}
}
2016-04-26 16:04:55 +03:00
static int ( * realQemuMonitorSend ) ( qemuMonitorPtr mon ,
qemuMonitorMessagePtr msg ) ;
int
qemuMonitorSend ( qemuMonitorPtr mon ,
qemuMonitorMessagePtr msg )
{
2018-05-03 18:29:36 +03:00
char * reformatted ;
2016-04-26 16:04:55 +03:00
REAL_SYM ( realQemuMonitorSend ) ;
2018-05-03 18:29:36 +03:00
if ( ! ( reformatted = virJSONStringReformat ( msg - > txBuffer , true ) ) ) {
fprintf ( stderr , " Failed to reformat command string '%s' \n " , msg - > txBuffer ) ;
abort ( ) ;
}
if ( first )
first = false ;
else
printLineSkipEmpty ( " \n " , stdout ) ;
printLineSkipEmpty ( reformatted , stdout ) ;
VIR_FREE ( reformatted ) ;
2016-04-26 16:04:55 +03:00
return realQemuMonitorSend ( mon , msg ) ;
}
static int ( * realQemuMonitorJSONIOProcessLine ) ( qemuMonitorPtr mon ,
const char * line ,
qemuMonitorMessagePtr msg ) ;
int
qemuMonitorJSONIOProcessLine ( qemuMonitorPtr mon ,
const char * line ,
qemuMonitorMessagePtr msg )
{
virJSONValuePtr value = NULL ;
char * json = NULL ;
int ret ;
REAL_SYM ( realQemuMonitorJSONIOProcessLine ) ;
ret = realQemuMonitorJSONIOProcessLine ( mon , line , msg ) ;
2018-05-04 16:34:41 +03:00
if ( ret = = 0 ) {
if ( ! ( value = virJSONValueFromString ( line ) ) | |
! ( json = virJSONValueToString ( value , true ) ) ) {
fprintf ( stderr , " Failed to reformat reply string '%s' \n " , line ) ;
abort ( ) ;
}
2016-04-26 16:04:55 +03:00
2018-05-03 18:29:36 +03:00
/* Ignore QMP greeting */
if ( virJSONValueObjectHasKey ( value , " QMP " ) )
goto cleanup ;
if ( first )
2016-06-10 18:15:25 +03:00
first = false ;
2018-05-03 18:29:36 +03:00
else
printLineSkipEmpty ( " \n " , stdout ) ;
2016-06-10 18:15:25 +03:00
2018-05-03 18:34:43 +03:00
printLineSkipEmpty ( json , stdout ) ;
2016-04-26 16:04:55 +03:00
}
2016-11-14 16:29:57 +03:00
cleanup :
2016-04-26 16:04:55 +03:00
VIR_FREE ( json ) ;
virJSONValueFree ( value ) ;
return ret ;
}