blob: 8a2440e1fa4432e749bf7a17e9371d740d6fb1d4 [file] [log] [blame]
/**
* D header file for POSIX.
*
* Copyright: Copyright Sean Kelly 2005 - 2009.
* License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
* Authors: Sean Kelly,
Alex Rønne Petersn
* Standards: The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition
*/
/* Copyright Sean Kelly 2005 - 2009.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
module core.sys.posix.dirent;
import core.sys.posix.config;
public import core.sys.posix.sys.types; // for ino_t
version (OSX)
version = Darwin;
else version (iOS)
version = Darwin;
else version (TVOS)
version = Darwin;
else version (WatchOS)
version = Darwin;
version (Posix):
extern (C):
nothrow:
@nogc:
@system:
//
// Required
//
/*
DIR
struct dirent
{
char[] d_name;
}
int closedir(DIR*);
DIR* opendir(const scope char*);
dirent* readdir(DIR*);
void rewinddir(DIR*);
*/
version (CRuntime_Glibc)
{
// NOTE: The following constants are non-standard Linux definitions
// for dirent.d_type.
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
struct dirent
{
ino_t d_ino;
off_t d_off;
ushort d_reclen;
ubyte d_type;
char[256] d_name = 0;
}
struct DIR
{
// Managed by OS
}
static if ( __USE_FILE_OFFSET64 )
{
dirent* readdir64(DIR*);
alias readdir64 readdir;
}
else
{
dirent* readdir(DIR*);
}
}
else version (Darwin)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
// _DARWIN_FEATURE_64_BIT_INODE dirent is default for Mac OSX >10.5 and is
// only meaningful type for other OS X/Darwin variants (e.g. iOS).
// man dir(5) has some info, man stat(2) gives details.
struct dirent
{
ino_t d_ino;
alias d_fileno = d_ino;
ulong d_seekoff;
ushort d_reclen;
ushort d_namlen;
ubyte d_type;
char[1024] d_name = 0;
}
struct DIR
{
// Managed by OS
}
// OS X maintains backwards compatibility with older binaries using 32-bit
// inode functions by appending $INODE64 to newer 64-bit inode functions.
// Other Darwin variants (iOS, TVOS, WatchOS) only support 64-bit inodes,
// no suffix needed
version (OSX)
{
version (AArch64)
dirent* readdir(DIR*);
else
pragma(mangle, "readdir$INODE64") dirent* readdir(DIR*);
}
else
dirent* readdir(DIR*);
}
else version (FreeBSD)
{
import core.sys.freebsd.config;
// https://github.com/freebsd/freebsd/blob/master/sys/sys/dirent.h
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
static if (__FreeBSD_version >= 1200000)
{
struct dirent
{
ino_t d_fileno;
off_t d_off;
ushort d_reclen;
ubyte d_type;
ubyte d_pad0;
ushort d_namlen;
ushort d_pad1;
char[256] d_name = 0;
}
}
else
{
align(4)
struct dirent
{
uint d_fileno;
ushort d_reclen;
ubyte d_type;
ubyte d_namlen;
char[256] d_name = 0;
}
}
alias void* DIR;
version (GNU)
{
dirent* readdir(DIR*);
}
else
{
static if (__FreeBSD_version >= 1200000)
pragma(mangle, "readdir@FBSD_1.5") dirent* readdir(DIR*);
else
pragma(mangle, "readdir@FBSD_1.0") dirent* readdir(DIR*);
}
}
else version (NetBSD)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
struct dirent
{
ulong d_fileno;
ushort d_reclen;
ushort d_namlen;
ubyte d_type;
char[512] d_name = 0;
}
alias void* DIR;
dirent* __readdir30(DIR*);
alias __readdir30 readdir;
}
else version (OpenBSD)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
}
align(4)
struct dirent
{
ino_t d_fileno;
off_t d_off;
ushort d_reclen;
ubyte d_type;
ubyte d_namlen;
ubyte[4] __d_padding;
char[256] d_name = 0;
}
alias void* DIR;
dirent* readdir(DIR*);
}
else version (DragonFlyBSD)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14,
DT_DBF = 15, /* database record file */
}
struct dirent
{
ino_t d_fileno; /* file number of entry */
ushort d_reclen; /* strlen(d_name) */
ubyte d_type; /* file type, see blow */
ubyte d_unused1; /* padding, reserved */
uint d_unused2; /* reserved */
char[256] d_name = 0; /* name, NUL-terminated */
}
alias void* DIR;
dirent* readdir(DIR*);
}
else version (Solaris)
{
struct dirent
{
ino_t d_ino;
off_t d_off;
ushort d_reclen;
char[1] d_name = 0;
}
struct DIR
{
int dd_fd;
int dd_loc;
int dd_size;
char* dd_buf;
}
version (D_LP64)
{
dirent* readdir(DIR*);
alias readdir64 = readdir;
}
else
{
static if (__USE_LARGEFILE64)
{
dirent* readdir64(DIR*);
alias readdir64 readdir;
}
else
{
dirent* readdir(DIR*);
}
}
}
else version (CRuntime_Bionic)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
struct dirent
{
ulong d_ino;
long d_off;
ushort d_reclen;
ubyte d_type;
char[256] d_name = 0;
}
struct DIR
{
}
dirent* readdir(DIR*);
}
else version (CRuntime_Musl)
{
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
struct dirent
{
ino_t d_ino;
off_t d_off;
ushort d_reclen;
ubyte d_type;
char[256] d_name = 0;
}
struct DIR
{
}
static if ( __USE_FILE_OFFSET64 )
{
dirent* readdir64(DIR*);
alias readdir64 readdir;
}
else
{
dirent* readdir(DIR*);
}
}
else version (CRuntime_UClibc)
{
// NOTE: The following constants are non-standard Linux definitions
// for dirent.d_type.
enum
{
DT_UNKNOWN = 0,
DT_FIFO = 1,
DT_CHR = 2,
DT_DIR = 4,
DT_BLK = 6,
DT_REG = 8,
DT_LNK = 10,
DT_SOCK = 12,
DT_WHT = 14
}
struct dirent
{
static if (__USE_FILE_OFFSET64)
{
ino64_t d_ino;
off64_t d_off;
}
else
{
ino_t d_ino;
off_t d_off;
}
ushort d_reclen;
ubyte d_type;
char[256] d_name = 0;
}
struct DIR
{
// Managed by OS
}
static if ( __USE_FILE_OFFSET64 )
{
dirent* readdir64(DIR*);
alias readdir64 readdir;
}
else
{
dirent* readdir(DIR*);
}
}
else
{
static assert(false, "Unsupported platform");
}
// Only OS X out of the Darwin family needs special treatment. Other Darwins
// (iOS, TVOS, WatchOS) are fine with normal symbol names for these functions
// in else below.
version (OSX)
{
version (AArch64)
{
int closedir(DIR*);
DIR* opendir(const scope char*);
void rewinddir(DIR*);
}
else version (D_LP64)
{
int closedir(DIR*);
pragma(mangle, "opendir$INODE64") DIR* opendir(const scope char*);
pragma(mangle, "rewinddir$INODE64") void rewinddir(DIR*);
}
else
{
// 32-bit mangles __DARWIN_UNIX03 specific functions with $UNIX2003 to
// maintain backward compatibility with binaries build pre 10.5
pragma(mangle, "closedir$UNIX2003") int closedir(DIR*);
pragma(mangle, "opendir$INODE64$UNIX2003") DIR* opendir(const scope char*);
pragma(mangle, "rewinddir$INODE64$UNIX2003") void rewinddir(DIR*);
}
}
else version (NetBSD)
{
int closedir(DIR*);
DIR* __opendir30(const scope char*);
alias __opendir30 opendir;
void rewinddir(DIR*);
}
else
{
int closedir(DIR*);
DIR* opendir(const scope char*);
//dirent* readdir(DIR*);
void rewinddir(DIR*);
}
//
// Thread-Safe Functions (TSF)
//
/*
int readdir_r(DIR*, dirent*, dirent**);
*/
version (CRuntime_Glibc)
{
static if ( __USE_LARGEFILE64 )
{
int readdir64_r(DIR*, dirent*, dirent**);
alias readdir64_r readdir_r;
}
else
{
int readdir_r(DIR*, dirent*, dirent**);
}
}
else version (Darwin)
{
version (OSX)
pragma(mangle, "readdir_r$INODE64") int readdir_r(DIR*, dirent*, dirent**);
else
int readdir_r(DIR*, dirent*, dirent**);
}
else version (FreeBSD)
{
version (GNU)
{
int readdir_r(DIR*, dirent*, dirent**);
}
else
{
static if (__FreeBSD_version >= 1200000)
pragma(mangle, "readdir_r@FBSD_1.5") int readdir_r(DIR*, dirent*, dirent**);
else
pragma(mangle, "readdir_r@FBSD_1.0") int readdir_r(DIR*, dirent*, dirent**);
}
}
else version (DragonFlyBSD)
{
int readdir_r(DIR*, dirent*, dirent**);
}
else version (NetBSD)
{
int __readdir_r30(DIR*, dirent*, dirent**);
alias __readdir_r30 readdir_r;
}
else version (OpenBSD)
{
int readdir_r(DIR*, dirent*, dirent**);
}
else version (Solaris)
{
static if (__USE_LARGEFILE64)
{
int readdir64_r(DIR*, dirent*, dirent**);
alias readdir64_r readdir_r;
}
else
{
int readdir_r(DIR*, dirent*, dirent**);
}
}
else version (CRuntime_Bionic)
{
int readdir_r(DIR*, dirent*, dirent**);
}
else version (CRuntime_Musl)
{
int readdir_r(DIR*, dirent*, dirent**);
}
else version (CRuntime_UClibc)
{
static if ( __USE_LARGEFILE64 )
{
int readdir64_r(DIR*, dirent*, dirent**);
alias readdir64_r readdir_r;
}
else
{
int readdir_r(DIR*, dirent*, dirent**);
}
}
else
{
static assert(false, "Unsupported platform");
}
//
// XOpen (XSI)
//
/*
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
*/
version (CRuntime_Glibc)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else version (FreeBSD)
{
version (GNU)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else
{
pragma(mangle, "seekdir@@FBSD_1.0") void seekdir(DIR*, c_long);
pragma(mangle, "telldir@@FBSD_1.0") c_long telldir(DIR*);
}
}
else version (NetBSD)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else version (OpenBSD)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else version (DragonFlyBSD)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else version (Darwin)
{
version (OSX)
{
version (D_LP64)
{
pragma(mangle, "seekdir$INODE64") void seekdir(DIR*, c_long);
pragma(mangle, "telldir$INODE64") c_long telldir(DIR*);
}
else
{
// 32-bit mangles __DARWIN_UNIX03 specific functions with $UNIX2003 to
// maintain backward compatibility with binaries build pre 10.5
pragma(mangle, "seekdir$INODE64$UNIX2003") void seekdir(DIR*, c_long);
pragma(mangle, "telldir$INODE64$UNIX2003") c_long telldir(DIR*);
}
}
else // other Darwins (e.g. iOS, TVOS, WatchOS)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
}
else version (Solaris)
{
c_long telldir(DIR*);
void seekdir(DIR*, c_long);
}
else version (CRuntime_Bionic)
{
}
else version (CRuntime_Musl)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else version (CRuntime_UClibc)
{
void seekdir(DIR*, c_long);
c_long telldir(DIR*);
}
else
{
static assert(false, "Unsupported platform");
}