brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · fedb2a7 Raw
158 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * tools/testing/selftests/kvm/lib/io.c4 *5 * Copyright (C) 2018, Google LLC.6 */7 8#include "test_util.h"9 10/* Test Write11 *12 * A wrapper for write(2), that automatically handles the following13 * special conditions:14 *15 *   + Interrupted system call (EINTR)16 *   + Write of less than requested amount17 *   + Non-block return (EAGAIN)18 *19 * For each of the above, an additional write is performed to automatically20 * continue writing the requested data.21 * There are also many cases where write(2) can return an unexpected22 * error (e.g. EIO).  Such errors cause a TEST_ASSERT failure.23 *24 * Note, for function signature compatibility with write(2), this function25 * returns the number of bytes written, but that value will always be equal26 * to the number of requested bytes.  All other conditions in this and27 * future enhancements to this function either automatically issue another28 * 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 of49	 * 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 Read83 *84 * A wrapper for read(2), that automatically handles the following85 * special conditions:86 *87 *   + Interrupted system call (EINTR)88 *   + Read of less than requested amount89 *   + Non-block return (EAGAIN)90 *91 * For each of the above, an additional read is performed to automatically92 * continue reading the requested data.93 * There are also many cases where read(2) can return an unexpected94 * 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 position96 * contains at least the number of requested bytes to be read.  A TEST_ASSERT97 * failure is produced if an End-Of-File condition occurs, before all the98 * data is read.  It is the callers responsibility to assure that sufficient99 * data exists.100 *101 * Note, for function signature compatibility with read(2), this function102 * returns the number of bytes read, but that value will always be equal103 * to the number of requested bytes.  All other conditions in this and104 * future enhancements to this function either automatically issue another105 * 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 of126	 * 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}158