From 36ccb620ec90661974de944299ca4d4b975bafee Mon Sep 17 00:00:00 2001 From: Keith Marshall Date: Sat, 27 Aug 2011 20:16:47 +0000 Subject: [PATCH] Don't expose implementation detail for opaque DIRENT structures. --- winsup/mingw/ChangeLog | 9 ++++++ winsup/mingw/include/dirent.h | 59 ++++------------------------------- winsup/mingw/mingwex/dirent.c | 54 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 53 deletions(-) diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog index 711906db1..d8a9d4e1a 100644 --- a/winsup/mingw/ChangeLog +++ b/winsup/mingw/ChangeLog @@ -1,3 +1,12 @@ +2011-08-27 Keith Marshall + + Don't expose implementation detail for opaque DIRENT structures. + + * include/dirent.h (DIR, _WDIR): Declare as opaque data types. + (__dirstream_t, __wdirstream_t): Add these tags for their underlying + structures, respectively; move their detailed declarations to... + * mingwex/dirent.c: ...here. + 2011-08-23 Chris Sutcliffe * include/_mingw.h: Increment version to 3.20. diff --git a/winsup/mingw/include/dirent.h b/winsup/mingw/include/dirent.h index 44fb1c0a8..7d2af2b19 100644 --- a/winsup/mingw/include/dirent.h +++ b/winsup/mingw/include/dirent.h @@ -28,34 +28,10 @@ struct dirent }; /* - * This is an internal data structure. Good programmers will not use it - * except as an argument to one of the functions below. - * dd_stat field is now int (was short in older versions). + * This opaque data type represents the private structure + * through which a directory stream is referenced. */ -typedef struct -{ - /* disk transfer area for this dir */ - struct _finddata_t dd_dta; - - /* dirent struct to return from dir (NOTE: this makes this thread - * safe as long as only one thread uses a particular DIR struct at - * a time) */ - struct dirent dd_dir; - - /* _findnext handle */ - intptr_t dd_handle; - - /* - * Status of search: - * 0 = not started yet (next entry to read is first entry) - * -1 = off the end - * positive = 0 based index of next entry - */ - int dd_stat; - - /* given path for dir with search pattern (struct is extended) */ - char dd_name[1]; -} DIR; +typedef struct __dirstream_t DIR; DIR* __cdecl __MINGW_NOTHROW opendir (const char*); struct dirent* __cdecl __MINGW_NOTHROW readdir (DIR*); @@ -76,33 +52,10 @@ struct _wdirent }; /* - * This is an internal data structure. Good programmers will not use it - * except as an argument to one of the functions below. + * This opaque data type represents the private structure + * through which a wide directory stream is referenced. */ -typedef struct -{ - /* disk transfer area for this dir */ - struct _wfinddata_t dd_dta; - - /* dirent struct to return from dir (NOTE: this makes this thread - * safe as long as only one thread uses a particular DIR struct at - * a time) */ - struct _wdirent dd_dir; - - /* _findnext handle */ - intptr_t dd_handle; - - /* - * Status of search: - * 0 = not started yet (next entry to read is first entry) - * -1 = off the end - * positive = 0 based index of next entry - */ - int dd_stat; - - /* given path for dir with search pattern (struct is extended) */ - wchar_t dd_name[1]; -} _WDIR; +typedef struct __wdirstream_t _WDIR; _WDIR* __cdecl __MINGW_NOTHROW _wopendir (const wchar_t*); struct _wdirent* __cdecl __MINGW_NOTHROW _wreaddir (_WDIR*); diff --git a/winsup/mingw/mingwex/dirent.c b/winsup/mingw/mingwex/dirent.c index 399a8d1b3..0d3e54a09 100644 --- a/winsup/mingw/mingwex/dirent.c +++ b/winsup/mingw/mingwex/dirent.c @@ -28,6 +28,60 @@ #define SUFFIX _T("*") #define SLASH _T("\\") +struct __dirstream_t +{ + /* Actual (private) declaration for opaque data type "DIR". */ + + /* disk transfer area for this dir */ + struct _finddata_t dd_dta; + + /* dirent struct to return from dir (NOTE: this makes this thread + * safe as long as only one thread uses a particular DIR struct at + * a time) */ + struct dirent dd_dir; + + /* _findnext handle */ + intptr_t dd_handle; + + /* + * Status of search: + * (type is now int -- was short in older versions). + * 0 = not started yet (next entry to read is first entry) + * -1 = off the end + * positive = 0 based index of next entry + */ + int dd_stat; + + /* given path for dir with search pattern (struct is extended) */ + char dd_name[1]; +}; + +struct __wdirstream_t +{ + /* Actual (private) declaration for opaque data type "_WDIR". */ + + /* disk transfer area for this dir */ + struct _wfinddata_t dd_dta; + + /* dirent struct to return from dir (NOTE: this makes this thread + * safe as long as only one thread uses a particular DIR struct at + * a time) */ + struct _wdirent dd_dir; + + /* _findnext handle */ + intptr_t dd_handle; + + /* + * Status of search: + * 0 = not started yet (next entry to read is first entry) + * -1 = off the end + * positive = 0 based index of next entry + */ + int dd_stat; + + /* given path for dir with search pattern (struct is extended) */ + wchar_t dd_name[1]; +}; /* Helper for opendir(). */ static inline unsigned _tGetFileAttributes (const _TCHAR * tPath)