(root)/
tar-1.35/
gnu/
rewinddir.c
       1  /* Restart reading the entries of a directory from the beginning.
       2     Copyright (C) 2011-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 3 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  #include <errno.h>
      23  
      24  #if GNULIB_defined_DIR
      25  # include "dirent-private.h"
      26  #endif
      27  
      28  /* Don't assume that UNICODE is not defined.  */
      29  #undef FindFirstFile
      30  #define FindFirstFile FindFirstFileA
      31  
      32  void
      33  rewinddir (DIR *dirp)
      34  #undef rewinddir
      35  {
      36  #if HAVE_DIRENT_H                       /* equivalent to HAVE_REWINDDIR */
      37    rewinddir (dirp->real_dirp);
      38  #else
      39    /* Like in closedir().  */
      40    if (dirp->current != INVALID_HANDLE_VALUE)
      41      FindClose (dirp->current);
      42  
      43    /* Like in opendir().  */
      44    dirp->status = -1;
      45    dirp->current = FindFirstFile (dirp->dir_name_mask, &dirp->entry);
      46    if (dirp->current == INVALID_HANDLE_VALUE)
      47      {
      48        switch (GetLastError ())
      49          {
      50          case ERROR_FILE_NOT_FOUND:
      51            dirp->status = -2;
      52            break;
      53          default:
      54            /* Save the error code for the next readdir() call.  */
      55            dirp->status = ENOENT;
      56            break;
      57          }
      58      }
      59  #endif
      60  }