Back to index

php5  5.3.10
Functions
readdir.c File Reference
#include <malloc.h>
#include <string.h>
#include <errno.h>
#include "php.h"
#include "readdir.h"
#include "TSRM.h"

Go to the source code of this file.

Functions

DIRopendir (const char *dir)
struct direntreaddir (DIR *dp)
int readdir_r (DIR *dp, struct dirent *entry, struct dirent **result)
int closedir (DIR *dp)
int rewinddir (DIR *dp)

Function Documentation

int closedir ( DIR dp)

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;
}

Here is the caller graph for this function:

DIR* opendir ( const char *  dir)

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:

Here is the caller graph for this function:

struct dirent* readdir ( DIR dp) [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:

Here is the caller graph for this function:

int readdir_r ( DIR dp,
struct dirent entry,
struct dirent **  result 
)

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:

Here is the caller graph for this function:

int rewinddir ( DIR dp)

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:

Here is the caller graph for this function: