// First microsoft compilers #include <windows.h> #include <io.h> #include <ctype.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h> #include <libtarint/filesystem.h> kwDirectory * kwOpenDir(const char* name) { // struct _KWDIR ssss; char* buf; size_t n = strlen(name); kwDirectory * dir = (kwDirectory *)malloc(sizeof (kwDirectory)); if(dir==NULL) { return NULL; } dir->EOD=0; //not the end of directory if ( name[n - 1] == '/' ) { buf = (char*) malloc(n + 1 + 1); // buf = new char[n + 1 + 1]; sprintf(buf, "%s*", name); } else { buf = (char*)malloc(n + 2 + 1); // buf = new char[n + 2 + 1]; sprintf(buf, "%s/*", name); } // Now put them into the file array dir->SrchHandle = _findfirst(buf, &dir->Entry); free(buf); if ( dir->SrchHandle == -1 ) { free(dir); return NULL; } return dir; } kwDirEntry * kwReadDir(kwDirectory * dir) { static kwDirEntry entry; if(!dir || dir->EOD ==1) { return NULL; } strncpy(entry.d_name,dir->Entry.name,TAR_MAXPATHLEN-1); if(_findnext(dir->SrchHandle, &dir->Entry) == -1) { dir->EOD=1; } // It is both stupid and dangerous to return a pointer to a static like this. // This can only be called by one caller at a time: i.e., it's not thread safe. // On the other hand, it mimics the documented behavior of "readdir" which is // what it's implemented to replace for platforms that do not have readdir. // Memory leaks are also stupid and dangerous... perhaps this is less so. // return &entry; } int kwCloseDir(kwDirectory * dir) { int r=-1; if(dir) { r=_findclose(dir->SrchHandle); free(dir); } if(r==-1) return 0; return 1; }