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/>.
*
* Author : Jiri Denemark < jdenemar @ redhat . com >
*/
# include <config.h>
# include <stdio.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: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 )
{
REAL_SYM ( realQemuMonitorSend ) ;
fprintf ( stderr , " %s " , msg - > txBuffer ) ;
return realQemuMonitorSend ( mon , msg ) ;
}
static int ( * realQemuMonitorJSONIOProcessLine ) ( qemuMonitorPtr mon ,
const char * line ,
qemuMonitorMessagePtr msg ) ;
int
qemuMonitorJSONIOProcessLine ( qemuMonitorPtr mon ,
const char * line ,
qemuMonitorMessagePtr msg )
{
2016-06-10 18:15:25 +03:00
static bool first = true ;
2016-04-26 16:04:55 +03:00
virJSONValuePtr value = NULL ;
char * json = NULL ;
int ret ;
REAL_SYM ( realQemuMonitorJSONIOProcessLine ) ;
ret = realQemuMonitorJSONIOProcessLine ( mon , line , msg ) ;
if ( ret = = 0 & &
( value = virJSONValueFromString ( line ) ) & &
( json = virJSONValueToString ( value , 1 ) ) ) {
2016-11-14 16:29:57 +03:00
if ( first ) {
2016-06-10 18:15:25 +03:00
first = false ;
2016-11-14 16:29:57 +03:00
} else {
/* Ignore QMP greeting if it's not the first one */
if ( virJSONValueObjectHasKey ( value , " QMP " ) )
goto cleanup ;
2016-06-10 18:15:25 +03:00
putchar ( ' \n ' ) ;
2016-11-14 16:29:57 +03:00
}
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 ;
}