Back to index

php5  5.3.10
Classes | Defines | Functions
readdir.h File Reference
#include <config.w32.h>
#include <windows.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <direct.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  dirent
struct  DIR

Defines

#define php_readdir_r   readdir_r

Functions

DIRopendir (const char *)
struct direntreaddir (DIR *)
int readdir_r (DIR *, struct dirent *, struct dirent **)
int closedir (DIR *)
int rewinddir (DIR *)

Class Documentation

struct dirent

Definition at line 20 of file readdir.h.

Class Members
long d_ino
char d_name
off_t d_off
unsigned short d_reclen
struct DIR

Definition at line 29 of file readdir.h.

Class Members
char * dir
WIN32_FIND_DATA fileinfo
short finished
HANDLE handle
short offset

Define Documentation

#define php_readdir_r   readdir_r

Definition at line 20 of file readdir.h.


Function Documentation

int closedir ( DIR )

Definition at line 119 of file readdir.c.

{
       if (!dp)
              return 0;
       /* It is valid to scan an empty directory but we have an invalid
          handle in this case (no first file found). */
       if (dp->handle != INVALID_HANDLE_VALUE) {
              FindClose(dp->handle);
       }
       if (dp->dir)
              free(dp->dir);
       if (dp)
              free(dp);

       return 0;
}
DIR* opendir ( const char *  )

Definition at line 22 of file readdir.c.

{
       DIR *dp;
       char *filespec;
       HANDLE handle;
       int index;
       char resolved_path_buff[MAXPATHLEN];
       TSRMLS_FETCH();

       if (!VCWD_REALPATH(dir, resolved_path_buff)) {
              return NULL;
       }

       filespec = (char *)malloc(strlen(resolved_path_buff) + 2 + 1);
       if (filespec == NULL) {
              return NULL;
       }
       strcpy(filespec, resolved_path_buff);
       index = strlen(filespec) - 1;
       if (index >= 0 && (filespec[index] == '/' || 
          (filespec[index] == '\\' && (index == 0 || !IsDBCSLeadByte(filespec[index-1])))))
              filespec[index] = '\0';
       strcat(filespec, "\\*");

       dp = (DIR *) malloc(sizeof(DIR));
       if (dp == NULL) {
              return NULL;
       }
       dp->offset = 0;
       dp->finished = 0;

       if ((handle = FindFirstFile(filespec, &(dp->fileinfo))) == INVALID_HANDLE_VALUE) {
              DWORD err = GetLastError();
              if (err == ERROR_NO_MORE_FILES || err == ERROR_FILE_NOT_FOUND) {
                     dp->finished = 1;
              } else {
                     free(dp);
                     free(filespec);
                     return NULL;
              }
       }
       dp->dir = strdup(resolved_path_buff);
       dp->handle = handle;
       free(filespec);

       return dp;
}

Here is the call graph for this function:

struct dirent* readdir ( DIR ) [read]

Definition at line 70 of file readdir.c.

{
       if (!dp || dp->finished)
              return NULL;

       if (dp->offset != 0) {
              if (FindNextFile(dp->handle, &(dp->fileinfo)) == 0) {
                     dp->finished = 1;
                     return NULL;
              }
       }
       dp->offset++;

       strlcpy(dp->dent.d_name, dp->fileinfo.cFileName, _MAX_FNAME+1);
       dp->dent.d_ino = 1;
       dp->dent.d_reclen = strlen(dp->dent.d_name);
       dp->dent.d_off = dp->offset;

       return &(dp->dent);
}

Here is the call graph for this function:

int readdir_r ( DIR ,
struct dirent ,
struct dirent **   
)

Definition at line 91 of file readdir.c.

{
       if (!dp || dp->finished) {
              *result = NULL;
              return 0;
       }

       if (dp->offset != 0) {
              if (FindNextFile(dp->handle, &(dp->fileinfo)) == 0) {
                     dp->finished = 1;
                     *result = NULL;
                     return 0;
              }
       }
       dp->offset++;

       strlcpy(dp->dent.d_name, dp->fileinfo.cFileName, _MAX_FNAME+1);
       dp->dent.d_ino = 1;
       dp->dent.d_reclen = strlen(dp->dent.d_name);
       dp->dent.d_off = dp->offset;

       memcpy(entry, &dp->dent, sizeof(*entry));

       *result = &dp->dent;

       return 0;
}

Here is the call graph for this function:

int rewinddir ( DIR )

Definition at line 136 of file readdir.c.

{
       /* Re-set to the beginning */
       char *filespec;
       HANDLE handle;
       int index;

       FindClose(dp->handle);

       dp->offset = 0;
       dp->finished = 0;

       filespec = (char *)malloc(strlen(dp->dir) + 2 + 1);
       if (filespec == NULL) {
              return -1;
       }

       strcpy(filespec, dp->dir);
       index = strlen(filespec) - 1;
       if (index >= 0 && (filespec[index] == '/' || 
          (filespec[index] == '\\' && (index == 0 || !IsDBCSLeadByte(filespec[index-1])))))
              filespec[index] = '\0';
       strcat(filespec, "/*");

       if ((handle = FindFirstFile(filespec, &(dp->fileinfo))) == INVALID_HANDLE_VALUE) {
              dp->finished = 1;
       }
       
       dp->handle = handle;
       free(filespec);

       return 0;
}

Here is the call graph for this function: