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>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Nikolay Borisov
2022-10-28 13:39:06 +03:00
committed by Fabiano Rosas
parent 11fc708273
commit 694d818a8c
2 changed files with 9 additions and 0 deletions

View File

@@ -44,6 +44,7 @@ enum QIOChannelFeature {
QIO_CHANNEL_FEATURE_LISTEN, QIO_CHANNEL_FEATURE_LISTEN,
QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY, QIO_CHANNEL_FEATURE_WRITE_ZERO_COPY,
QIO_CHANNEL_FEATURE_READ_MSG_PEEK, QIO_CHANNEL_FEATURE_READ_MSG_PEEK,
QIO_CHANNEL_FEATURE_SEEKABLE,
}; };

View File

@@ -36,6 +36,10 @@ qio_channel_file_new_fd(int fd)
ioc->fd = 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); trace_qio_channel_file_new_fd(ioc, fd);
return ioc; return ioc;
@@ -60,6 +64,10 @@ qio_channel_file_new_path(const char *path,
return NULL; 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); trace_qio_channel_file_new_path(ioc, path, flags, mode, ioc->fd);
return ioc; return ioc;