@@ -96,22 +96,28 @@ else version( OSX )
9696 DT_WHT = 14
9797 }
9898
99- align (4 )
99+ // _DARWIN_FEATURE_64_BIT_INODE dirent is default for Mac OSX >10.5 and is
100+ // only meaningful type for other OS X/Darwin variants (e.g. iOS).
101+ // man dir(5) has some info, man stat(2) gives details.
100102 struct dirent
101103 {
102104 ino_t d_ino;
105+ alias d_fileno = d_ino;
106+ ulong d_seekoff;
103107 ushort d_reclen;
108+ ushort d_namlen;
104109 ubyte d_type;
105- ubyte d_namlen;
106- char [256 ] d_name;
110+ char [1024 ] d_name;
107111 }
108112
109113 struct DIR
110114 {
111115 // Managed by OS
112116 }
113117
114- dirent* readdir (DIR * );
118+ // OS X maintains backwards compatibility with older binaries using 32-bit
119+ // inode functions by appending $INODE64 to newer 64-bit inode functions.
120+ pragma (mangle, " readdir$INODE64" ) dirent* readdir(DIR * );
115121}
116122else version ( FreeBSD )
117123{
@@ -205,10 +211,30 @@ else
205211 static assert (false , " Unsupported platform" );
206212}
207213
208- int closedir (DIR * );
209- DIR * opendir (in char * );
210- // dirent* readdir(DIR*);
211- void rewinddir (DIR * );
214+ version ( OSX )
215+ {
216+ version ( D_LP64 )
217+ {
218+ int closedir (DIR * );
219+ pragma (mangle, " opendir$INODE64" ) DIR * opendir(in char * );
220+ pragma (mangle, " rewinddir$INODE64" ) void rewinddir(DIR * );
221+ }
222+ else
223+ {
224+ // 32-bit mangles __DARWIN_UNIX03 specific functions with $UNIX2003 to
225+ // maintain backward compatibility with binaries build pre 10.5
226+ pragma (mangle, " closedir$UNIX2003" ) int closedir(DIR * );
227+ pragma (mangle, " opendir$INODE64$UNIX2003" ) DIR * opendir(in char * );
228+ pragma (mangle, " rewinddir$INODE64$UNIX2003" ) void rewinddir(DIR * );
229+ }
230+ }
231+ else
232+ {
233+ int closedir (DIR * );
234+ DIR * opendir (in char * );
235+ // dirent* readdir(DIR*);
236+ void rewinddir (DIR * );
237+ }
212238
213239//
214240// Thread-Safe Functions (TSF)
@@ -231,7 +257,7 @@ version( CRuntime_Glibc )
231257}
232258else version ( OSX )
233259{
234- int readdir_r (DIR * , dirent* , dirent** );
260+ pragma (mangle, " readdir_r$INODE64 " ) int readdir_r(DIR * , dirent* , dirent** );
235261}
236262else version ( FreeBSD )
237263{
@@ -276,8 +302,20 @@ else version( FreeBSD )
276302 void seekdir (DIR * , c_long);
277303 c_long telldir (DIR * );
278304}
279- else version (OSX )
305+ else version ( OSX )
280306{
307+ version ( D_LP64 )
308+ {
309+ pragma (mangle, " seekdir$INODE64" ) void seekdir(DIR * , c_long);
310+ pragma (mangle, " telldir$INODE64" ) c_long telldir(DIR * );
311+ }
312+ else
313+ {
314+ // 32-bit mangles __DARWIN_UNIX03 specific functions with $UNIX2003 to
315+ // maintain backward compatibility with binaries build pre 10.5
316+ pragma (mangle, " seekdir$INODE64$UNIX2003" ) void seekdir(DIR * , c_long);
317+ pragma (mangle, " telldir$INODE64$UNIX2003" ) c_long telldir(DIR * );
318+ }
281319}
282320else version (Solaris )
283321{
0 commit comments