Lines Matching refs:f

64 int qemu_file_shutdown(QEMUFile *f)  in qemu_file_shutdown()  argument
87 if (!f->last_error) { in qemu_file_shutdown()
88 qemu_file_set_error(f, -EIO); in qemu_file_shutdown()
91 if (!qio_channel_has_feature(f->ioc, in qemu_file_shutdown()
96 if (qio_channel_shutdown(f->ioc, QIO_CHANNEL_SHUTDOWN_BOTH, &err) < 0) { in qemu_file_shutdown()
106 QEMUFile *f; in qemu_file_new_impl() local
108 f = g_new0(QEMUFile, 1); in qemu_file_new_impl()
111 f->ioc = ioc; in qemu_file_new_impl()
112 f->is_writable = is_writable; in qemu_file_new_impl()
114 return f; in qemu_file_new_impl()
121 QEMUFile *qemu_file_get_return_path(QEMUFile *f) in qemu_file_get_return_path() argument
123 return qemu_file_new_impl(f->ioc, !f->is_writable); in qemu_file_get_return_path()
144 int qemu_file_get_error_obj(QEMUFile *f, Error **errp) in qemu_file_get_error_obj() argument
146 if (!f->last_error) { in qemu_file_get_error_obj()
152 if (f->last_error_obj) { in qemu_file_get_error_obj()
153 *errp = error_copy(f->last_error_obj); in qemu_file_get_error_obj()
155 error_setg_errno(errp, -f->last_error, "Channel error"); in qemu_file_get_error_obj()
159 return f->last_error; in qemu_file_get_error_obj()
192 void qemu_file_set_error_obj(QEMUFile *f, int ret, Error *err) in qemu_file_set_error_obj() argument
194 if (f->last_error == 0 && ret) { in qemu_file_set_error_obj()
195 f->last_error = ret; in qemu_file_set_error_obj()
196 error_propagate(&f->last_error_obj, err); in qemu_file_set_error_obj()
209 int qemu_file_get_error(QEMUFile *f) in qemu_file_get_error() argument
211 return f->last_error; in qemu_file_get_error()
217 void qemu_file_set_error(QEMUFile *f, int ret) in qemu_file_set_error() argument
219 qemu_file_set_error_obj(f, ret, NULL); in qemu_file_set_error()
222 static bool qemu_file_is_writable(QEMUFile *f) in qemu_file_is_writable() argument
224 return f->is_writable; in qemu_file_is_writable()
227 static void qemu_iovec_release_ram(QEMUFile *f) in qemu_iovec_release_ram() argument
233 idx = find_next_bit(f->may_free, f->iovcnt, 0); in qemu_iovec_release_ram()
234 if (idx >= f->iovcnt) { in qemu_iovec_release_ram()
237 iov = f->iov[idx]; in qemu_iovec_release_ram()
243 while ((idx = find_next_bit(f->may_free, f->iovcnt, idx + 1)) < f->iovcnt) { in qemu_iovec_release_ram()
245 if (iov.iov_base + iov.iov_len == f->iov[idx].iov_base) { in qemu_iovec_release_ram()
246 iov.iov_len += f->iov[idx].iov_len; in qemu_iovec_release_ram()
253 iov = f->iov[idx]; in qemu_iovec_release_ram()
259 memset(f->may_free, 0, sizeof(f->may_free)); in qemu_iovec_release_ram()
262 bool qemu_file_is_seekable(QEMUFile *f) in qemu_file_is_seekable() argument
264 return qio_channel_has_feature(f->ioc, QIO_CHANNEL_FEATURE_SEEKABLE); in qemu_file_is_seekable()
273 int qemu_fflush(QEMUFile *f) in qemu_fflush() argument
275 if (!qemu_file_is_writable(f)) { in qemu_fflush()
276 return f->last_error; in qemu_fflush()
279 if (f->last_error) { in qemu_fflush()
280 return f->last_error; in qemu_fflush()
282 if (f->iovcnt > 0) { in qemu_fflush()
284 if (qio_channel_writev_all(f->ioc, in qemu_fflush()
285 f->iov, f->iovcnt, in qemu_fflush()
287 qemu_file_set_error_obj(f, -EIO, local_error); in qemu_fflush()
289 uint64_t size = iov_size(f->iov, f->iovcnt); in qemu_fflush()
293 qemu_iovec_release_ram(f); in qemu_fflush()
296 f->buf_index = 0; in qemu_fflush()
297 f->iovcnt = 0; in qemu_fflush()
298 return f->last_error; in qemu_fflush()
309 static ssize_t coroutine_mixed_fn qemu_fill_buffer(QEMUFile *f) in qemu_fill_buffer() argument
315 assert(!qemu_file_is_writable(f)); in qemu_fill_buffer()
317 pending = f->buf_size - f->buf_index; in qemu_fill_buffer()
319 memmove(f->buf, f->buf + f->buf_index, pending); in qemu_fill_buffer()
321 f->buf_index = 0; in qemu_fill_buffer()
322 f->buf_size = pending; in qemu_fill_buffer()
324 if (qemu_file_get_error(f)) { in qemu_fill_buffer()
329 len = qio_channel_read(f->ioc, in qemu_fill_buffer()
330 (char *)f->buf + pending, in qemu_fill_buffer()
335 qio_channel_yield(f->ioc, G_IO_IN); in qemu_fill_buffer()
337 qio_channel_wait(f->ioc, G_IO_IN); in qemu_fill_buffer()
345 f->buf_size += len; in qemu_fill_buffer()
347 qemu_file_set_error_obj(f, -EIO, local_error); in qemu_fill_buffer()
349 qemu_file_set_error_obj(f, len, local_error); in qemu_fill_buffer()
363 int qemu_fclose(QEMUFile *f) in qemu_fclose() argument
365 int ret = qemu_fflush(f); in qemu_fclose()
366 int ret2 = qio_channel_close(f->ioc, NULL); in qemu_fclose()
370 g_clear_pointer(&f->ioc, object_unref); in qemu_fclose()
371 error_free(f->last_error_obj); in qemu_fclose()
372 g_free(f); in qemu_fclose()
385 static int add_to_iovec(QEMUFile *f, const uint8_t *buf, size_t size, in add_to_iovec() argument
389 if (f->iovcnt > 0 && buf == f->iov[f->iovcnt - 1].iov_base + in add_to_iovec()
390 f->iov[f->iovcnt - 1].iov_len && in add_to_iovec()
391 may_free == test_bit(f->iovcnt - 1, f->may_free)) in add_to_iovec()
393 f->iov[f->iovcnt - 1].iov_len += size; in add_to_iovec()
395 if (f->iovcnt >= MAX_IOV_SIZE) { in add_to_iovec()
397 assert(qemu_file_get_error(f) || !qemu_file_is_writable(f)); in add_to_iovec()
401 set_bit(f->iovcnt, f->may_free); in add_to_iovec()
403 f->iov[f->iovcnt].iov_base = (uint8_t *)buf; in add_to_iovec()
404 f->iov[f->iovcnt++].iov_len = size; in add_to_iovec()
407 if (f->iovcnt >= MAX_IOV_SIZE) { in add_to_iovec()
408 qemu_fflush(f); in add_to_iovec()
415 static void add_buf_to_iovec(QEMUFile *f, size_t len) in add_buf_to_iovec() argument
417 if (!add_to_iovec(f, f->buf + f->buf_index, len, false)) { in add_buf_to_iovec()
418 f->buf_index += len; in add_buf_to_iovec()
419 if (f->buf_index == IO_BUF_SIZE) { in add_buf_to_iovec()
420 qemu_fflush(f); in add_buf_to_iovec()
425 void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, size_t size, in qemu_put_buffer_async() argument
428 if (f->last_error) { in qemu_put_buffer_async()
432 add_to_iovec(f, buf, size, may_free); in qemu_put_buffer_async()
435 void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, size_t size) in qemu_put_buffer() argument
439 if (f->last_error) { in qemu_put_buffer()
444 l = IO_BUF_SIZE - f->buf_index; in qemu_put_buffer()
448 memcpy(f->buf + f->buf_index, buf, l); in qemu_put_buffer()
449 add_buf_to_iovec(f, l); in qemu_put_buffer()
450 if (qemu_file_get_error(f)) { in qemu_put_buffer()
458 void qemu_put_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, in qemu_put_buffer_at() argument
464 if (f->last_error) { in qemu_put_buffer_at()
468 qemu_fflush(f); in qemu_put_buffer_at()
469 ret = qio_channel_pwrite(f->ioc, (char *)buf, buflen, pos, &err); in qemu_put_buffer_at()
472 qemu_file_set_error_obj(f, -EIO, err); in qemu_put_buffer_at()
477 qemu_file_set_error_obj(f, -EAGAIN, NULL); in qemu_put_buffer_at()
484 qemu_file_set_error_obj(f, -EIO, err); in qemu_put_buffer_at()
494 size_t qemu_get_buffer_at(QEMUFile *f, const uint8_t *buf, size_t buflen, in qemu_get_buffer_at() argument
500 if (f->last_error) { in qemu_get_buffer_at()
504 ret = qio_channel_pread(f->ioc, (char *)buf, buflen, pos, &err); in qemu_get_buffer_at()
507 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_buffer_at()
512 qemu_file_set_error_obj(f, -EAGAIN, NULL); in qemu_get_buffer_at()
518 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_buffer_at()
525 void qemu_set_offset(QEMUFile *f, off_t off, int whence) in qemu_set_offset() argument
530 if (qemu_file_is_writable(f)) { in qemu_set_offset()
531 qemu_fflush(f); in qemu_set_offset()
534 f->buf_index = 0; in qemu_set_offset()
535 f->buf_size = 0; in qemu_set_offset()
538 ret = qio_channel_io_seek(f->ioc, off, whence, &err); in qemu_set_offset()
540 qemu_file_set_error_obj(f, -EIO, err); in qemu_set_offset()
544 off_t qemu_get_offset(QEMUFile *f) in qemu_get_offset() argument
549 qemu_fflush(f); in qemu_get_offset()
551 ret = qio_channel_io_seek(f->ioc, 0, SEEK_CUR, &err); in qemu_get_offset()
553 qemu_file_set_error_obj(f, -EIO, err); in qemu_get_offset()
559 void qemu_put_byte(QEMUFile *f, int v) in qemu_put_byte() argument
561 if (f->last_error) { in qemu_put_byte()
565 f->buf[f->buf_index] = v; in qemu_put_byte()
566 add_buf_to_iovec(f, 1); in qemu_put_byte()
569 void qemu_file_skip(QEMUFile *f, int size) in qemu_file_skip() argument
571 if (f->buf_index + size <= f->buf_size) { in qemu_file_skip()
572 f->buf_index += size; in qemu_file_skip()
584 size_t coroutine_mixed_fn qemu_peek_buffer(QEMUFile *f, uint8_t **buf, size_t size, size_t offset) in qemu_peek_buffer() argument
589 assert(!qemu_file_is_writable(f)); in qemu_peek_buffer()
594 index = f->buf_index + offset; in qemu_peek_buffer()
596 pending = f->buf_size - index; in qemu_peek_buffer()
603 int received = qemu_fill_buffer(f); in qemu_peek_buffer()
609 index = f->buf_index + offset; in qemu_peek_buffer()
610 pending = f->buf_size - index; in qemu_peek_buffer()
620 *buf = f->buf + index; in qemu_peek_buffer()
632 size_t coroutine_mixed_fn qemu_get_buffer(QEMUFile *f, uint8_t *buf, size_t size) in qemu_get_buffer() argument
641 res = qemu_peek_buffer(f, &src, MIN(pending, IO_BUF_SIZE), 0); in qemu_get_buffer()
646 qemu_file_skip(f, res); in qemu_get_buffer()
673 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
679 res = qemu_peek_buffer(f, &src, size, 0); in qemu_get_buffer_in_place()
682 qemu_file_skip(f, res); in qemu_get_buffer_in_place()
688 return qemu_get_buffer(f, *buf, size); in qemu_get_buffer_in_place()
695 int coroutine_mixed_fn qemu_peek_byte(QEMUFile *f, int offset) in qemu_peek_byte() argument
697 int index = f->buf_index + offset; in qemu_peek_byte()
699 assert(!qemu_file_is_writable(f)); in qemu_peek_byte()
702 if (index >= f->buf_size) { in qemu_peek_byte()
703 qemu_fill_buffer(f); in qemu_peek_byte()
704 index = f->buf_index + offset; in qemu_peek_byte()
705 if (index >= f->buf_size) { in qemu_peek_byte()
709 return f->buf[index]; in qemu_peek_byte()
712 int coroutine_mixed_fn qemu_get_byte(QEMUFile *f) in qemu_get_byte() argument
716 result = qemu_peek_byte(f, 0); in qemu_get_byte()
717 qemu_file_skip(f, 1); in qemu_get_byte()
721 uint64_t qemu_file_transferred(QEMUFile *f) in qemu_file_transferred() argument
726 g_assert(qemu_file_is_writable(f)); in qemu_file_transferred()
728 for (i = 0; i < f->iovcnt; i++) { in qemu_file_transferred()
729 ret += f->iov[i].iov_len; in qemu_file_transferred()
735 void qemu_put_be16(QEMUFile *f, unsigned int v) in qemu_put_be16() argument
737 qemu_put_byte(f, v >> 8); in qemu_put_be16()
738 qemu_put_byte(f, v); in qemu_put_be16()
741 void qemu_put_be32(QEMUFile *f, unsigned int v) in qemu_put_be32() argument
743 qemu_put_byte(f, v >> 24); in qemu_put_be32()
744 qemu_put_byte(f, v >> 16); in qemu_put_be32()
745 qemu_put_byte(f, v >> 8); in qemu_put_be32()
746 qemu_put_byte(f, v); in qemu_put_be32()
749 void qemu_put_be64(QEMUFile *f, uint64_t v) in qemu_put_be64() argument
751 qemu_put_be32(f, v >> 32); in qemu_put_be64()
752 qemu_put_be32(f, v); in qemu_put_be64()
755 unsigned int qemu_get_be16(QEMUFile *f) in qemu_get_be16() argument
758 v = qemu_get_byte(f) << 8; in qemu_get_be16()
759 v |= qemu_get_byte(f); in qemu_get_be16()
763 unsigned int qemu_get_be32(QEMUFile *f) in qemu_get_be32() argument
766 v = (unsigned int)qemu_get_byte(f) << 24; in qemu_get_be32()
767 v |= qemu_get_byte(f) << 16; in qemu_get_be32()
768 v |= qemu_get_byte(f) << 8; in qemu_get_be32()
769 v |= qemu_get_byte(f); in qemu_get_be32()
773 uint64_t qemu_get_be64(QEMUFile *f) in qemu_get_be64() argument
776 v = (uint64_t)qemu_get_be32(f) << 32; in qemu_get_be64()
777 v |= qemu_get_be32(f); in qemu_get_be64()
788 size_t coroutine_fn qemu_get_counted_string(QEMUFile *f, char buf[256]) in qemu_get_counted_string() argument
790 size_t len = qemu_get_byte(f); in qemu_get_counted_string()
791 size_t res = qemu_get_buffer(f, (uint8_t *)buf, len); in qemu_get_counted_string()
802 void qemu_put_counted_string(QEMUFile *f, const char *str) in qemu_put_counted_string() argument
807 qemu_put_byte(f, len); in qemu_put_counted_string()
808 qemu_put_buffer(f, (const uint8_t *)str, len); in qemu_put_counted_string()
817 void qemu_file_set_blocking(QEMUFile *f, bool block) in qemu_file_set_blocking() argument
819 qio_channel_set_blocking(f->ioc, block, NULL); in qemu_file_set_blocking()
838 int qemu_file_get_to_fd(QEMUFile *f, int fd, size_t size) in qemu_file_get_to_fd() argument
841 size_t pending = f->buf_size - f->buf_index; in qemu_file_get_to_fd()
845 rc = qemu_fill_buffer(f); in qemu_file_get_to_fd()
855 rc = write(fd, f->buf + f->buf_index, MIN(pending, size)); in qemu_file_get_to_fd()
862 f->buf_index += rc; in qemu_file_get_to_fd()