added QSE_FIO_NOFOLLOW

This commit is contained in:
2011-10-19 22:29:28 +00:00
parent c6f78119d3
commit 5cd5041ed3
8 changed files with 341 additions and 25 deletions

View File

@ -147,6 +147,9 @@ int qse_fio_init (
if (flags & QSE_FIO_SYNC)
flag_and_attr |= FILE_FLAG_WRITE_THROUGH;
if (flags & QSE_FIO_NOFOLLOW)
flag_and_attr |= FILE_FLAG_OPEN_REPARSE_POINT;
/* these two are just hints to OS */
if (flags & QSE_FIO_RANDOM)
flag_and_attr |= FILE_FLAG_RANDOM_ACCESS;
@ -350,6 +353,10 @@ int qse_fio_init (
if (flags & QSE_FIO_EXCLUSIVE) desired_access |= O_EXCL;
if (flags & QSE_FIO_SYNC) desired_access |= O_SYNC;
#if defined(O_NOFOLLOW)
if (flags & QSE_FIO_NOFOLLOW) desired_access |= O_NOFOLLOW;
#endif
#if defined(O_LARGEFILE)
desired_access |= O_LARGEFILE;
#endif

View File

@ -31,6 +31,7 @@
# error NOT IMPLEMENTED
#else
# include <sys/types.h>
# include <sys/stat.h>
# include <dirent.h>
#endif
@ -383,6 +384,25 @@ qse_dir_ent_t* qse_dir_read (qse_dir_t* dir)
return QSE_NULL;
}
#if defined(HAVE_STRUCT_DIRENT_D_TYPE)
if (ent->d_type != DT_DIR)
#endif
{
int x;
#if defined(HAVE_LSTAT64)
struct stat64 st;
x = lstat64 (ent->d_name, &st);
#else
struct stat st;
x = lstat (ent->d_name, &st);
#endif
if (x == -1)
{
/*TODO: dir->errnum = ... */
return QSE_NULL;
}
}
if (set_entry_name (dir, ent->d_name) <= -1) return QSE_NULL;
#if defined(HAVE_STRUCT_DIRENT_D_TYPE)
@ -393,15 +413,17 @@ qse_dir_ent_t* qse_dir_read (qse_dir_t* dir)
dir->ent.type = QSE_DIR_ENT_DIRECTORY;
break;
case DT_REG:
dir->ent.type = QSE_DIR_ENT_REGULAR;
break;
default:
dir->ent.size = 0;
dir->ent.type = QSE_DIR_ENT_UNKNOWN;
break;
}
#else
/* call lstat??? */
#endif
#endif
return &dir->ent;
}