2 * QEMU I/O channels files driver
4 * Copyright (c) 2015 Red Hat, Inc.
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 #include "qemu/osdep.h"
22 #include "io/channel-file.h"
23 #include "io/channel-watch.h"
24 #include "qapi/error.h"
25 #include "qemu/sockets.h"
29 qio_channel_file_new_fd(int fd
)
33 ioc
= QIO_CHANNEL_FILE(object_new(TYPE_QIO_CHANNEL_FILE
));
37 trace_qio_channel_file_new_fd(ioc
, fd
);
44 qio_channel_file_new_path(const char *path
,
51 ioc
= QIO_CHANNEL_FILE(object_new(TYPE_QIO_CHANNEL_FILE
));
53 ioc
->fd
= qemu_open(path
, flags
, mode
);
55 object_unref(OBJECT(ioc
));
56 error_setg_errno(errp
, errno
,
57 "Unable to open %s", path
);
61 trace_qio_channel_file_new_path(ioc
, path
, flags
, mode
, ioc
->fd
);
67 static void qio_channel_file_init(Object
*obj
)
69 QIOChannelFile
*ioc
= QIO_CHANNEL_FILE(obj
);
73 static void qio_channel_file_finalize(Object
*obj
)
75 QIOChannelFile
*ioc
= QIO_CHANNEL_FILE(obj
);
83 static ssize_t
qio_channel_file_readv(QIOChannel
*ioc
,
84 const struct iovec
*iov
,
90 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
94 ret
= readv(fioc
->fd
, iov
, niov
);
96 if (errno
== EAGAIN
) {
97 return QIO_CHANNEL_ERR_BLOCK
;
103 error_setg_errno(errp
, errno
,
104 "Unable to read from file");
111 static ssize_t
qio_channel_file_writev(QIOChannel
*ioc
,
112 const struct iovec
*iov
,
118 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
122 ret
= writev(fioc
->fd
, iov
, niov
);
124 if (errno
== EAGAIN
) {
125 return QIO_CHANNEL_ERR_BLOCK
;
127 if (errno
== EINTR
) {
130 error_setg_errno(errp
, errno
,
131 "Unable to write to file");
137 static int qio_channel_file_set_blocking(QIOChannel
*ioc
,
141 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
144 qemu_set_block(fioc
->fd
);
146 qemu_set_nonblock(fioc
->fd
);
152 static off_t
qio_channel_file_seek(QIOChannel
*ioc
,
157 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
160 ret
= lseek(fioc
->fd
, offset
, whence
);
161 if (ret
== (off_t
)-1) {
162 error_setg_errno(errp
, errno
,
163 "Unable to seek to offset %lld whence %d in file",
164 (long long int)offset
, whence
);
171 static int qio_channel_file_close(QIOChannel
*ioc
,
174 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
176 if (qemu_close(fioc
->fd
) < 0) {
177 error_setg_errno(errp
, errno
,
178 "Unable to close file");
186 static void qio_channel_file_set_aio_fd_handler(QIOChannel
*ioc
,
192 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
193 aio_set_fd_handler(ctx
, fioc
->fd
, false, io_read
, io_write
, NULL
, opaque
);
196 static GSource
*qio_channel_file_create_watch(QIOChannel
*ioc
,
197 GIOCondition condition
)
199 QIOChannelFile
*fioc
= QIO_CHANNEL_FILE(ioc
);
200 return qio_channel_create_fd_watch(ioc
,
205 static void qio_channel_file_class_init(ObjectClass
*klass
,
206 void *class_data G_GNUC_UNUSED
)
208 QIOChannelClass
*ioc_klass
= QIO_CHANNEL_CLASS(klass
);
210 ioc_klass
->io_writev
= qio_channel_file_writev
;
211 ioc_klass
->io_readv
= qio_channel_file_readv
;
212 ioc_klass
->io_set_blocking
= qio_channel_file_set_blocking
;
213 ioc_klass
->io_seek
= qio_channel_file_seek
;
214 ioc_klass
->io_close
= qio_channel_file_close
;
215 ioc_klass
->io_create_watch
= qio_channel_file_create_watch
;
216 ioc_klass
->io_set_aio_fd_handler
= qio_channel_file_set_aio_fd_handler
;
219 static const TypeInfo qio_channel_file_info
= {
220 .parent
= TYPE_QIO_CHANNEL
,
221 .name
= TYPE_QIO_CHANNEL_FILE
,
222 .instance_size
= sizeof(QIOChannelFile
),
223 .instance_init
= qio_channel_file_init
,
224 .instance_finalize
= qio_channel_file_finalize
,
225 .class_init
= qio_channel_file_class_init
,
228 static void qio_channel_file_register_types(void)
230 type_register_static(&qio_channel_file_info
);
233 type_init(qio_channel_file_register_types
);