[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 48/54] char: move stdio in its own file
From: |
Marc-André Lureau |
Subject: |
[Qemu-devel] [PATCH 48/54] char: move stdio in its own file |
Date: |
Tue, 13 Dec 2016 01:43:19 +0300 |
Signed-off-by: Marc-André Lureau <address@hidden>
---
chardev/char-stdio.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++
chardev/char.c | 122 +------------------------------------------
chardev/Makefile.objs | 1 +
3 files changed, 142 insertions(+), 121 deletions(-)
create mode 100644 chardev/char-stdio.c
diff --git a/chardev/char-stdio.c b/chardev/char-stdio.c
new file mode 100644
index 0000000000..342125d616
--- /dev/null
+++ b/chardev/char-stdio.c
@@ -0,0 +1,140 @@
+#include "qemu/osdep.h"
+#include "qemu/sockets.h"
+#include "qapi/error.h"
+#include "qemu-common.h"
+#include "sysemu/char.h"
+
+#ifdef _WIN32
+#include "char-win.h"
+#include "char-win-stdio.h"
+#else
+#include <termios.h>
+#include "char-fd.h"
+#endif
+
+#ifndef _WIN32
+/* init terminal so that we can grab keys */
+static struct termios oldtty;
+static int old_fd0_flags;
+static bool stdio_in_use;
+static bool stdio_allow_signal;
+static bool stdio_echo_state;
+
+static void term_exit(void)
+{
+ tcsetattr(0, TCSANOW, &oldtty);
+ fcntl(0, F_SETFL, old_fd0_flags);
+}
+
+static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo)
+{
+ struct termios tty;
+
+ stdio_echo_state = echo;
+ tty = oldtty;
+ if (!echo) {
+ tty.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
+ | INLCR | IGNCR | ICRNL | IXON);
+ tty.c_oflag |= OPOST;
+ tty.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN);
+ tty.c_cflag &= ~(CSIZE | PARENB);
+ tty.c_cflag |= CS8;
+ tty.c_cc[VMIN] = 1;
+ tty.c_cc[VTIME] = 0;
+ }
+ if (!stdio_allow_signal) {
+ tty.c_lflag &= ~ISIG;
+ }
+
+ tcsetattr(0, TCSANOW, &tty);
+}
+
+static void term_stdio_handler(int sig)
+{
+ /* restore echo after resume from suspend. */
+ qemu_chr_set_echo_stdio(NULL, stdio_echo_state);
+}
+
+static void qemu_chr_open_stdio(Chardev *chr,
+ ChardevBackend *backend,
+ bool *be_opened,
+ Error **errp)
+{
+ ChardevStdio *opts = backend->u.stdio.data;
+ struct sigaction act;
+
+ if (is_daemonized()) {
+ error_setg(errp, "cannot use stdio with -daemonize");
+ return;
+ }
+
+ if (stdio_in_use) {
+ error_setg(errp, "cannot use stdio by multiple character devices");
+ return;
+ }
+
+ stdio_in_use = true;
+ old_fd0_flags = fcntl(0, F_GETFL);
+ tcgetattr(0, &oldtty);
+ qemu_set_nonblock(0);
+ atexit(term_exit);
+
+ memset(&act, 0, sizeof(act));
+ act.sa_handler = term_stdio_handler;
+ sigaction(SIGCONT, &act, NULL);
+
+ qemu_chr_open_fd(chr, 0, 1);
+
+ if (opts->has_signal) {
+ stdio_allow_signal = opts->signal;
+ }
+ qemu_chr_set_echo_stdio(chr, false);
+}
+#endif
+
+static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
+ Error **errp)
+{
+ ChardevStdio *stdio;
+
+ stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1);
+ qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio));
+ stdio->has_signal = true;
+ stdio->signal = qemu_opt_get_bool(opts, "signal", true);
+}
+
+static void char_stdio_class_init(ObjectClass *oc, void *data)
+{
+ ChardevClass *cc = CHARDEV_CLASS(oc);
+
+ cc->parse = qemu_chr_parse_stdio;
+#ifndef _WIN32
+ cc->open = qemu_chr_open_stdio;
+ cc->chr_set_echo = qemu_chr_set_echo_stdio;
+#endif
+}
+
+static void char_stdio_finalize(Object *obj)
+{
+#ifndef _WIN32
+ term_exit();
+#endif
+}
+
+static const TypeInfo char_stdio_type_info = {
+ .name = TYPE_CHARDEV_STDIO,
+#ifdef _WIN32
+ .parent = TYPE_CHARDEV_WIN_STDIO,
+#else
+ .parent = TYPE_CHARDEV_FD,
+#endif
+ .instance_finalize = char_stdio_finalize,
+ .class_init = char_stdio_class_init,
+};
+
+static void register_types(void)
+{
+ type_register_static(&char_stdio_type_info);
+}
+
+type_init(register_types);
diff --git a/chardev/char.c b/chardev/char.c
index 49bc1c8962..7421570399 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -90,7 +90,6 @@
#include "char-io.h"
#ifdef _WIN32
#include "char-win.h"
-#include "char-win-stdio.h"
#endif
/***********************************************************/
@@ -685,91 +684,7 @@ static void qemu_chr_open_pipe(Chardev *chr,
qemu_chr_open_fd(chr, fd_in, fd_out);
}
-/* init terminal so that we can grab keys */
-static struct termios oldtty;
-static int old_fd0_flags;
-static bool stdio_in_use;
-static bool stdio_allow_signal;
-static bool stdio_echo_state;
-
-static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo);
-
-static void term_exit(void)
-{
- tcsetattr (0, TCSANOW, &oldtty);
- fcntl(0, F_SETFL, old_fd0_flags);
-}
-
-static void term_stdio_handler(int sig)
-{
- /* restore echo after resume from suspend. */
- qemu_chr_set_echo_stdio(NULL, stdio_echo_state);
-}
-
-static void qemu_chr_set_echo_stdio(Chardev *chr, bool echo)
-{
- struct termios tty;
-
- stdio_echo_state = echo;
- tty = oldtty;
- if (!echo) {
- tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
- |INLCR|IGNCR|ICRNL|IXON);
- tty.c_oflag |= OPOST;
- tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
- tty.c_cflag &= ~(CSIZE|PARENB);
- tty.c_cflag |= CS8;
- tty.c_cc[VMIN] = 1;
- tty.c_cc[VTIME] = 0;
- }
- if (!stdio_allow_signal)
- tty.c_lflag &= ~ISIG;
-
- tcsetattr (0, TCSANOW, &tty);
-}
-
-static void char_stdio_finalize(Object *obj)
-{
- term_exit();
-}
-
-static void qemu_chr_open_stdio(Chardev *chr,
- ChardevBackend *backend,
- bool *be_opened,
- Error **errp)
-{
- ChardevStdio *opts = backend->u.stdio.data;
- struct sigaction act;
-
- if (is_daemonized()) {
- error_setg(errp, "cannot use stdio with -daemonize");
- return;
- }
-
- if (stdio_in_use) {
- error_setg(errp, "cannot use stdio by multiple character devices");
- return;
- }
-
- stdio_in_use = true;
- old_fd0_flags = fcntl(0, F_GETFL);
- tcgetattr(0, &oldtty);
- qemu_set_nonblock(0);
- atexit(term_exit);
-
- memset(&act, 0, sizeof(act));
- act.sa_handler = term_stdio_handler;
- sigaction(SIGCONT, &act, NULL);
-
- qemu_chr_open_fd(chr, 0, 1);
-
- if (opts->has_signal) {
- stdio_allow_signal = opts->signal;
- }
- qemu_chr_set_echo_stdio(chr, false);
-}
-
-#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
+#if defined(__linux__) || defined(__sun__) || defined(__FreeBSD__) \
|| defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) \
|| defined(__GLIBC__)
@@ -1685,40 +1600,6 @@ void qemu_chr_parse_common(QemuOpts *opts, ChardevCommon
*backend)
backend->logappend = qemu_opt_get_bool(opts, "logappend", false);
}
-
-static void qemu_chr_parse_stdio(QemuOpts *opts, ChardevBackend *backend,
- Error **errp)
-{
- ChardevStdio *stdio;
-
- stdio = backend->u.stdio.data = g_new0(ChardevStdio, 1);
- qemu_chr_parse_common(opts, qapi_ChardevStdio_base(stdio));
- stdio->has_signal = true;
- stdio->signal = qemu_opt_get_bool(opts, "signal", true);
-}
-
-static void char_stdio_class_init(ObjectClass *oc, void *data)
-{
- ChardevClass *cc = CHARDEV_CLASS(oc);
-
- cc->parse = qemu_chr_parse_stdio;
-#ifndef _WIN32
- cc->open = qemu_chr_open_stdio;
- cc->chr_set_echo = qemu_chr_set_echo_stdio;
-#endif
-}
-
-static const TypeInfo char_stdio_type_info = {
- .name = TYPE_CHARDEV_STDIO,
-#ifdef _WIN32
- .parent = TYPE_CHARDEV_WIN_STDIO,
-#else
- .parent = TYPE_CHARDEV_FD,
- .instance_finalize = char_stdio_finalize,
-#endif
- .class_init = char_stdio_class_init,
-};
-
#ifdef HAVE_CHARDEV_SERIAL
static void qemu_chr_parse_serial(QemuOpts *opts, ChardevBackend *backend,
Error **errp)
@@ -2429,7 +2310,6 @@ void qemu_chr_cleanup(void)
static void register_types(void)
{
type_register_static(&char_type_info);
- type_register_static(&char_stdio_type_info);
#ifdef HAVE_CHARDEV_SERIAL
type_register_static(&char_serial_type_info);
#endif
diff --git a/chardev/Makefile.objs b/chardev/Makefile.objs
index 0051a7a819..ee40e8a1d7 100644
--- a/chardev/Makefile.objs
+++ b/chardev/Makefile.objs
@@ -6,6 +6,7 @@ chardev-obj-y += char-mux.o
chardev-obj-y += char-null.o
chardev-obj-y += char-ringbuf.o
chardev-obj-y += char-socket.o
+chardev-obj-y += char-stdio.o
chardev-obj-y += char-udp.o
chardev-obj-$(CONFIG_WIN32) += char-win.o
chardev-obj-$(CONFIG_WIN32) += char-win-stdio.o
--
2.11.0
- [Qemu-devel] [PATCH 37/54] char: move mux to its own file, (continued)
- [Qemu-devel] [PATCH 37/54] char: move mux to its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 38/54] char: move ringbuf/memory to its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 40/54] char: remove unused READ_RETRIES, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 39/54] char: rename and move to header CHR_READ_BUF_LEN, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 41/54] char: move QIOChannel-related in char-io.h, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 42/54] char: move fd chardev in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 43/54] char: move win chardev base class in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 44/54] char: move win-stdio into its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 46/54] char: move udp chardev in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 45/54] char: move socket chardev to itw own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 48/54] char: move stdio in its own file,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 47/54] char: move file chardev in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 49/54] char: move console in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 50/54] char: move pipe chardev in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 51/54] char: move pty chardev in its own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 52/54] char: move serial chardev to itw own file, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 54/54] char: headers clean-up, Marc-André Lureau, 2016/12/12
- [Qemu-devel] [PATCH 53/54] char: move parallel chardev in its own file, Marc-André Lureau, 2016/12/12
- Re: [Qemu-devel] [PATCH 00/54] WIP: chardev: qom-ify, no-reply, 2016/12/12