From 5f529d5a90a9dcb5f30304d2279626e52028e3c8 Mon Sep 17 00:00:00 2001 From: jean Date: Thu, 1 Feb 2001 16:51:03 +0000 Subject: [PATCH] *** empty log message *** svn path=/trunk/; revision=1592 --- reactos/lib/crtdll/stdio/fopen.c | 2 +- reactos/lib/crtdll/stdio/ftell.c | 7 ++++++ reactos/lib/crtdll/sys_stat/fstat.c | 14 ++++++++++- reactos/lib/crtdll/sys_stat/stat.c | 38 +++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/reactos/lib/crtdll/stdio/fopen.c b/reactos/lib/crtdll/stdio/fopen.c index ee416820693..9335cf21f85 100644 --- a/reactos/lib/crtdll/stdio/fopen.c +++ b/reactos/lib/crtdll/stdio/fopen.c @@ -53,7 +53,7 @@ FILE* fopen(const char *file, const char *mode) else oflags |= (_fmode & (O_TEXT|O_BINARY)); - fd = _open(file, oflags, 0); + fd = _open(file, oflags, 0666); if (fd < 0) return NULL; diff --git a/reactos/lib/crtdll/stdio/ftell.c b/reactos/lib/crtdll/stdio/ftell.c index c93e2a631da..deb4bbd982a 100644 --- a/reactos/lib/crtdll/stdio/ftell.c +++ b/reactos/lib/crtdll/stdio/ftell.c @@ -6,6 +6,7 @@ #include #include #include +#include long @@ -14,6 +15,12 @@ ftell(FILE *f) long tres; int adjust=0; + if (!f) + { + __set_errno(EBADF); + return -1; + } + if (f->_cnt < 0) f->_cnt = 0; diff --git a/reactos/lib/crtdll/sys_stat/fstat.c b/reactos/lib/crtdll/sys_stat/fstat.c index 458e31bb260..96a1e6ce3eb 100644 --- a/reactos/lib/crtdll/sys_stat/fstat.c +++ b/reactos/lib/crtdll/sys_stat/fstat.c @@ -35,8 +35,20 @@ _fstat(int fd, struct stat *statbuf) statbuf->st_ctime = FileTimeToUnixTime( &FileInformation.ftCreationTime,NULL); statbuf->st_atime = FileTimeToUnixTime( &FileInformation.ftLastAccessTime,NULL); statbuf->st_mtime = FileTimeToUnixTime( &FileInformation.ftLastWriteTime,NULL); + if (statbuf->st_atime ==0) + statbuf->st_atime = statbuf->st_mtime; + if (statbuf->st_ctime ==0) + statbuf->st_ctime = statbuf->st_mtime; - statbuf->st_dev = fd; + statbuf->st_dev = FileInformation.dwVolumeSerialNumber; statbuf->st_size = FileInformation.nFileSizeLow; + statbuf->st_nlink = FileInformation.nNumberOfLinks; + statbuf->st_mode = S_IREAD; + if (FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + statbuf->st_mode |= S_IFDIR | S_IEXEC; + else + statbuf->st_mode |= S_IFREG; + if ( !(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + statbuf->st_mode |= S_IWRITE; return 0; } diff --git a/reactos/lib/crtdll/sys_stat/stat.c b/reactos/lib/crtdll/sys_stat/stat.c index bb78ae90029..3a3e72d1283 100644 --- a/reactos/lib/crtdll/sys_stat/stat.c +++ b/reactos/lib/crtdll/sys_stat/stat.c @@ -1,11 +1,23 @@ +#include #include #include #include #include +#include int _stat( const char *path, struct stat *buffer ) { + WIN32_FIND_DATA wfd; + HANDLE fh; + fh = FindFirstFile (path,&wfd); + if ( fh == -1 ) + { + __set_errno(ENOFILE); + return -1; + } + if ( ! (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + { int fd = _open(path,_O_RDONLY); int ret; @@ -13,5 +25,31 @@ int _stat( const char *path, struct stat *buffer ) _close(fd); return ret; + } + buffer->st_ctime = FileTimeToUnixTime( &wfd.ftCreationTime,NULL); + buffer->st_atime = FileTimeToUnixTime( &wfd.ftLastAccessTime,NULL); + buffer->st_mtime = FileTimeToUnixTime( &wfd.ftLastWriteTime,NULL); + if (buffer->st_atime ==0) + buffer->st_atime = buffer->st_mtime; + if (buffer->st_ctime ==0) + buffer->st_ctime = buffer->st_mtime; + + buffer->st_mode = S_IREAD; + if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + buffer->st_mode |= S_IFDIR; + else + buffer->st_mode |= S_IFREG; + if ( ! (wfd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)) + buffer->st_mode |= S_IWRITE | S_IEXEC; + + buffer->st_size = wfd.nFileSizeLow; + buffer->st_nlink = 1; + if (FindNextFile(fh,&wfd)) + { + __set_errno(ENOFILE); + FindClose(fh); + return -1; + } + return 0; }