summaryrefslogtreecommitdiffstats
path: root/private/crt32/direct/findfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/direct/findfile.c')
-rw-r--r--private/crt32/direct/findfile.c224
1 files changed, 224 insertions, 0 deletions
diff --git a/private/crt32/direct/findfile.c b/private/crt32/direct/findfile.c
new file mode 100644
index 000000000..346c63f78
--- /dev/null
+++ b/private/crt32/direct/findfile.c
@@ -0,0 +1,224 @@
+/***
+*findfile.c - C find file functions
+*
+* Copyright (c) 1991-1993, Microsoft Corporation. All rights reserved.
+*
+*Purpose:
+* Defines findfirst(), findnext(), and findclose().
+*
+*Revision History:
+* 08-21-91 BWM Wrote Win32 versions.
+* 09-13-91 BWM Changed handle type to long.
+* 08-18-92 SKS Add a call to FileTimeToLocalFileTime
+* as a temporary fix until _dtoxtime takes UTC
+* 08-26-92 SKS creation and last access time should be same as the
+* last write time if ctime/atime are not available.
+* 01-08-93 SKS Remove change I made 8-26-92. Previous behavior
+* was deemed "by design" and preferable.
+* 03-30-93 GJF Replaced reference to _dtoxtime with __gmtotime_t. Also
+* made _timet_from_ft a static function.
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <oscalls.h>
+#include <errno.h>
+#include <io.h>
+#include <time.h>
+#include <ctime.h>
+#include <string.h>
+#include <internal.h>
+
+#if !defined(_WIN32_)
+#error ERROR - ONLY WIN32 TARGET SUPPORTED!
+#endif
+
+static time_t _CRTAPI3 _timet_from_ft(FILETIME * pft);
+
+/***
+*long findfirst(wildspec, finddata) - Find first matching file
+*
+*Purpose:
+* Finds the first file matching a given wild card filespec and
+* returns data about the file.
+*
+*Entry:
+* char * wild - file spec optionally containing wild cards
+*
+* struct _finddata_t * finddata - structure to receive file data
+*
+*Exit:
+* Good return:
+* Unique handle identifying the group of files matching the spec
+*
+* Error return:
+* Returns -1 and errno is set to error value
+*
+*Exceptions:
+* None.
+*
+*******************************************************************************/
+
+long _CRTAPI1 _findfirst(char * szWild, struct _finddata_t * pfd)
+{
+ WIN32_FIND_DATA wfd;
+ HANDLE hFile;
+ DWORD err;
+
+ if ((hFile = FindFirstFile(szWild, &wfd)) == INVALID_HANDLE_VALUE) {
+ err = GetLastError();
+ switch (err) {
+ case ERROR_NO_MORE_FILES:
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
+ errno = ENOENT;
+ break;
+
+ case ERROR_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+ return (-1);
+ }
+
+ pfd->attrib = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
+ ? 0 : wfd.dwFileAttributes;
+ pfd->time_create = _timet_from_ft(&wfd.ftCreationTime);
+ pfd->time_access = _timet_from_ft(&wfd.ftLastAccessTime);
+ pfd->time_write = _timet_from_ft(&wfd.ftLastWriteTime);
+ pfd->size = wfd.nFileSizeLow;
+ strcpy(pfd->name, wfd.cFileName);
+
+ return ((long)hFile);
+}
+
+/***
+*int _findnext(hfind, finddata) - Find next matching file
+*
+*Purpose:
+* Finds the next file matching a given wild card filespec and
+* returns data about the file.
+*
+*Entry:
+* hfind - handle from _findfirst
+*
+* struct _finddata_t * finddata - structure to receive file data
+*
+*Exit:
+* Good return:
+* 0 if file found
+* -1 if error or file not found
+* errno set
+*
+*Exceptions:
+* None.
+*
+*******************************************************************************/
+
+int _CRTAPI1 _findnext(long hFile, struct _finddata_t * pfd)
+{
+ WIN32_FIND_DATA wfd;
+ DWORD err;
+
+ if (!FindNextFile((HANDLE)hFile, &wfd)) {
+ err = GetLastError();
+ switch (err) {
+ case ERROR_NO_MORE_FILES:
+ case ERROR_FILE_NOT_FOUND:
+ case ERROR_PATH_NOT_FOUND:
+ errno = ENOENT;
+ break;
+
+ case ERROR_NOT_ENOUGH_MEMORY:
+ errno = ENOMEM;
+ break;
+
+ default:
+ errno = EINVAL;
+ break;
+ }
+ return (-1);
+ }
+
+ pfd->attrib = (wfd.dwFileAttributes == FILE_ATTRIBUTE_NORMAL)
+ ? 0 : wfd.dwFileAttributes;
+ pfd->time_create = _timet_from_ft(&wfd.ftCreationTime);
+ pfd->time_access = _timet_from_ft(&wfd.ftLastAccessTime);
+ pfd->time_write = _timet_from_ft(&wfd.ftLastWriteTime);
+ pfd->size = wfd.nFileSizeLow;
+ strcpy(pfd->name, wfd.cFileName);
+
+ return (0);
+}
+
+/***
+*int _findclose(hfind) - Release resources of find
+*
+*Purpose:
+* Releases resources of a group of files found by _findfirst and
+* _findnext
+*
+*Entry:
+* hfind - handle from _findfirst
+*
+*Exit:
+* Good return:
+* 0 if success
+* -1 if fail, errno set
+*
+*Exceptions:
+* None.
+*
+*******************************************************************************/
+
+int _CRTAPI1 _findclose(long hFile)
+{
+ if (!FindClose((HANDLE)hFile)) {
+ errno = EINVAL;
+ return (-1);
+ }
+ return (0);
+}
+
+/***
+*time_t _fttotimet(ft) - convert Win32 file time to Xenix time
+*
+*Purpose:
+* converts a Win32 file time value to Xenix time_t
+*
+*Entry:
+* int yr, mo, dy - date
+* int hr, mn, sc - time
+*
+*Exit:
+* returns Xenix time value
+*
+*Exceptions:
+*
+*******************************************************************************/
+
+static time_t _CRTAPI3 _timet_from_ft(FILETIME * pft)
+{
+ SYSTEMTIME st;
+
+ // 0 FILETIME returns a -1 time_t
+
+ if (!pft->dwLowDateTime && !pft->dwHighDateTime) {
+ return (-1L);
+ }
+
+ if (!FileTimeToSystemTime(pft, &st)) {
+ return (-1L);
+ }
+
+ return ( __gmtotime_t(st.wYear,
+ st.wMonth,
+ st.wDay,
+ st.wHour,
+ st.wMinute,
+ st.wSecond) );
+}