diff options
Diffstat (limited to 'snmplib/opendir.c')
-rw-r--r-- | snmplib/opendir.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/snmplib/opendir.c b/snmplib/opendir.c new file mode 100644 index 0000000..6cb8e06 --- /dev/null +++ b/snmplib/opendir.c @@ -0,0 +1,139 @@ +/* + * 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; +} |