static ssize_t qio_channel_file_readv(QIOChannel *ioc, const struct iovec *iov, size_t niov, int **fds, size_t *nfds, Error **errp) { QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); ssize_t ret; retry: ret = readv(fioc->fd, iov, niov); if (ret < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { return QIO_CHANNEL_ERR_BLOCK; } if (errno == EINTR) { goto retry; } error_setg_errno(errp, errno, "Unable to read from file"); return -1; } return ret; }
QIOChannelFile * qio_channel_file_new_path(const char *path, int flags, mode_t mode, Error **errp) { QIOChannelFile *ioc; ioc = QIO_CHANNEL_FILE(object_new(TYPE_QIO_CHANNEL_FILE)); if (flags & O_WRONLY) { ioc->fd = open(path, flags, mode); } else { ioc->fd = open(path, flags); } if (ioc->fd < 0) { object_unref(OBJECT(ioc)); error_setg_errno(errp, errno, "Unable to open %s", path); return NULL; } trace_qio_channel_file_new_path(ioc, path, flags, mode, ioc->fd); return ioc; }
static void qio_channel_file_finalize(Object *obj) { QIOChannelFile *ioc = QIO_CHANNEL_FILE(obj); if (ioc->fd != -1) { close(ioc->fd); ioc->fd = -1; } }
static GSource *qio_channel_file_create_watch(QIOChannel *ioc, GIOCondition condition) { QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); return qio_channel_create_fd_watch(ioc, fioc->fd, condition); }
static int qio_channel_file_close(QIOChannel *ioc, Error **errp) { QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); if (close(fioc->fd) < 0) { error_setg_errno(errp, errno, "Unable to close file"); return -1; } return 0; }
QIOChannelFile * qio_channel_file_new_fd(int fd) { QIOChannelFile *ioc; ioc = QIO_CHANNEL_FILE(object_new(TYPE_QIO_CHANNEL_FILE)); ioc->fd = fd; trace_qio_channel_file_new_fd(ioc, fd); return ioc; }
static int qio_channel_file_set_blocking(QIOChannel *ioc, bool enabled, Error **errp) { QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); if (enabled) { qemu_set_block(fioc->fd); } else { qemu_set_nonblock(fioc->fd); } return 0; }
static off_t qio_channel_file_seek(QIOChannel *ioc, off_t offset, int whence, Error **errp) { QIOChannelFile *fioc = QIO_CHANNEL_FILE(ioc); off_t ret; ret = lseek(fioc->fd, offset, whence); if (ret == (off_t)-1) { error_setg_errno(errp, errno, "Unable to seek to offset %lld whence %d in file", (long long int)offset, whence); return -1; } return ret; }
/* Called with chr_write_lock held. */ static void pty_chr_update_read_handler_locked(Chardev *chr) { PtyChardev *s = PTY_CHARDEV(chr); GPollFD pfd; int rc; QIOChannelFile *fioc = QIO_CHANNEL_FILE(s->ioc); pfd.fd = fioc->fd; pfd.events = G_IO_OUT; pfd.revents = 0; do { rc = g_poll(&pfd, 1, 0); } while (rc == -1 && errno == EINTR); assert(rc >= 0); if (pfd.revents & G_IO_HUP) { pty_chr_state(chr, 0); } else { pty_chr_state(chr, 1); } }
static void qio_channel_file_init(Object *obj) { QIOChannelFile *ioc = QIO_CHANNEL_FILE(obj); ioc->fd = -1; }