Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  io.c   Sprache: C

 
// 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
C=94 H=96 G=94

¤ Dauer der Verarbeitung: 0.24 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge