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