/******************************************************************************/
/* */
/* X r d S y s D i r . h h */
/* */
/* (c) 2006 G. Ganis (CERN) */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/* All Rights Reserved. See XrdInfo.cc for complete License Terms */
/******************************************************************************/
//////////////////////////////////////////////////////////////////////////
// //
// XrdSysDir //
// //
// Author: G. Ganis, CERN, 2006 //
// //
// API for handling directories //
// //
//////////////////////////////////////////////////////////////////////////
#include "XrdSys/XrdSysDir.hh"
#if !defined(WINDOWS)
#include
#else
#include
#endif
#include
#include
//______________________________________________________________________________
XrdSysDir::XrdSysDir(const char *path)
{
// Constructor. Initialize a directory handle for 'path'.
// Use isValid() to check the result of this operation, and lastError()
// to get the last error code, if any.
lasterr = 0; dhandle = 0;
if (path && strlen(path) > 0) {
#if !defined(WINDOWS)
dhandle = (void *) opendir(path);
if (!dhandle)
lasterr = errno;
#else
WIN32_FIND_DATA filedata;
dhandle = (void *) ::FindFirstFile(path, &filedata);
if ((HANDLE)dhandle == INVALID_HANDLE_VALUE) {
lasterr = EINVAL;
dhandle = 0;
}
else if (!(filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
lasterr = ENOTDIR;
dhandle = 0;
}
#endif
} else
// Invalid argument
lasterr = EINVAL;
}
//______________________________________________________________________________
XrdSysDir::~XrdSysDir()
{
// Destructor.
if (dhandle) {
#if !defined(WINDOWS)
closedir((DIR *)dhandle);
#else
::FindClose((HANDLE)dhandle);
#endif
}
}
//______________________________________________________________________________
char *XrdSysDir::nextEntry()
{
// Get next entry in directory structure.
// Return 0 if no more entries or error. In the latter case
// the error code can be retrieved via lastError().
char *dent = 0;
lasterr = 0;
if (!dhandle) {
lasterr = EINVAL;
return dent;
}
#if !defined(WINDOWS)
struct dirent *ent = readdir((DIR *)dhandle);
if (!ent) {
if (errno == EBADF)
lasterr = errno;
} else {
dent = (char *) ent->d_name;
}
#else
WIN32_FIND_DATA filedata;
if (::FindNextFile((HANDLE)dhandle, &filedata)) {
dent = (char *) filedata.cFileName;
} else {
if (::GetLastError() != ERROR_NO_MORE_FILES)
lasterr = EBADF;
}
#endif
// Done
return dent;
}