// SPDX-License-Identifier: GPL-2.0-only
/*
* tools / testing / selftests / kvm / lib / io . c
*
* Copyright ( C ) 2018 , Google LLC .
*/
#include "test_util.h"
/* Test Write
*
* A wrapper for write ( 2 ) , that automatically handles the following
* special conditions :
*
* + Interrupted system call ( EINTR )
* + Write of less than requested amount
* + Non - block return ( EAGAIN )
*
* For each of the above , an additional write is performed to automatically
* continue writing the requested data .
* There are also many cases where write ( 2 ) can return an unexpected
* error ( e . g . EIO ) . Such errors cause a TEST_ASSERT failure .
*
* Note , for function signature compatibility with write ( 2 ) , this function
* returns the number of bytes written , but that value will always be equal
* to the number of requested bytes . All other conditions in this and
* future enhancements to this function either automatically issue another
* write ( 2 ) or cause a TEST_ASSERT failure .
*
* Args :
* fd - Opened file descriptor to file to be written .
* count - Number of bytes to write .
*
* Output :
* buf - Starting address of data to be written .
*
* Return :
* On success , number of bytes written .
* On failure , a TEST_ASSERT failure is caused .
*/
ssize_t test_write(int fd, const void *buf, size_t count)
{
ssize_t rc;
ssize_t num_written = 0 ;
size_t num_left = count;
const char *ptr = buf;
/* Note: Count of zero is allowed (see "RETURN VALUE" portion of
* write ( 2 ) manpage for details .
*/
TEST_ASSERT(count >= 0 , "Unexpected count, count: %li" , count);
do {
rc = write(fd, ptr, num_left);
switch (rc) {
case -1 :
TEST_ASSERT(errno == EAGAIN || errno == EINTR,
"Unexpected write failure,\n"
" rc: %zi errno: %i" , rc, errno);
continue ;
case 0 :
TEST_FAIL("Unexpected EOF,\n"
" rc: %zi num_written: %zi num_left: %zu" ,
rc, num_written, num_left);
break ;
default :
TEST_ASSERT(rc >= 0 , "Unexpected ret from write,\n"
" rc: %zi errno: %i" , rc, errno);
num_written += rc;
num_left -= rc;
ptr += rc;
break ;
}
} while (num_written < count);
return num_written;
}
/* Test Read
*
* A wrapper for read ( 2 ) , that automatically handles the following
* special conditions :
*
* + Interrupted system call ( EINTR )
* + Read of less than requested amount
* + Non - block return ( EAGAIN )
*
* For each of the above , an additional read is performed to automatically
* continue reading the requested data .
* There are also many cases where read ( 2 ) can return an unexpected
* error ( e . g . EIO ) . Such errors cause a TEST_ASSERT failure . Note ,
* it is expected that the file opened by fd at the current file position
* contains at least the number of requested bytes to be read . A TEST_ASSERT
* failure is produced if an End - Of - File condition occurs , before all the
* data is read . It is the callers responsibility to assure that sufficient
* data exists .
*
* Note , for function signature compatibility with read ( 2 ) , this function
* returns the number of bytes read , but that value will always be equal
* to the number of requested bytes . All other conditions in this and
* future enhancements to this function either automatically issue another
* read ( 2 ) or cause a TEST_ASSERT failure .
*
* Args :
* fd - Opened file descriptor to file to be read .
* count - Number of bytes to read .
*
* Output :
* buf - Starting address of where to write the bytes read .
*
* Return :
* On success , number of bytes read .
* On failure , a TEST_ASSERT failure is caused .
*/
ssize_t test_read(int fd, void *buf, size_t count)
{
ssize_t rc;
ssize_t num_read = 0 ;
size_t num_left = count;
char *ptr = buf;
/* Note: Count of zero is allowed (see "If count is zero" portion of
* read ( 2 ) manpage for details .
*/
TEST_ASSERT(count >= 0 , "Unexpected count, count: %li" , count);
do {
rc = read(fd, ptr, num_left);
switch (rc) {
case -1 :
TEST_ASSERT(errno == EAGAIN || errno == EINTR,
"Unexpected read failure,\n"
" rc: %zi errno: %i" , rc, errno);
break ;
case 0 :
TEST_FAIL("Unexpected EOF,\n"
" rc: %zi num_read: %zi num_left: %zu" ,
rc, num_read, num_left);
break ;
default :
TEST_ASSERT(rc > 0 , "Unexpected ret from read,\n"
" rc: %zi errno: %i" , rc, errno);
num_read += rc;
num_left -= rc;
ptr += rc;
break ;
}
} while (num_read < count);
return num_read;
}
Messung V0.5 in Prozent C=77 H=89 G=83
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-10-12)
¤
*© Formatika GbR, Deutschland