/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2007, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * unistd.h: POSIX emulation for WIN32
- *
+ * unistd.h: POSIX emulation for Windows
+ *
* Known contributors to this file:
* Ron Koenderink, 2007
+ * Markus Armbruster, 2007-2009
+ */
+
+/*
+ * We can provide POSIX headers that don't exist in Windows, but we
+ * can't augment existing headers. Some stuff that should be in such
+ * headers ends up here, and some in w32misc.h. Can't be helped.
*/
#ifndef UNISTD_H
#define UNISTD_H
-#include "getopt.h"
+/*
+ * We override system functions by defining them as macros. This
+ * breaks if the system's declaration is included later. Include them
+ * here. Major name space pollution, can't be helped.
+ */
+#include <getopt.h>
+#include <io.h>
+#include <direct.h>
+#include <sys/stat.h>
+#include "w32types.h"
+
+/*
+ * w32file.c
+ */
+/* Should be in sys/stat.h */
+#define mkdir(dir, perm) w32_mkdir((dir), (perm))
+extern int w32_mkdir(const char *dirname, mode_t perm);
+
+/* Should be in sys/stat.h */
+#ifndef S_IRUSR
+#define S_IRUSR _S_IREAD
+#define S_IWUSR _S_IWRITE
+#define S_IXUSR _S_IEXEC
+#define S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
+#endif
+#ifndef S_IRGRP
+#define S_IRGRP 0
+#define S_IWGRP 0
+#define S_IXGRP 0
+#define S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
+#endif
+#ifndef S_IROTH
+#define S_IROTH 0
+#define S_IWOTH 0
+#define S_IXOTH 0
+#define S_IRWXO S_IROTH | S_IWOTH | S_IXOTH
+#endif
+
+/* Should be in fcntl.h */
+#define O_NONBLOCK 1
+
+#define F_GETFL 1
+#define F_SETFL 2
+
+extern int fcntl(int fd, int cmd, ...);
+
+/* Stuff that actually belongs here */
+#define close(fd) w32_close_function((fd))
+extern int (*w32_close_function)(int);
+#define ftruncate(fd, length) _chsize((fd), (length))
+#define read(fd, buf, sz) w32_read_function((fd), (buf), (sz))
+extern int (*w32_read_function)(int, void *, unsigned);
+#define write(fd, buf, sz) w32_write_function((fd), (buf), (sz))
+extern int (*w32_write_function)(int, const void *, unsigned);
+
#endif /* UNISTD_H */