Message ID | 20200129053357.27454-5-alxndr@bu.edu (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add virtual device fuzzing support | expand |
On Wed, Jan 29, 2020 at 05:34:14AM +0000, Bulekov, Alexander wrote: >qtest_server_send is a function pointer specifying the handler used to >transmit data to the qtest client. In the standard configuration, this >calls the CharBackend handler, but now it is possible for other types of >handlers, e.g direct-function calls if the qtest client and server >exist within the same process (inproc) > >Signed-off-by: Alexander Bulekov <alxndr@bu.edu> >Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Darren Kenny <darren.kenny@oracle.com> >Acked-by: Thomas Huth <thuth@redhat.com> >--- > include/sysemu/qtest.h | 3 +++ > qtest.c | 18 ++++++++++++++++-- > 2 files changed, 19 insertions(+), 2 deletions(-) > >diff --git a/include/sysemu/qtest.h b/include/sysemu/qtest.h >index 5ed09c80b1..e2f1047fd7 100644 >--- a/include/sysemu/qtest.h >+++ b/include/sysemu/qtest.h >@@ -26,4 +26,7 @@ bool qtest_driver(void); > > void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error **errp); > >+void qtest_server_set_send_handler(void (*send)(void *, const char *), >+ void *opaque); >+ > #endif >diff --git a/qtest.c b/qtest.c >index 12432f99cf..938c3746d6 100644 >--- a/qtest.c >+++ b/qtest.c >@@ -42,6 +42,8 @@ static GString *inbuf; > static int irq_levels[MAX_IRQ]; > static qemu_timeval start_time; > static bool qtest_opened; >+static void (*qtest_server_send)(void*, const char*); >+static void *qtest_server_send_opaque; > > #define FMT_timeval "%ld.%06ld" > >@@ -228,8 +230,10 @@ static void GCC_FMT_ATTR(1, 2) qtest_log_send(const char *fmt, ...) > va_end(ap); > } > >-static void do_qtest_send(CharBackend *chr, const char *str, size_t len) >+static void qtest_server_char_be_send(void *opaque, const char *str) > { >+ size_t len = strlen(str); >+ CharBackend* chr = (CharBackend *)opaque; > qemu_chr_fe_write_all(chr, (uint8_t *)str, len); > if (qtest_log_fp && qtest_opened) { > fprintf(qtest_log_fp, "%s", str); >@@ -238,7 +242,7 @@ static void do_qtest_send(CharBackend *chr, const char *str, size_t len) > > static void qtest_send(CharBackend *chr, const char *str) > { >- do_qtest_send(chr, str, strlen(str)); >+ qtest_server_send(qtest_server_send_opaque, str); > } > > static void GCC_FMT_ATTR(2, 3) qtest_sendf(CharBackend *chr, >@@ -783,6 +787,16 @@ void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error ** > qemu_chr_fe_set_echo(&qtest_chr, true); > > inbuf = g_string_new(""); >+ >+ if (!qtest_server_send) { >+ qtest_server_set_send_handler(qtest_server_char_be_send, &qtest_chr); >+ } >+} >+ >+void qtest_server_set_send_handler(void (*send)(void*, const char*), void *opaque) >+{ >+ qtest_server_send = send; >+ qtest_server_send_opaque = opaque; > } > > bool qtest_driver(void) >-- >2.23.0 > >
diff --git a/include/sysemu/qtest.h b/include/sysemu/qtest.h index 5ed09c80b1..e2f1047fd7 100644 --- a/include/sysemu/qtest.h +++ b/include/sysemu/qtest.h @@ -26,4 +26,7 @@ bool qtest_driver(void); void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error **errp); +void qtest_server_set_send_handler(void (*send)(void *, const char *), + void *opaque); + #endif diff --git a/qtest.c b/qtest.c index 12432f99cf..938c3746d6 100644 --- a/qtest.c +++ b/qtest.c @@ -42,6 +42,8 @@ static GString *inbuf; static int irq_levels[MAX_IRQ]; static qemu_timeval start_time; static bool qtest_opened; +static void (*qtest_server_send)(void*, const char*); +static void *qtest_server_send_opaque; #define FMT_timeval "%ld.%06ld" @@ -228,8 +230,10 @@ static void GCC_FMT_ATTR(1, 2) qtest_log_send(const char *fmt, ...) va_end(ap); } -static void do_qtest_send(CharBackend *chr, const char *str, size_t len) +static void qtest_server_char_be_send(void *opaque, const char *str) { + size_t len = strlen(str); + CharBackend* chr = (CharBackend *)opaque; qemu_chr_fe_write_all(chr, (uint8_t *)str, len); if (qtest_log_fp && qtest_opened) { fprintf(qtest_log_fp, "%s", str); @@ -238,7 +242,7 @@ static void do_qtest_send(CharBackend *chr, const char *str, size_t len) static void qtest_send(CharBackend *chr, const char *str) { - do_qtest_send(chr, str, strlen(str)); + qtest_server_send(qtest_server_send_opaque, str); } static void GCC_FMT_ATTR(2, 3) qtest_sendf(CharBackend *chr, @@ -783,6 +787,16 @@ void qtest_server_init(const char *qtest_chrdev, const char *qtest_log, Error ** qemu_chr_fe_set_echo(&qtest_chr, true); inbuf = g_string_new(""); + + if (!qtest_server_send) { + qtest_server_set_send_handler(qtest_server_char_be_send, &qtest_chr); + } +} + +void qtest_server_set_send_handler(void (*send)(void*, const char*), void *opaque) +{ + qtest_server_send = send; + qtest_server_send_opaque = opaque; } bool qtest_driver(void)