(root)/
glibc-2.38/
rt/
tst-aio6.c
       1  /* Test for timeout handling.
       2     Copyright (C) 2000-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <aio.h>
      20  #include <errno.h>
      21  #include <stdio.h>
      22  #include <unistd.h>
      23  #include <sys/time.h>
      24  
      25  
      26  #define TEST_FUNCTION do_test ()
      27  static int
      28  do_test (void)
      29  {
      30    struct aiocb *arr[1];
      31    struct aiocb cb;
      32    char buf[100];
      33    struct timeval before;
      34    struct timeval after;
      35    struct timespec timeout;
      36    int fd[2];
      37    int result = 0;
      38  
      39    if (pipe (fd) != 0)
      40      {
      41        printf ("cannot create pipe: %m\n");
      42        return 1;
      43      }
      44  
      45    arr[0] = &cb;
      46  
      47    cb.aio_fildes = fd[0];
      48    cb.aio_lio_opcode = LIO_WRITE;
      49    cb.aio_reqprio = 0;
      50    cb.aio_buf = (void *) buf;
      51    cb.aio_nbytes = sizeof (buf) - 1;
      52    cb.aio_offset = 0;
      53    cb.aio_sigevent.sigev_notify = SIGEV_NONE;
      54  
      55    /* Try to read from stdin where nothing will be available.  */
      56    if (aio_read (arr[0]) < 0)
      57      {
      58        if (errno == ENOSYS)
      59  	{
      60  	  puts ("no aio support in this configuration");
      61  	  return 0;
      62  	}
      63        printf ("aio_read failed: %m\n");
      64        return 1;
      65      }
      66  
      67    /* Get the current time.  */
      68    gettimeofday (&before, NULL);
      69  
      70    /* Wait for input which is unsuccessful and therefore the function will
      71       time out.  */
      72    timeout.tv_sec = 3;
      73    timeout.tv_nsec = 0;
      74    if (aio_suspend ((const struct aiocb *const*) arr, 1, &timeout) != -1)
      75      {
      76        puts ("aio_suspend() didn't return -1");
      77        result = 1;
      78      }
      79    else if (errno != EAGAIN)
      80      {
      81        puts ("error not set to EAGAIN");
      82        result = 1;
      83      }
      84    else
      85      {
      86        gettimeofday (&after, NULL);
      87        if (after.tv_sec < before.tv_sec + 1)
      88  	{
      89  	  puts ("timeout came too early");
      90  	  result = 1;
      91  	}
      92      }
      93  
      94    return result;
      95  }
      96  
      97  #include "../test-skeleton.c"