// module dir_testu.cpp
// Oeffnet ein Linux-Verzeichnis, liest die Eintraege aus
// Copyright Dr.E.Huckert 1-2014

// Wichtig: nicht getdirentries() verwenden - funktioniert nicht
// Liefert auch die Eintrage "." und ".." !

#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <dirent.h>

using namespace  std;

// --------------------------------------------------------------------
// Wird ggf. rekursiv aufgerufen
void traverseDirectory(const char *dirName)
{
  DIR *pDir;
  struct dirent *pEntry;
  string dName = "";
  //
  // Das uebergebene Verzeichnis oeffnen
  pDir = ::opendir(dirName);
  if (pDir == NULL)
  {
    cout << "Fehler: Verzeichnis nicht geoeffnet: " << dirName << endl;
    return;
  }
  //
  while (1)
  {
    pEntry = ::readdir(pDir);
    if (pEntry == NULL)
      break; 
    if (pEntry->d_name[0] == '.')
      // Eintraege "." und ".." ignorieren
      continue;
    dName = dirName;
    dName = dName + "/";
    dName = dName + pEntry->d_name;
    cout << "Verz. Eintrag=" << dName << " type=" << (int)(pEntry->d_type) << endl;
    if (pEntry->d_type == DT_DIR)
    {
      cout << "      ist Verzeichnis!" << endl;
      traverseDirectory(dName.c_str());
    }
   }   // end while (1)
  //
  //::close(fd);
  ::closedir(pDir);
}   // end  traverseDirectory()

// ----------------------------------------------------
int main(int argc, char *argv[])
{
  int n;
  if (argc < 2)
  {
    cout << "usage: dir_testw directory" << endl;
    ::exit(0);
  }
  traverseDirectory(argv[1]);
  //
  return 0;
}   // end  main()
