blob: b8e0e3e508ce05d3084f5999822a8cc389b341d3 [file] [log] [blame]
/*
* Copyright 2004,2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <malloc.h>
#include <string.h>
#include <errno.h>
#include "axis2_dir_windows.h"
/*dirent.h style mehtods for win32*/
DIR * AXIS2_CALL opendir(const char *_dirname)
{
DIR *dirp;
char *filespec;
long handle;
int index;
filespec = malloc(strlen(_dirname) + 2 + 1);
strcpy(filespec, _dirname);
index = (int)strlen(filespec) - 1;
if (index >= 0 && (filespec[index] == '/' ||
(filespec[index] == '\\' && !IsDBCSLeadByte(filespec[index-1]))))
filespec[index] = '\0';
strcat(filespec, "/*");
dirp = (DIR *) malloc(sizeof(DIR));
dirp->offset = 0;
dirp->finished = 0;
if ((handle = _findfirst(filespec, &(dirp->fileinfo))) < 0)
{
if (errno == ENOENT || errno == EINVAL)
dirp->finished = 1;
else
{
free(dirp);
free(filespec);
return NULL;
}
}
dirp->dirname = strdup(_dirname);
dirp->handle = handle;
free(filespec);
return dirp;
}
int AXIS2_CALL closedir(DIR *_dirp)
{
int iret = -1;
if (!_dirp)
return iret;
iret = _findclose(_dirp->handle);
if (iret == 0 && _dirp->dirname)
free(_dirp->dirname);
if (iret == 0 && _dirp)
free(_dirp);
return iret;
}
struct dirent * AXIS2_CALL readdir(DIR *_dirp)
{
if (!_dirp || _dirp->finished)
return NULL;
if (_dirp->offset != 0)
{
if (_findnext(_dirp->handle, &(_dirp->fileinfo)) < 0)
{
_dirp->finished = 1;
return NULL;
}
}
_dirp->offset++;
strcpy(_dirp->dent.d_name, _dirp->fileinfo.name);/*, _MAX_FNAME+1);*/
_dirp->dent.d_ino = 1;
_dirp->dent.d_reclen = (unsigned short)strlen(_dirp->dent.d_name);
_dirp->dent.d_off = _dirp->offset;
return &(_dirp->dent);
}
int AXIS2_CALL readdir_r(DIR *_dirp, struct dirent *_entry, struct dirent **__result)
{
if (!_dirp || _dirp->finished)
{
*__result = NULL;
return -1;
}
if (_dirp->offset != 0)
{
if (_findnext(_dirp->handle, &(_dirp->fileinfo)) < 0)
{
_dirp->finished = 1;
*__result = NULL;
return -1;
}
}
_dirp->offset++;
strcpy(_dirp->dent.d_name, _dirp->fileinfo.name);/*, _MAX_FNAME+1);*/
_dirp->dent.d_ino = 1;
_dirp->dent.d_reclen = (unsigned short)strlen(_dirp->dent.d_name);
_dirp->dent.d_off = _dirp->offset;
memcpy(_entry, &_dirp->dent, sizeof(*_entry));
*__result = &_dirp->dent;
return 0;
}
int AXIS2_CALL rewinddir(DIR *dirp)
{
char *filespec;
long handle;
int index;
_findclose(dirp->handle);
dirp->offset = 0;
dirp->finished = 0;
filespec = malloc(strlen(dirp->dirname) + 2 + 1);
strcpy(filespec, dirp->dirname);
index = (int)(strlen(filespec) - 1);
if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\'))
filespec[index] = '\0';
strcat(filespec, "/*");
if ((handle = _findfirst(filespec, &(dirp->fileinfo))) < 0)
{
if (errno == ENOENT || errno == EINVAL)
dirp->finished = 1;
}
dirp->handle = handle;
free(filespec);
return 0;
}
AXIS2_DECLARE_DATA int alphasort(const struct dirent **__d1, const struct dirent **__d2)
{
return strcoll((*__d1)->d_name,(*__d2)->d_name);
}
int AXIS2_CALL scandir(const char *_dirname, struct dirent **__namelist[], int (*selector) (const struct dirent *entry), int (*compare) (const struct dirent **__d1, const struct dirent **__d2))
{
DIR *dirp = NULL;
struct dirent **vector = NULL;
struct dirent *dp = NULL;
int vector_size = 0;
int nfiles = 0;
if (__namelist == NULL)
{
return -1;
}
if (!(dirp = opendir(_dirname)))
{
return -1;
}
while ((dp = readdir(dirp)) != NULL)
{
int dsize = 0;
struct dirent *newdp = NULL;
if (selector && (*selector)(dp) == 0)
{
continue;
}
if (nfiles == vector_size)
{
struct dirent **newv;
if (vector_size == 0)
{
vector_size = 10;
}
else
{
vector_size *= 2;
}
newv = (struct dirent **) realloc (vector, vector_size * sizeof (struct dirent *));
if (!newv) {
return -1;
}
vector = newv;
}
dsize = (int)sizeof (struct dirent) + (int)((strlen(dp->d_name) + 1) * sizeof(char));
newdp = (struct dirent *) malloc(dsize);
if (newdp == NULL)
{
while (nfiles-- > 0)
{
free(vector[nfiles]);
}
free(vector);
return -1;
}
vector[nfiles++] = (struct dirent *) memcpy(newdp, dp, dsize);
}
closedir(dirp);
*__namelist = vector;
if (compare)
{
qsort (*__namelist, nfiles, sizeof(struct dirent *), compare);
}
return nfiles;
}