Lines Matching refs:f

63 int qemu_file_shutdown(QEMUFile *f)  in qemu_file_shutdown()  argument
86 if (!f->last_error) { in qemu_file_shutdown()
87 qemu_file_set_error(f, -EIO); in qemu_file_shutdown()
90 if (!qio_channel_has_feature(f->ioc, in qemu_file_shutdown()
95 if (qio_channel_shutdown(f->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, &err) < 0) { in qemu_file_shutdown()
105 QEMUFile *f; in qemu_file_new_impl() local
107 f = g_new0(QEMUFile, 1); in qemu_file_new_impl()
110 f->ioc = ioc; in qemu_file_new_impl()
111 f->is_writable = is_writable; in qemu_file_new_impl()
113 return f; in qemu_file_new_impl()
120 QEMUFile *qemu_file_get_return_path(QEMUFile *f) in qemu_file_get_return_path() argument
122 return qemu_file_new_impl(f->ioc, !f->is_writable); in qemu_file_get_return_path()
143 int qemu_file_get_error_obj(QEMUFile *f, Error **errp) in qemu_file_get_error_obj() argument
145 if (!f->last_error) { in qemu_file_get_error_obj()
151 if (f->last_error_obj) { in qemu_file_get_error_obj()
152 *errp = error_copy(f->last_error_obj); in qemu_file_get_error_obj()
154 error_setg_errno(errp, -f->last_error, "Channel error"); in qemu_file_get_error_obj()
158 return f->last_error; in qemu_file_get_error_obj()
191 void qemu_file_set_error_obj(QEMUFile *f, int ret, Error *err) in qemu_file_set_error_obj() argument
193 if (f->last_error == 0 && ret) { in qemu_file_set_error_obj()
194 f->last_error = ret; in qemu_file_set_error_obj()
195 error_propagate(&f->last_error_obj, err); in qemu_file_set_error_obj()
208 int qemu_file_get_error(QEMUFile *f) in qemu_file_get_error() argument
210 return f->last_error; in qemu_file_get_error()
216 void qemu_file_set_error(QEMUFile *f, int ret) in qemu_file_set_error() argument
218 qemu_file_set_error_obj(f, ret, NULL); in qemu_file_set_error()
221 static bool qemu_file_is_writable(QEMUFile *f) in qemu_file_is_writable() argument
223 return f->is_writable; in qemu_file_is_writable()
226 static void qemu_iovec_release_ram(QEMUFile *f) in qemu_iovec_release_ram() argument
232 idx = find_next_bit(f->may_free, f->iovcnt, 0); in qemu_iovec_release_ram()
233 if (idx >= f->iovcnt) { in qemu_iovec_release_ram()
236 iov = f->iov[idx]; in qemu_iovec_release_ram()
242 while ((idx = find_next_bit(f->may_free, f->iovcnt, idx + 1)) < f->iovcnt) { in qemu_iovec_release_ram()
244 if (iov.iov_base + iov.iov_len == f->iov[idx].iov_base) { in qemu_iovec_release_ram()
245 iov.iov_len += f->iov[idx].iov_len; in qemu_iovec_release_ram()
252 iov = f->iov[idx]; in qemu_iovec_release_ram()
258 memset(f->may_free, 0, sizeof(f->may_free)); in qemu_iovec_release_ram()
261 bool qemu_file_is_seekable(QEMUFile *f) in qemu_file_is_seekable() argument
263 return qio_channel_has_feature(f->ioc, QIO_CHANNEL_FEATURE_SEEKABLE); in qemu_file_is_seekable()
272 int qemu_fflush(QEMUFile *f) in qemu_fflush() argument
274 if (!qemu_file_is_writable(f)) { in qemu_fflush()
275 return f->last_error; in qemu_fflush()
278 if (f->last_error) { in qemu_fflush()
279 return f->last_error; in qemu_fflush()
281 if (f->iovcnt > 0) { in qemu_fflush()
283 if (qio_channel_writev_all(f->ioc, in qemu_fflush()
284 f->iov, f->iovcnt, in qemu_fflush()
286 qemu_file_set_error_obj(f, -EIO, local_error); in qemu_fflush()
288 uint64_t size = iov_size(f->iov, f->iovcnt); in qemu_fflush()
292 qemu_iovec_release_ram(f); in qemu_fflush()
295 f->buf_index = 0; in qemu_fflush()
296 f->iovcnt = 0; in qemu_fflush()
297 return f->last_error; in qemu_fflush()
308 static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f) in qemu_fill_buffer() argument
314 assert(!qemu_file_is_writable(f)); in qemu_fill_buffer()
316 pending = f->buf_size - f->buf_index; in qemu_fill_buffer()
318 memmove(f->buf, f->buf + f->buf_index, pending); in qemu_fill_buffer()
320 f->buf_index = 0; in qemu_fill_buffer()
321 f->buf_size = pending; in qemu_fill_buffer()
323 if (qemu_file_get_error(f)) { in qemu_fill_buffer()
328 len = qio_channel_read(f->ioc, in qemu_fill_buffer()
329 (char *)f->buf + pending, in qemu_fill_buffer()
334 qio_channel_yield(f->ioc, G_IO_IN); in qemu_fill_buffer()
336 qio_channel_wait(f->ioc, G_IO_IN); in qemu_fill_buffer()
344 f->buf_size += len; in qemu_fill_buffer()
346 qemu_file_set_error_obj(f, -EIO, local_error); in qemu_fill_buffer()
348 qemu_file_set_error_obj(f, len, local_error); in qemu_fill_buffer()
362 int qemu_fclose(QEMUFile *f) in qemu_fclose() argument
364 int ret = qemu_fflush(f); in qemu_fclose()
365 int ret2 = qio_channel_close(f->ioc, NULL); in qemu_fclose()
369 g_clear_pointer(&f->ioc, object_unref); in qemu_fclose()
370 error_free(f->last_error_obj); in qemu_fclose()
371 g_free(f); in qemu_fclose()
384 static int add_to_iovec(QEMUFile *f, const uint8_t *buf, size_t size, in add_to_iovec() argument
388 if (f->iovcnt > 0 && buf == f->iov[f->iovcnt - 1].iov_base + in add_to_iovec()
389 f->iov[f->iovcnt - 1].iov_len && in add_to_iovec()
390 may_free == test_bit(f->iovcnt - 1, f->may_free)) in add_to_iovec()
392 f->iov[f->iovcnt - 1].iov_len += size; in add_to_iovec()
394 if (f->iovcnt >= MAX_IOV_SIZE) { in add_to_iovec()
396 assert(qemu_file_get_error(f) || !qemu_file_is_writable(f)); in add_to_iovec()
400 set_bit(f->iovcnt, f->may_free); in add_to_iovec()
402 f->iov[f->iovcnt].iov_base = (uint8_t *)buf; in add_to_iovec()
403 f->iov[f->iovcnt++].iov_len = size; in add_to_iovec()
406 if (f->iovcnt >= MAX_IOV_SIZE) { in add_to_iovec()
407 qemu_fflush(f); in add_to_iovec()
414 static void add_buf_to_iovec(QEMUFile *f, size_t len) in add_buf_to_iovec() argument
416 if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) { in add_buf_to_iovec()
417 f->buf_index += len; in add_buf_to_iovec()
418 if (f->buf_index == IO_BUF_SIZE) { in add_buf_to_iovec()
419 qemu_fflush(f); in add_buf_to_iovec()
424 void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, size_t size, in qemu_put_buffer_async() argument
427 if (f->last_error) { in qemu_put_buffer_async()
431 add_to_iovec(f, buf, size, may_free); in qemu_put_buffer_async()
434 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) in qemu_put_buffer() argument
438 if (f->last_error) { in qemu_put_buffer()
443 l = IO_BUF_SIZE - f->buf_index; in qemu_put_buffer()
447 memcpy(f->buf + f->buf_index, buf, l); in qemu_put_buffer()
448 add_buf_to_iovec(f, l); in qemu_put_buffer()
449 if (qemu_file_get_error(f)) { in qemu_put_buffer()
457 void qemu_put_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, in qemu_put_buffer_at() argument
463 if (f->last_error) { in qemu_put_buffer_at()
467 qemu_fflush(f); in qemu_put_buffer_at()
468 ret = qio_channel_pwrite(f->ioc, (char *)buf, buflen, pos, &err); in qemu_put_buffer_at()
471 qemu_file_set_error_obj(f, -EIO, err); in qemu_put_buffer_at()
476 qemu_file_set_error_obj(f, -EAGAIN, NULL); in qemu_put_buffer_at()
483 qemu_file_set_error_obj(f, -EIO, err); in qemu_put_buffer_at()
493 size_t qemu_get_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, in qemu_get_buffer_at() argument
499 if (f->last_error) { in qemu_get_buffer_at()
503 ret = qio_channel_pread(f->ioc, (char *)buf, buflen, pos, &err); in qemu_get_buffer_at()
506 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_buffer_at()
511 qemu_file_set_error_obj(f, -EAGAIN, NULL); in qemu_get_buffer_at()
517 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_buffer_at()
524 void qemu_set_offset(QEMUFile *f, off_t off, int whence) in qemu_set_offset() argument
529 if (qemu_file_is_writable(f)) { in qemu_set_offset()
530 qemu_fflush(f); in qemu_set_offset()
533 f->buf_index = 0; in qemu_set_offset()
534 f->buf_size = 0; in qemu_set_offset()
537 ret = qio_channel_io_seek(f->ioc, off, whence, &err); in qemu_set_offset()
539 qemu_file_set_error_obj(f, -EIO, err); in qemu_set_offset()
543 off_t qemu_get_offset(QEMUFile *f) in qemu_get_offset() argument
548 qemu_fflush(f); in qemu_get_offset()
550 ret = qio_channel_io_seek(f->ioc, 0, SEEK_CUR, &err); in qemu_get_offset()
552 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_offset()
558 void qemu_put_byte(QEMUFile *f, int v) in qemu_put_byte() argument
560 if (f->last_error) { in qemu_put_byte()
564 f->buf[f->buf_index] = v; in qemu_put_byte()
565 add_buf_to_iovec(f, 1); in qemu_put_byte()
568 void qemu_file_skip(QEMUFile *f, int size) in qemu_file_skip() argument
570 if (f->buf_index + size <= f->buf_size) { in qemu_file_skip()
571 f->buf_index += size; in qemu_file_skip()
583 size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset) in qemu_peek_buffer() argument
588 assert(!qemu_file_is_writable(f)); in qemu_peek_buffer()
593 index = f->buf_index + offset; in qemu_peek_buffer()
595 pending = f->buf_size - index; in qemu_peek_buffer()
602 int received = qemu_fill_buffer(f); in qemu_peek_buffer()
608 index = f->buf_index + offset; in qemu_peek_buffer()
609 pending = f->buf_size - index; in qemu_peek_buffer()
619 *buf = f->buf + index; in qemu_peek_buffer()
631 size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) in qemu_get_buffer() argument
640 res = qemu_peek_buffer(f, &src, MIN(pending, IO_BUF_SIZE), 0); in qemu_get_buffer()
645 qemu_file_skip(f, res); in qemu_get_buffer()
672 size_t coroutine_mixed_fn qemu_get_buffer_in_place(QEMUFile *f, uint8_t **buf, size_t size) in qemu_get_buffer_in_place() argument
678 res = qemu_peek_buffer(f, &src, size, 0); in qemu_get_buffer_in_place()
681 qemu_file_skip(f, res); in qemu_get_buffer_in_place()
687 return qemu_get_buffer(f, *buf, size); in qemu_get_buffer_in_place()
694 int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset) in qemu_peek_byte() argument
696 int index = f->buf_index + offset; in qemu_peek_byte()
698 assert(!qemu_file_is_writable(f)); in qemu_peek_byte()
701 if (index >= f->buf_size) { in qemu_peek_byte()
702 qemu_fill_buffer(f); in qemu_peek_byte()
703 index = f->buf_index + offset; in qemu_peek_byte()
704 if (index >= f->buf_size) { in qemu_peek_byte()
708 return f->buf[index]; in qemu_peek_byte()
711 int coroutine_mixed_fn qemu_get_byte(QEMUFile *f) in qemu_get_byte() argument
715 result = qemu_peek_byte(f, 0); in qemu_get_byte()
716 qemu_file_skip(f, 1); in qemu_get_byte()
720 uint64_t qemu_file_transferred(QEMUFile *f) in qemu_file_transferred() argument
725 g_assert(qemu_file_is_writable(f)); in qemu_file_transferred()
727 for (i = 0; i < f->iovcnt; i++) { in qemu_file_transferred()
728 ret += f->iov[i].iov_len; in qemu_file_transferred()
734 void qemu_put_be16(QEMUFile *f, unsigned int v) in qemu_put_be16() argument
736 qemu_put_byte(f, v >> 8); in qemu_put_be16()
737 qemu_put_byte(f, v); in qemu_put_be16()
740 void qemu_put_be32(QEMUFile *f, unsigned int v) in qemu_put_be32() argument
742 qemu_put_byte(f, v >> 24); in qemu_put_be32()
743 qemu_put_byte(f, v >> 16); in qemu_put_be32()
744 qemu_put_byte(f, v >> 8); in qemu_put_be32()
745 qemu_put_byte(f, v); in qemu_put_be32()
748 void qemu_put_be64(QEMUFile *f, uint64_t v) in qemu_put_be64() argument
750 qemu_put_be32(f, v >> 32); in qemu_put_be64()
751 qemu_put_be32(f, v); in qemu_put_be64()
754 unsigned int qemu_get_be16(QEMUFile *f) in qemu_get_be16() argument
757 v = qemu_get_byte(f) << 8; in qemu_get_be16()
758 v |= qemu_get_byte(f); in qemu_get_be16()
762 unsigned int qemu_get_be32(QEMUFile *f) in qemu_get_be32() argument
765 v = (unsigned int)qemu_get_byte(f) << 24; in qemu_get_be32()
766 v |= qemu_get_byte(f) << 16; in qemu_get_be32()
767 v |= qemu_get_byte(f) << 8; in qemu_get_be32()
768 v |= qemu_get_byte(f); in qemu_get_be32()
772 uint64_t qemu_get_be64(QEMUFile *f) in qemu_get_be64() argument
775 v = (uint64_t)qemu_get_be32(f) << 32; in qemu_get_be64()
776 v |= qemu_get_be32(f); in qemu_get_be64()
787 size_t coroutine_fn qemu_get_counted_string(QEMUFile *f, char buf[256]) in qemu_get_counted_string() argument
789 size_t len = qemu_get_byte(f); in qemu_get_counted_string()
790 size_t res = qemu_get_buffer(f, (uint8_t *)buf, len); in qemu_get_counted_string()
801 void qemu_put_counted_string(QEMUFile *f, const char *str) in qemu_put_counted_string() argument
806 qemu_put_byte(f, len); in qemu_put_counted_string()
807 qemu_put_buffer(f, (const uint8_t *)str, len); in qemu_put_counted_string()
816 void qemu_file_set_blocking(QEMUFile *f, bool block) in qemu_file_set_blocking() argument
818 qio_channel_set_blocking(f->ioc, block, NULL); in qemu_file_set_blocking()
837 int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size) in qemu_file_get_to_fd() argument
840 size_t pending = f->buf_size - f->buf_index; in qemu_file_get_to_fd()
844 rc = qemu_fill_buffer(f); in qemu_file_get_to_fd()
854 rc = write(fd, f->buf + f->buf_index, MIN(pending, size)); in qemu_file_get_to_fd()
861 f->buf_index += rc; in qemu_file_get_to_fd()