summaryrefslogtreecommitdiffstats
path: root/qemu/io/channel.c
diff options
context:
space:
mode:
Diffstat (limited to 'qemu/io/channel.c')
-rw-r--r--qemu/io/channel.c307
1 files changed, 0 insertions, 307 deletions
diff --git a/qemu/io/channel.c b/qemu/io/channel.c
deleted file mode 100644
index 692eb179b..000000000
--- a/qemu/io/channel.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * QEMU I/O channels
- *
- * Copyright (c) 2015 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 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 "qemu/osdep.h"
-#include "io/channel.h"
-#include "qapi/error.h"
-#include "qemu/coroutine.h"
-
-bool qio_channel_has_feature(QIOChannel *ioc,
- QIOChannelFeature feature)
-{
- return ioc->features & (1 << feature);
-}
-
-
-ssize_t qio_channel_readv_full(QIOChannel *ioc,
- const struct iovec *iov,
- size_t niov,
- int **fds,
- size_t *nfds,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if ((fds || nfds) &&
- !(ioc->features & (1 << QIO_CHANNEL_FEATURE_FD_PASS))) {
- error_setg_errno(errp, EINVAL,
- "Channel does not support file descriptor passing");
- return -1;
- }
-
- return klass->io_readv(ioc, iov, niov, fds, nfds, errp);
-}
-
-
-ssize_t qio_channel_writev_full(QIOChannel *ioc,
- const struct iovec *iov,
- size_t niov,
- int *fds,
- size_t nfds,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if ((fds || nfds) &&
- !(ioc->features & (1 << QIO_CHANNEL_FEATURE_FD_PASS))) {
- error_setg_errno(errp, EINVAL,
- "Channel does not support file descriptor passing");
- return -1;
- }
-
- return klass->io_writev(ioc, iov, niov, fds, nfds, errp);
-}
-
-
-ssize_t qio_channel_readv(QIOChannel *ioc,
- const struct iovec *iov,
- size_t niov,
- Error **errp)
-{
- return qio_channel_readv_full(ioc, iov, niov, NULL, NULL, errp);
-}
-
-
-ssize_t qio_channel_writev(QIOChannel *ioc,
- const struct iovec *iov,
- size_t niov,
- Error **errp)
-{
- return qio_channel_writev_full(ioc, iov, niov, NULL, 0, errp);
-}
-
-
-ssize_t qio_channel_read(QIOChannel *ioc,
- char *buf,
- size_t buflen,
- Error **errp)
-{
- struct iovec iov = { .iov_base = buf, .iov_len = buflen };
- return qio_channel_readv_full(ioc, &iov, 1, NULL, NULL, errp);
-}
-
-
-ssize_t qio_channel_write(QIOChannel *ioc,
- const char *buf,
- size_t buflen,
- Error **errp)
-{
- struct iovec iov = { .iov_base = (char *)buf, .iov_len = buflen };
- return qio_channel_writev_full(ioc, &iov, 1, NULL, 0, errp);
-}
-
-
-int qio_channel_set_blocking(QIOChannel *ioc,
- bool enabled,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
- return klass->io_set_blocking(ioc, enabled, errp);
-}
-
-
-int qio_channel_close(QIOChannel *ioc,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
- return klass->io_close(ioc, errp);
-}
-
-
-GSource *qio_channel_create_watch(QIOChannel *ioc,
- GIOCondition condition)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
- return klass->io_create_watch(ioc, condition);
-}
-
-
-guint qio_channel_add_watch(QIOChannel *ioc,
- GIOCondition condition,
- QIOChannelFunc func,
- gpointer user_data,
- GDestroyNotify notify)
-{
- GSource *source;
- guint id;
-
- source = qio_channel_create_watch(ioc, condition);
-
- g_source_set_callback(source, (GSourceFunc)func, user_data, notify);
-
- id = g_source_attach(source, NULL);
- g_source_unref(source);
-
- return id;
-}
-
-
-int qio_channel_shutdown(QIOChannel *ioc,
- QIOChannelShutdown how,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if (!klass->io_shutdown) {
- error_setg(errp, "Data path shutdown not supported");
- return -1;
- }
-
- return klass->io_shutdown(ioc, how, errp);
-}
-
-
-void qio_channel_set_delay(QIOChannel *ioc,
- bool enabled)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if (klass->io_set_delay) {
- klass->io_set_delay(ioc, enabled);
- }
-}
-
-
-void qio_channel_set_cork(QIOChannel *ioc,
- bool enabled)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if (klass->io_set_cork) {
- klass->io_set_cork(ioc, enabled);
- }
-}
-
-
-off_t qio_channel_io_seek(QIOChannel *ioc,
- off_t offset,
- int whence,
- Error **errp)
-{
- QIOChannelClass *klass = QIO_CHANNEL_GET_CLASS(ioc);
-
- if (!klass->io_seek) {
- error_setg(errp, "Channel does not support random access");
- return -1;
- }
-
- return klass->io_seek(ioc, offset, whence, errp);
-}
-
-
-typedef struct QIOChannelYieldData QIOChannelYieldData;
-struct QIOChannelYieldData {
- QIOChannel *ioc;
- Coroutine *co;
-};
-
-
-static gboolean qio_channel_yield_enter(QIOChannel *ioc,
- GIOCondition condition,
- gpointer opaque)
-{
- QIOChannelYieldData *data = opaque;
- qemu_coroutine_enter(data->co, NULL);
- return FALSE;
-}
-
-
-void coroutine_fn qio_channel_yield(QIOChannel *ioc,
- GIOCondition condition)
-{
- QIOChannelYieldData data;
-
- assert(qemu_in_coroutine());
- data.ioc = ioc;
- data.co = qemu_coroutine_self();
- qio_channel_add_watch(ioc,
- condition,
- qio_channel_yield_enter,
- &data,
- NULL);
- qemu_coroutine_yield();
-}
-
-
-static gboolean qio_channel_wait_complete(QIOChannel *ioc,
- GIOCondition condition,
- gpointer opaque)
-{
- GMainLoop *loop = opaque;
-
- g_main_loop_quit(loop);
- return FALSE;
-}
-
-
-void qio_channel_wait(QIOChannel *ioc,
- GIOCondition condition)
-{
- GMainContext *ctxt = g_main_context_new();
- GMainLoop *loop = g_main_loop_new(ctxt, TRUE);
- GSource *source;
-
- source = qio_channel_create_watch(ioc, condition);
-
- g_source_set_callback(source,
- (GSourceFunc)qio_channel_wait_complete,
- loop,
- NULL);
-
- g_source_attach(source, ctxt);
-
- g_main_loop_run(loop);
-
- g_source_unref(source);
- g_main_loop_unref(loop);
- g_main_context_unref(ctxt);
-}
-
-
-#ifdef _WIN32
-static void qio_channel_finalize(Object *obj)
-{
- QIOChannel *ioc = QIO_CHANNEL(obj);
-
- if (ioc->event) {
- CloseHandle(ioc->event);
- }
-}
-#endif
-
-static const TypeInfo qio_channel_info = {
- .parent = TYPE_OBJECT,
- .name = TYPE_QIO_CHANNEL,
- .instance_size = sizeof(QIOChannel),
-#ifdef _WIN32
- .instance_finalize = qio_channel_finalize,
-#endif
- .abstract = true,
- .class_size = sizeof(QIOChannelClass),
-};
-
-
-static void qio_channel_register_types(void)
-{
- type_register_static(&qio_channel_info);
-}
-
-
-type_init(qio_channel_register_types);