Blame snmplib/opendir.c

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