[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH V1 25/32] char: save/restore chardev pty fds
From: |
Steve Sistare |
Subject: |
[PATCH V1 25/32] char: save/restore chardev pty fds |
Date: |
Thu, 30 Jul 2020 08:14:29 -0700 |
Save and restore pty descriptors across cprsave and cprload.
Signed-off-by: Steve Sistare <steven.sistare@oracle.com>
---
chardev/char-pty.c | 38 +++++++++++++++++++++++++++-----------
chardev/char.c | 2 ++
include/chardev/char.h | 1 +
3 files changed, 30 insertions(+), 11 deletions(-)
diff --git a/chardev/char-pty.c b/chardev/char-pty.c
index 1cc501a..0785429 100644
--- a/chardev/char-pty.c
+++ b/chardev/char-pty.c
@@ -30,6 +30,7 @@
#include "qemu/sockets.h"
#include "qemu/error-report.h"
#include "qemu/module.h"
+#include "qemu/cutils.h"
#include "qemu/qemu-print.h"
#include "chardev/char-io.h"
@@ -183,6 +184,16 @@ static void pty_chr_state(Chardev *chr, int connected)
}
}
+void save_char_pty_fd(Chardev *chr)
+{
+ PtyChardev *s = PTY_CHARDEV(chr);
+ QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc);
+
+ if (fioc) {
+ setenv_fd(chr->label, fioc->fd);
+ }
+}
+
static void char_pty_finalize(Object *obj)
{
Chardev *chr = CHARDEV(obj);
@@ -204,18 +215,23 @@ static void char_pty_open(Chardev *chr,
char pty_name[PATH_MAX];
char *name;
- master_fd = qemu_openpty_raw(&slave_fd, pty_name);
- if (master_fd < 0) {
- error_setg_errno(errp, errno, "Failed to create PTY");
- return;
- }
-
- close(slave_fd);
- qemu_set_nonblock(master_fd);
+ master_fd = getenv_fd(chr->label);
+ if (master_fd >= 0) {
+ unsetenv_fd(chr->label);
+ chr->filename = g_strdup_printf("pty:unknown");
+ } else {
+ master_fd = qemu_openpty_raw(&slave_fd, pty_name);
+ if (master_fd < 0) {
+ error_setg_errno(errp, errno, "Failed to create PTY");
+ return;
+ }
- chr->filename = g_strdup_printf("pty:%s", pty_name);
- qemu_printf("char device redirected to %s (label %s)\n",
- pty_name, chr->label);
+ close(slave_fd);
+ qemu_set_nonblock(master_fd);
+ chr->filename = g_strdup_printf("pty:%s", pty_name);
+ qemu_printf("char device redirected to %s (label %s)\n",
+ pty_name, chr->label);
+ }
s = PTY_CHARDEV(chr);
s->ioc = QIO_CHANNEL(qio_channel_file_new_fd(master_fd));
diff --git a/chardev/char.c b/chardev/char.c
index 8fd54cc..da75a04 100644
--- a/chardev/char.c
+++ b/chardev/char.c
@@ -1180,6 +1180,8 @@ static int chardev_is_socket(Object *child, void *opaque)
{
if (CHARDEV_IS_SOCKET(child)) {
save_char_socket_fd((Chardev *) child);
+ } else if (CHARDEV_IS_PTY(child)) {
+ save_char_pty_fd((Chardev *) child);
}
return 0;
}
diff --git a/include/chardev/char.h b/include/chardev/char.h
index 80a9cf8..c18bda8 100644
--- a/include/chardev/char.h
+++ b/include/chardev/char.h
@@ -294,5 +294,6 @@ void qemu_chr_parse_vc(QemuOpts *opts, ChardevBackend
*backend, Error **errp);
void save_char_socket_fd(Chardev *);
void load_char_socket_fd(Chardev *);
+void save_char_pty_fd(Chardev *);
#endif
--
1.8.3.1
- [PATCH V1 14/32] savevm: VMS_RESTART and cprsave restart, (continued)
- [PATCH V1 14/32] savevm: VMS_RESTART and cprsave restart, Steve Sistare, 2020/07/30
- [PATCH V1 15/32] vl: QEMU_START_FREEZE env var, Steve Sistare, 2020/07/30
- [PATCH V1 16/32] oslib: add qemu_clr_cloexec, Steve Sistare, 2020/07/30
- [PATCH V1 17/32] util: env var helpers, Steve Sistare, 2020/07/30
- [PATCH V1 20/32] vl: add helper to request re-exec, Steve Sistare, 2020/07/30
- [PATCH V1 22/32] char: qio_channel_socket_accept reuse fd, Steve Sistare, 2020/07/30
- [PATCH V1 28/32] char: restore terminal on restart, Steve Sistare, 2020/07/30
- [PATCH V1 29/32] pci: export pci_update_mappings, Steve Sistare, 2020/07/30
- [PATCH V1 25/32] char: save/restore chardev pty fds,
Steve Sistare <=
- [PATCH V1 24/32] ui: save/restore vnc socket fds, Steve Sistare, 2020/07/30
- [PATCH V1 31/32] vfio-pci: trace pci config, Steve Sistare, 2020/07/30
- [PATCH V1 02/32] savevm: VM handlers mode mask, Steve Sistare, 2020/07/30
- [PATCH V1 05/32] savevm: QMP command for cprload, Steve Sistare, 2020/07/30
- [PATCH V1 09/32] savevm: prevent cprsave if memory is volatile, Steve Sistare, 2020/07/30
- [PATCH V1 19/32] memory: ram_block_add cosmetic changes, Steve Sistare, 2020/07/30