(root)/
coreutils-9.4/
gnulib-tests/
test-select-stdin.c
       1  /* Test of select() substitute, reading from stdin.
       2     Copyright (C) 2008-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  /* Written by Bruno Haible <bruno@clisp.org>, 2008.  */
      18  
      19  #include <config.h>
      20  
      21  #include <stdio.h>
      22  #include <stdlib.h>
      23  #include <sys/select.h>
      24  #include <sys/time.h>
      25  #include <unistd.h>
      26  
      27  #include "macros.h"
      28  
      29  int
      30  main (void)
      31  {
      32    printf ("Applying select() from standard input. Press Ctrl-C to abort.\n");
      33    for (;;)
      34      {
      35        struct timeval before;
      36        struct timeval after;
      37        unsigned long spent_usec;
      38        fd_set readfds;
      39        struct timeval timeout;
      40        int ret;
      41  
      42        gettimeofday (&before, NULL);
      43  
      44        FD_ZERO (&readfds);
      45        FD_SET (0, &readfds);
      46        timeout.tv_sec = 0;
      47        timeout.tv_usec = 500000;
      48        ret = select (1, &readfds, NULL, NULL, &timeout);
      49  
      50        gettimeofday (&after, NULL);
      51        spent_usec = (after.tv_sec - before.tv_sec) * 1000000
      52                     + after.tv_usec - before.tv_usec;
      53  
      54        if (ret < 0)
      55          {
      56            perror ("select failed");
      57            exit (1);
      58          }
      59        if ((ret == 0) != ! FD_ISSET (0, &readfds))
      60          {
      61            fprintf (stderr, "incorrect return value\n");
      62            exit (1);
      63          }
      64        if (ret == 0)
      65          {
      66            if (spent_usec < 250000)
      67              {
      68                fprintf (stderr, "returned too early\n");
      69                exit (1);
      70              }
      71            /* Timeout */
      72            printf (".");
      73            ASSERT (fflush (stdout) == 0);
      74          }
      75        else
      76          {
      77            char c;
      78  
      79            printf ("Input available! Trying to read 1 byte...\n");
      80            ASSERT (read (0, &c, 1) == 1);
      81          }
      82      }
      83  }