#ifndef DATKT_FS_CONSTANTS_H
#define DATKT_FS_CONSTANTS_H

#include <uv.h>

#define EXPORT_CONSTANT(C) long long _##C() { return C; }
#define EXPORT_CONSTANT_DEFAULT(C, D) long long _##C() { return D; }

EXPORT_CONSTANT(UV_FS_SYMLINK_DIR);
EXPORT_CONSTANT(UV_FS_SYMLINK_JUNCTION);

EXPORT_CONSTANT(O_RDONLY);
EXPORT_CONSTANT(O_WRONLY);
EXPORT_CONSTANT(O_RDWR);

// file types from readdir
EXPORT_CONSTANT(UV_DIRENT_UNKNOWN);
EXPORT_CONSTANT(UV_DIRENT_FILE);
EXPORT_CONSTANT(UV_DIRENT_DIR);
EXPORT_CONSTANT(UV_DIRENT_LINK);
EXPORT_CONSTANT(UV_DIRENT_FIFO);
EXPORT_CONSTANT(UV_DIRENT_SOCKET);
EXPORT_CONSTANT(UV_DIRENT_CHAR);
EXPORT_CONSTANT(UV_DIRENT_BLOCK);

EXPORT_CONSTANT(S_IFMT);
EXPORT_CONSTANT(S_IFREG);
EXPORT_CONSTANT(S_IFDIR);
EXPORT_CONSTANT(S_IFCHR);

#ifdef S_IFBLK
  EXPORT_CONSTANT(S_IFBLK);
#else
  EXPORT_CONSTANT_DEFAULT(S_IFBLK, -1)
#endif

#ifdef S_IFIFO
  EXPORT_CONSTANT(S_IFIFO);
#else
  EXPORT_CONSTANT_DEFAULT(S_IFIFO, -1)
#endif

#ifdef S_IFLNK
  EXPORT_CONSTANT(S_IFLNK);
#else
  EXPORT_CONSTANT_DEFAULT(S_IFLNK, -1)
#endif

#ifdef S_IFSOCK
  EXPORT_CONSTANT(S_IFSOCK);
#else
  EXPORT_CONSTANT_DEFAULT(S_IFSOCK, -1)
#endif

#ifdef O_CREAT
  EXPORT_CONSTANT(O_CREAT);
#else
  EXPORT_CONSTANT_DEFAULT(O_CREAT, -1)
#endif

#ifdef O_EXCL
  EXPORT_CONSTANT(O_EXCL);
#else
  EXPORT_CONSTANT_DEFAULT(O_EXCL, -1)
#endif

#ifdef O_NOCTTY
  EXPORT_CONSTANT(O_NOCTTY);
#else
  EXPORT_CONSTANT_DEFAULT(O_NOCTTY, -1)
#endif

#ifdef O_TRUNC
  EXPORT_CONSTANT(O_TRUNC);
#else
  EXPORT_CONSTANT_DEFAULT(O_TRUNC, -1)
#endif

#ifdef O_APPEND
  EXPORT_CONSTANT(O_APPEND);
#else
  EXPORT_CONSTANT_DEFAULT(O_APPEND, -1)
#endif

#ifdef O_DIRECTORY
  EXPORT_CONSTANT(O_DIRECTORY);
#else
  EXPORT_CONSTANT_DEFAULT(O_DIRECTORY, -1)
#endif

#ifdef O_NOATIME
  EXPORT_CONSTANT(O_NOATIME);
#else
  EXPORT_CONSTANT_DEFAULT(O_NOATIME, -1)
#endif

#ifdef O_NOFOLLOW
  EXPORT_CONSTANT(O_NOFOLLOW);
#else
  EXPORT_CONSTANT_DEFAULT(O_NOFOLLOW, -1)
#endif

#ifdef O_SYNC
  EXPORT_CONSTANT(O_SYNC);
#else
  EXPORT_CONSTANT_DEFAULT(O_SYNC, -1)
#endif

#ifdef O_DSYNC
  EXPORT_CONSTANT(O_DSYNC);
#else
  EXPORT_CONSTANT_DEFAULT(O_DSYNC, -1)
#endif

#ifdef O_SYMLINK
  EXPORT_CONSTANT(O_SYMLINK);
#else
  EXPORT_CONSTANT_DEFAULT(O_SYMLINK, -1)
#endif

#ifdef O_DIRECT
  EXPORT_CONSTANT(O_DIRECT);
#else
  EXPORT_CONSTANT_DEFAULT(O_DIRECT, -1)
#endif

#ifdef O_NONBLOCK
  EXPORT_CONSTANT(O_NONBLOCK);
#else
  EXPORT_CONSTANT_DEFAULT(O_NONBLOCK, -1)
#endif

#ifdef S_IRWXU
  EXPORT_CONSTANT(S_IRWXU);
#else
  EXPORT_CONSTANT_DEFAULT(S_IRWXU, -1)
#endif

#ifdef S_IRUSR
  EXPORT_CONSTANT(S_IRUSR);
#else
  EXPORT_CONSTANT_DEFAULT(S_IRUSR, -1)
#endif

#ifdef S_IWUSR
  EXPORT_CONSTANT(S_IWUSR);
#else
  EXPORT_CONSTANT_DEFAULT(S_IWUSR, -1)
#endif

#ifdef S_IXUSR
  EXPORT_CONSTANT(S_IXUSR);
#else
  EXPORT_CONSTANT_DEFAULT(S_IXUSR, -1)
#endif

#ifdef S_IRWXG
  EXPORT_CONSTANT(S_IRWXG);
#else
  EXPORT_CONSTANT_DEFAULT(S_IRWXG, -1)
#endif

#ifdef S_IRGRP
  EXPORT_CONSTANT(S_IRGRP);
#else
  EXPORT_CONSTANT_DEFAULT(S_IRGRP, -1)
#endif

#ifdef S_IWGRP
  EXPORT_CONSTANT(S_IWGRP);
#else
  EXPORT_CONSTANT_DEFAULT(S_IWGRP, -1)
#endif

#ifdef S_IXGRP
  EXPORT_CONSTANT(S_IXGRP);
#else
  EXPORT_CONSTANT_DEFAULT(S_IXGRP, -1)
#endif

#ifdef S_IRWXO
  EXPORT_CONSTANT(S_IRWXO);
#else
  EXPORT_CONSTANT_DEFAULT(S_IRWXO, -1)
#endif

#ifdef S_IROTH
  EXPORT_CONSTANT(S_IROTH);
#else
  EXPORT_CONSTANT_DEFAULT(S_IROTH, -1)
#endif

#ifdef S_IWOTH
  EXPORT_CONSTANT(S_IWOTH);
#else
  EXPORT_CONSTANT_DEFAULT(S_IWOTH, -1)
#endif

#ifdef S_IXOTH
  EXPORT_CONSTANT(S_IXOTH);
#else
  EXPORT_CONSTANT_DEFAULT(S_IXOTH, -1)
#endif

#ifdef F_OK
  EXPORT_CONSTANT(F_OK);
#else
  EXPORT_CONSTANT_DEFAULT(F_OK, -1)
#endif

#ifdef R_OK
  EXPORT_CONSTANT(R_OK);
#else
  EXPORT_CONSTANT_DEFAULT(R_OK, -1)
#endif

#ifdef W_OK
  EXPORT_CONSTANT(W_OK);
#else
  EXPORT_CONSTANT_DEFAULT(W_OK, -1)
#endif

#ifdef X_OK
  EXPORT_CONSTANT(X_OK);
#else
  EXPORT_CONSTANT_DEFAULT(X_OK, -1)
#endif

#endif
