示例#1
0
文件: dirent.c 项目: cftyngit/nctuns
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;

}
示例#2
0
文件: dirent.c 项目: oldfaber/wzsh
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;
}