File Index
Files and directories
Sign in
FILE

io.c

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/kvm/lib/io.c C
  1// SPDX-License-Identifier: GPL-2.0-only
  2/*
  3 * tools/testing/selftests/kvm/lib/io.c
  4 *
  5 * Copyright (C) 2018, Google LLC.
  6 */
  7
  8#include "test_util.h"
  9
 10/* Test Write
 11 *
 12 * A wrapper for write(2), that automatically handles the following
 13 * special conditions:
 14 *
 15 *   + Interrupted system call (EINTR)
 16 *   + Write of less than requested amount
 17 *   + Non-block return (EAGAIN)
 18 *
 19 * For each of the above, an additional write is performed to automatically
 20 * continue writing the requested data.
 21 * There are also many cases where write(2) can return an unexpected
 22 * error (e.g. EIO).  Such errors cause a TEST_ASSERT failure.
 23 *
 24 * Note, for function signature compatibility with write(2), this function
 25 * returns the number of bytes written, but that value will always be equal
 26 * to the number of requested bytes.  All other conditions in this and
 27 * future enhancements to this function either automatically issue another
 28 * write(2) or cause a TEST_ASSERT failure.
 29 *
 30 * Args:
 31 *  fd    - Opened file descriptor to file to be written.
 32 *  count - Number of bytes to write.
 33 *
 34 * Output:
 35 *  buf   - Starting address of data to be written.
 36 *
 37 * Return:
 38 *  On success, number of bytes written.
 39 *  On failure, a TEST_ASSERT failure is caused.
 40 */
 41ssize_t test_write(int fd, const void *buf, size_t count)
 42{
 43	ssize_t rc;
 44	ssize_t num_written = 0;
 45	size_t num_left = count;
 46	const char *ptr = buf;
 47
 48	/* Note: Count of zero is allowed (see "RETURN VALUE" portion of
 49	 * write(2) manpage for details.
 50	 */
 51	TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
 52
 53	do {
 54		rc = write(fd, ptr, num_left);
 55
 56		switch (rc) {
 57		case -1:
 58			TEST_ASSERT(errno == EAGAIN || errno == EINTR,
 59				    "Unexpected write failure,\n"
 60				    "  rc: %zi errno: %i", rc, errno);
 61			continue;
 62
 63		case 0:
 64			TEST_FAIL("Unexpected EOF,\n"
 65				  "  rc: %zi num_written: %zi num_left: %zu",
 66				  rc, num_written, num_left);
 67			break;
 68
 69		default:
 70			TEST_ASSERT(rc >= 0, "Unexpected ret from write,\n"
 71				"  rc: %zi errno: %i", rc, errno);
 72			num_written += rc;
 73			num_left -= rc;
 74			ptr += rc;
 75			break;
 76		}
 77	} while (num_written < count);
 78
 79	return num_written;
 80}
 81
 82/* Test Read
 83 *
 84 * A wrapper for read(2), that automatically handles the following
 85 * special conditions:
 86 *
 87 *   + Interrupted system call (EINTR)
 88 *   + Read of less than requested amount
 89 *   + Non-block return (EAGAIN)
 90 *
 91 * For each of the above, an additional read is performed to automatically
 92 * continue reading the requested data.
 93 * There are also many cases where read(2) can return an unexpected
 94 * error (e.g. EIO).  Such errors cause a TEST_ASSERT failure.  Note,
 95 * it is expected that the file opened by fd at the current file position
 96 * contains at least the number of requested bytes to be read.  A TEST_ASSERT
 97 * failure is produced if an End-Of-File condition occurs, before all the
 98 * data is read.  It is the callers responsibility to assure that sufficient
 99 * data exists.
100 *
101 * Note, for function signature compatibility with read(2), this function
102 * returns the number of bytes read, but that value will always be equal
103 * to the number of requested bytes.  All other conditions in this and
104 * future enhancements to this function either automatically issue another
105 * read(2) or cause a TEST_ASSERT failure.
106 *
107 * Args:
108 *  fd    - Opened file descriptor to file to be read.
109 *  count - Number of bytes to read.
110 *
111 * Output:
112 *  buf   - Starting address of where to write the bytes read.
113 *
114 * Return:
115 *  On success, number of bytes read.
116 *  On failure, a TEST_ASSERT failure is caused.
117 */
118ssize_t test_read(int fd, void *buf, size_t count)
119{
120	ssize_t rc;
121	ssize_t num_read = 0;
122	size_t num_left = count;
123	char *ptr = buf;
124
125	/* Note: Count of zero is allowed (see "If count is zero" portion of
126	 * read(2) manpage for details.
127	 */
128	TEST_ASSERT(count >= 0, "Unexpected count, count: %li", count);
129
130	do {
131		rc = read(fd, ptr, num_left);
132
133		switch (rc) {
134		case -1:
135			TEST_ASSERT(errno == EAGAIN || errno == EINTR,
136				    "Unexpected read failure,\n"
137				    "  rc: %zi errno: %i", rc, errno);
138			break;
139
140		case 0:
141			TEST_FAIL("Unexpected EOF,\n"
142				  "   rc: %zi num_read: %zi num_left: %zu",
143				  rc, num_read, num_left);
144			break;
145
146		default:
147			TEST_ASSERT(rc > 0, "Unexpected ret from read,\n"
148				    "  rc: %zi errno: %i", rc, errno);
149			num_read += rc;
150			num_left -= rc;
151			ptr += rc;
152			break;
153		}
154	} while (num_read < count);
155
156	return num_read;
157}
~/ Read-only file preview.