struct dirent *readdir(DIR *dir) { WIN32_FIND_DATA fdata; HANDLE hfind; char *tmp ; if (!dir) return NULL; if (dir->flags & IS_NET) { if(enum_next_share(dir)<0) return NULL; } // special hack for root (which does not have . or ..) else if (dir->flags & IS_ROOT) { tmp= dir->orig_dir_name; hfind = FindFirstFile(tmp,&fdata); FindClose(dir->dd_fd); dir->dd_fd = hfind; dir->dd_size = fdata.nFileSizeLow; (dir->dd_buf)->d_ino = inode++; (dir->dd_buf)->d_off = 0; (dir->dd_buf)->d_reclen = 0; memcpy((dir->dd_buf)->d_name,fdata.cFileName,MAX_PATH); dir->flags &= ~IS_ROOT; return dir->dd_buf; } if(!(dir->flags & IS_NET) && !FindNextFile(dir->dd_fd,&fdata) ){ return NULL; } (dir->dd_buf)->d_ino = inode++; (dir->dd_buf)->d_off = 0; (dir->dd_buf)->d_reclen = 0; if (! (dir->flags & IS_NET)) memcpy((dir->dd_buf)->d_name,fdata.cFileName,MAX_PATH); return dir->dd_buf; }
struct dirent *readdir(DIR *dir) { WIN32_FIND_DATA fdata; HANDLE hfind; const char *tmp; if (!dir) return NULL; memset(&fdata, 0, sizeof(fdata)); if (dir->dd_stat & IS_NET) { if (enum_next_share(dir) < 0) return NULL; } else if (dir->dd_stat & IS_ROOT) { // special hack for root (which does not have . or ..) tmp = (const char *)(dir->dd_name); hfind = FindFirstFile(tmp, &fdata); FindClose((HANDLE)(dir->dd_handle)); dir->dd_handle = (intptr_t)hfind; memcpy((dir->dd_dir).d_name, fdata.cFileName, MAX_PATH); (dir->dd_dir).d_namlen = (unsigned short)strlen((dir->dd_dir).d_name); dir->dd_stat &= ~IS_ROOT; return &dir->dd_dir; } if (!(dir->dd_stat & IS_NET)) do { if (!FindNextFile((HANDLE)(dir->dd_handle), &fdata)) return NULL; if (!(fdata.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) break; } while (1); if (!(dir->dd_stat & IS_NET)) { // @@@@ use strlcpy ... will return the len memcpy((dir->dd_dir).d_name, fdata.cFileName, MAX_PATH); (dir->dd_dir).d_namlen = (unsigned short)strlen((dir->dd_dir).d_name); } return &dir->dd_dir; }