(root)/
gettext-0.22.4/
gettext-tools/
gnulib-tests/
test-read-file.c
       1  /*
       2   * Copyright (C) 2006-2007, 2010-2023 Free Software Foundation, Inc.
       3   * Written by Simon Josefsson
       4   *
       5   * This program is free software: you can redistribute it and/or modify
       6   * it under the terms of the GNU General Public License as published by
       7   * the Free Software Foundation, either version 3 of the License, or
       8   * (at your option) any later version.
       9   *
      10   * This program 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
      13   * GNU General Public License for more details.
      14   *
      15   * You should have received a copy of the GNU General Public License
      16   * along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <config.h>
      19  
      20  #include "read-file.h"
      21  
      22  #include <stdio.h>
      23  #include <stdlib.h>
      24  #include <sys/stat.h>
      25  
      26  #include "macros.h"
      27  
      28  #define FILE1 "/etc/resolv.conf"
      29  #define FILE2 "/dev/null"
      30  
      31  static int
      32  test_read_file (int flags)
      33  {
      34    struct stat statbuf;
      35    int err = 0;
      36  
      37    /* We can perform the test only if the file exists and is readable.
      38       Test whether it exists, then assume it is world-readable.  */
      39    if (stat (FILE1, &statbuf) >= 0)
      40      {
      41        size_t len;
      42        char *out = read_file (FILE1, flags, &len);
      43  
      44        if (!out)
      45          {
      46            perror ("Could not read file");
      47            err = 1;
      48          }
      49        else
      50          {
      51            if (out[len] != '\0')
      52              {
      53                perror ("BAD: out[len] not zero");
      54                err = 1;
      55              }
      56  
      57            if (S_ISREG (statbuf.st_mode))
      58              {
      59                /* FILE1 is a regular file or a symlink to a regular file.  */
      60                if (len != statbuf.st_size)
      61                  {
      62                    fprintf (stderr, "Read %lu from %s...\n",
      63                             (unsigned long) len, FILE1);
      64                    err = 1;
      65                  }
      66              }
      67            else
      68              {
      69                /* Assume FILE1 is not empty.  */
      70                if (len == 0)
      71                  {
      72                    fprintf (stderr, "Read nothing from %s\n", FILE1);
      73                    err = 1;
      74                  }
      75              }
      76            free (out);
      77          }
      78      }
      79  
      80    /* We can perform the test only if the file exists and is readable.
      81       Test whether it exists, then assume it is world-readable.  */
      82    if (stat (FILE2, &statbuf) >= 0)
      83      {
      84        size_t len;
      85        char *out = read_file (FILE2, flags, &len);
      86  
      87        if (!out)
      88          {
      89            perror ("Could not read file");
      90            err = 1;
      91          }
      92        else
      93          {
      94            if (out[len] != '\0')
      95              {
      96                perror ("BAD: out[len] not zero");
      97                err = 1;
      98              }
      99  
     100            /* /dev/null should always be empty.  Ignore statbuf.st_size, since it
     101               is not a regular file.  */
     102            if (len != 0)
     103              {
     104                fprintf (stderr, "Read %lu from %s...\n",
     105                         (unsigned long) len, FILE2);
     106                err = 1;
     107              }
     108            free (out);
     109          }
     110      }
     111  
     112    return err;
     113  }
     114  
     115  int
     116  main (void)
     117  {
     118    ASSERT (!test_read_file (0));
     119    ASSERT (!test_read_file (RF_BINARY));
     120    ASSERT (!test_read_file (RF_SENSITIVE));
     121    ASSERT (!test_read_file (RF_BINARY | RF_SENSITIVE));
     122  
     123    return 0;
     124  }