Edit

kc3-lang/gnulib/tests/test-fopen.h

Branch :

  • Show log

    Commit

  • Author : Bruno Haible
    Date : 2024-08-27 00:19:14
    Hash : e9508205
    Message : Fix some of the warnings from a clang that masquerades as gcc 13. * lib/c-stack.c: Use _GL_GNUC_PREREQ to test for the gcc version. * lib/canonicalize.c: Likewise. * lib/diffseq.h: Likewise. * lib/file-has-acl.c: Likewise. * lib/freopen-safer.c: Likewise. * lib/getndelim2.c: Likewise. * lib/mini-gmp-gnulib.c: Likewise. * lib/propername.c: Likewise. * lib/quotearg.c: Likewise. * lib/savedir.c: Likewise. * lib/vasnprintf.c: Likewise. * tests/test-argmatch.c: Likewise. * tests/test-dup2.c: Likewise. * tests/test-explicit_bzero.c: Likewise. * tests/test-fcntl.c: Likewise. * tests/test-fopen.h: Likewise. * tests/test-getdtablesize.c: Likewise. * tests/test-getgroups.c: Likewise. * tests/test-listen.c: Likewise. * tests/test-localename.c: Likewise. * tests/test-memset_explicit.c: Likewise. * tests/test-open.h: Likewise. * tests/test-perror2.c: Likewise. * tests/test-select.h: Likewise. * lib/stdio.in.h (_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD): Don't use gnu_printf with clang. * lib/string-buffer.h: Likewise. * lib/textstyle.in.h: Likewise.

  • tests/test-fopen.h
  • /* Test of opening a file stream.
       Copyright (C) 2007-2024 Free Software Foundation, Inc.
    
       This program is free software: you can redistribute it and/or modify
       it under the terms of the GNU General Public License as published by
       the Free Software Foundation, either version 3 of the License, or
       (at your option) any later version.
    
       This program is distributed in the hope that it will be useful,
       but WITHOUT ANY WARRANTY; without even the implied warranty of
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       GNU General Public License for more details.
    
       You should have received a copy of the GNU General Public License
       along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
    
    /* Written by Bruno Haible <bruno@clisp.org>, 2007.  */
    
    /* Include <config.h> and a form of <stdio.h> first.  */
    
    #include <errno.h>
    #include <unistd.h>
    
    #include "macros.h"
    
    /* Tell GCC not to warn about the specific edge cases tested here.  */
    #if _GL_GNUC_PREREQ (10, 0)
    # pragma GCC diagnostic ignored "-Wanalyzer-file-leak"
    #endif
    
    /* Test fopen.  Assumes BASE is defined.  */
    
    static int
    test_fopen (void)
    {
      FILE *f;
      /* Remove anything from prior partial run.  */
      unlink (BASE "file");
    
      /* Read requires existing file.  */
      errno = 0;
      ASSERT (fopen (BASE "file", "r") == NULL);
      ASSERT (errno == ENOENT);
    
      /* Write can create a file.  */
      f = fopen (BASE "file", "w");
      ASSERT (f);
      ASSERT (fclose (f) == 0);
    
      /* Trailing slash is invalid on non-directory.  */
      errno = 0;
      ASSERT (fopen (BASE "file/", "r") == NULL);
      ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
    
      errno = 0;
      ASSERT (fopen (BASE "file/", "r+") == NULL);
      ASSERT (errno == ENOTDIR || errno == EISDIR || errno == EINVAL);
    
      /* Cannot create a directory.  */
      errno = 0;
      ASSERT (fopen ("nonexist.ent/", "w") == NULL);
      ASSERT (errno == ENOTDIR || errno == EISDIR || errno == ENOENT
              || errno == EINVAL);
    
      /* Directories cannot be opened for writing.  */
      errno = 0;
      ASSERT (fopen (".", "w") == NULL);
      ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
    
      errno = 0;
      ASSERT (fopen ("./", "w") == NULL);
      ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
    
      errno = 0;
      ASSERT (fopen (".", "r+") == NULL);
      ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
    
      errno = 0;
      ASSERT (fopen ("./", "r+") == NULL);
      ASSERT (errno == EISDIR || errno == EINVAL || errno == EACCES);
    
      /* /dev/null must exist, and be writable.  */
      f = fopen ("/dev/null", "r");
      ASSERT (f);
      ASSERT (fclose (f) == 0);
      f = fopen ("/dev/null", "w");
      ASSERT (f);
      ASSERT (fclose (f) == 0);
    
      /* Cleanup.  */
      ASSERT (unlink (BASE "file") == 0);
    
      return 0;
    }