diff options
author | Nikolay Borisov <nborisov@suse.com> | 2024-02-29 12:29:56 -0300 |
---|---|---|
committer | Peter Xu <peterx@redhat.com> | 2024-03-01 15:42:04 +0800 |
commit | 401e311ff72e0a62c834bfe466de68a82cfd90cb (patch) | |
tree | 9a043d67e1b8f4a384008d15783ca38b4a7375c8 | |
parent | 4aac6b1e9bd48677c4f24518fe86ffd34c677d5a (diff) | |
download | qemu-401e311ff72e0a62c834bfe466de68a82cfd90cb.zip qemu-401e311ff72e0a62c834bfe466de68a82cfd90cb.tar.gz qemu-401e311ff72e0a62c834bfe466de68a82cfd90cb.tar.bz2 |
io: add and implement QIO_CHANNEL_FEATURE_SEEKABLE for channel file
Add a generic QIOChannel feature SEEKABLE which would be used by the
qemu_file* apis. For the time being this will be only implemented for
file channels.
Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: "Daniel P. Berrangé" <berrange@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Link: https://lore.kernel.org/r/20240229153017.2221-3-farosas@suse.de
Signed-off-by: Peter Xu <peterx@redhat.com>
-rw-r--r-- | include/io/channel.h | 1 | ||||
-rw-r--r-- | io/channel-file.c | 8 |
2 files changed, 9 insertions, 0 deletions
diff --git a/include/io/channel.h b/include/io/channel.h index 5f9dbaa..fcb19fd 100644 --- a/include/io/channel.h +++ b/include/io/channel.h @@ -44,6 +44,7 @@ enum QIOChannelFeature { QIO_CHANNEL_FEATURE_LISTEN, QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY, QIO_CHANNEL_FEATURE_READ_MSG_PEEK, + QIO_CHANNEL_FEATURE_SEEKABLE, }; diff --git a/io/channel-file.c b/io/channel-file.c index 4a12c61..f91bf6d 100644 --- a/io/channel-file.c +++ b/io/channel-file.c @@ -36,6 +36,10 @@ qio_channel_file_new_fd(int fd) ioc->fd = fd; + if (lseek(fd, 0, SEEK_CUR) != (off_t)-1) { + qio_channel_set_feature(QIO_CHANNEL(ioc), QIO_CHANNEL_FEATURE_SEEKABLE); + } + trace_qio_channel_file_new_fd(ioc, fd); return ioc; @@ -60,6 +64,10 @@ qio_channel_file_new_path(const char *path, return NULL; } + if (lseek(ioc->fd, 0, SEEK_CUR) != (off_t)-1) { + qio_channel_set_feature(QIO_CHANNEL(ioc), QIO_CHANNEL_FEATURE_SEEKABLE); + } + trace_qio_channel_file_new_path(ioc, path, flags, mode, ioc->fd); return ioc; |