(root)/
tar-1.35/
gnu/
closedir.c
       1  /* Stop reading the entries of a directory.
       2     Copyright (C) 2006-2023 Free Software Foundation, Inc.
       3  
       4     This file is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU Lesser General Public License as
       6     published by the Free Software Foundation; either version 2.1 of the
       7     License, or (at your option) any later version.
       8  
       9     This file 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 Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  #include <config.h>
      18  
      19  /* Specification.  */
      20  #include <dirent.h>
      21  
      22  #if REPLACE_FCHDIR
      23  # include <unistd.h>
      24  #endif
      25  
      26  #include <stdlib.h>
      27  
      28  #if HAVE_CLOSEDIR
      29  
      30  /* Override closedir(), to keep track of the open file descriptors.
      31     Needed because there is a function dirfd().  */
      32  
      33  #endif
      34  
      35  #if GNULIB_defined_DIR
      36  # include "dirent-private.h"
      37  #endif
      38  
      39  int
      40  closedir (DIR *dirp)
      41  #undef closedir
      42  {
      43  #if GNULIB_defined_DIR || REPLACE_FCHDIR || defined __KLIBC__
      44    int fd = dirfd (dirp);
      45  #endif
      46    int retval;
      47  
      48  #if HAVE_DIRENT_H                       /* equivalent to HAVE_CLOSEDIR */
      49  
      50  # if GNULIB_defined_DIR
      51    retval = closedir (dirp->real_dirp);
      52    if (retval >= 0)
      53      free (dirp);
      54  # else
      55    retval = closedir (dirp);
      56  # endif
      57  
      58  # ifdef __KLIBC__
      59    if (!retval)
      60      _gl_unregister_dirp_fd (fd);
      61  # endif
      62  #else
      63  
      64    if (dirp->current != INVALID_HANDLE_VALUE)
      65      FindClose (dirp->current);
      66    free (dirp);
      67  
      68    retval = 0;
      69  
      70  #endif
      71  
      72  #if GNULIB_defined_DIR
      73    if (retval >= 0)
      74      close (fd);
      75  #elif REPLACE_FCHDIR
      76    if (retval >= 0)
      77      _gl_unregister_fd (fd);
      78  #endif
      79  
      80    return retval;
      81  }