1 /* Test for timeout handling. 2 Copyright (C) 2000-2022 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 do_test(void)28do_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" 98