140 lines
3.3 KiB
C
140 lines
3.3 KiB
C
/*
|
|
* opendir() replacement for MSVC.
|
|
*/
|
|
|
|
#define WIN32IO_IS_STDIO
|
|
#define PATHLEN 1024
|
|
|
|
#include <net-snmp/net-snmp-config.h>
|
|
#include <net-snmp/types.h>
|
|
#include <net-snmp/library/system.h>
|
|
#ifdef HAVE_SYS_STAT_H
|
|
#include <sys/stat.h>
|
|
#endif
|
|
#include <tchar.h>
|
|
#include <windows.h>
|
|
|
|
|
|
/*
|
|
* The idea here is to read all the directory names into a string table
|
|
* * (separated by nulls) and when one of the other dir functions is called
|
|
* * return the pointer to the current file name.
|
|
*/
|
|
DIR *
|
|
opendir(const char *filename)
|
|
{
|
|
DIR *p;
|
|
long len;
|
|
long idx;
|
|
char scannamespc[PATHLEN];
|
|
char *scanname = scannamespc;
|
|
struct stat sbuf;
|
|
WIN32_FIND_DATA FindData;
|
|
HANDLE fh;
|
|
|
|
/*
|
|
* check to see if filename is a directory
|
|
*/
|
|
if ((stat(filename, &sbuf) < 0) || ((sbuf.st_mode & S_IFDIR) == 0)) {
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* get the file system characteristics
|
|
*/
|
|
/*
|
|
* if(GetFullPathName(filename, SNMP_MAXPATH, root, &dummy)) {
|
|
* * if(dummy = strchr(root, '\\'))
|
|
* * *++dummy = '\0';
|
|
* * if(GetVolumeInformation(root, volname, SNMP_MAXPATH, &serial,
|
|
* * &maxname, &flags, 0, 0)) {
|
|
* * downcase = !(flags & FS_CASE_IS_PRESERVED);
|
|
* * }
|
|
* * }
|
|
* * else {
|
|
* * downcase = TRUE;
|
|
* * }
|
|
*/
|
|
|
|
/*
|
|
* Create the search pattern
|
|
*/
|
|
strcpy(scanname, filename);
|
|
|
|
if (strchr("/\\", *(scanname + strlen(scanname) - 1)) == NULL)
|
|
strcat(scanname, "/*");
|
|
else
|
|
strcat(scanname, "*");
|
|
|
|
/*
|
|
* do the FindFirstFile call
|
|
*/
|
|
fh = FindFirstFile(scanname, &FindData);
|
|
if (fh == INVALID_HANDLE_VALUE) {
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* Get us a DIR structure
|
|
*/
|
|
p = (DIR *) malloc(sizeof(DIR));
|
|
/*
|
|
* Newz(1303, p, 1, DIR);
|
|
*/
|
|
if (p == NULL)
|
|
return NULL;
|
|
|
|
/*
|
|
* now allocate the first part of the string table for
|
|
* * the filenames that we find.
|
|
*/
|
|
idx = strlen(FindData.cFileName) + 1;
|
|
p->start = (char *) malloc(idx);
|
|
/*
|
|
* New(1304, p->start, idx, char);
|
|
*/
|
|
if (p->start == NULL) {
|
|
free(p);
|
|
return NULL;
|
|
}
|
|
strcpy(p->start, FindData.cFileName);
|
|
/*
|
|
* if(downcase)
|
|
* * strlwr(p->start);
|
|
*/
|
|
p->nfiles = 0;
|
|
|
|
/*
|
|
* loop finding all the files that match the wildcard
|
|
* * (which should be all of them in this directory!).
|
|
* * the variable idx should point one past the null terminator
|
|
* * of the previous string found.
|
|
*/
|
|
while (FindNextFile(fh, &FindData)) {
|
|
len = strlen(FindData.cFileName);
|
|
/*
|
|
* bump the string table size by enough for the
|
|
* * new name and it's null terminator
|
|
*/
|
|
p->start = (char *) realloc((void *) p->start, idx + len + 1);
|
|
/*
|
|
* Renew(p->start, idx+len+1, char);
|
|
*/
|
|
if (p->start == NULL) {
|
|
free(p);
|
|
return NULL;
|
|
}
|
|
strcpy(&p->start[idx], FindData.cFileName);
|
|
/*
|
|
* if (downcase)
|
|
* * strlwr(&p->start[idx]);
|
|
*/
|
|
p->nfiles++;
|
|
idx += len + 1;
|
|
}
|
|
FindClose(fh);
|
|
p->size = idx;
|
|
p->curr = p->start;
|
|
return p;
|
|
}
|