1 #ifndef QUIRK_UNISTD_H
2 #define QUIRK_UNISTD_H
3 #pragma message("winquirk: no unistd.h!")
4 
5 #include <winsock2.h>
6 #include <ws2tcpip.h>
7 #include <windows.h>
8 #include <direct.h>
9 #include <errno.h>
10 #include <fcntl.h>
11 #include <io.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <process.h>
16 
17 #include <windef.h>
18 #include <winbase.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 
22 #define getpid _getpid
23 #define popen _popen
24 #define pclose _pclose
25 #define ssize_t SSIZE_T
26 
27 #if 0
28 static int gethostname(char *__name, size_t __len) {
29 	DWORD len = __len;
30 	if (0==GetComputerNameA(__name, &len))
31 		return -1;
32 	return 0;
33 }
34 #endif
35 
36 
37 #define environ _environ
38 
39 /*
40 #define _IFMT  0170000 // type of file
41 #define _IFDIR 0040000 // directory
42 #define S_ISDIR(m) (((m)&_IFMT) == _IFDIR)
43 */
44 
45 #define S_ISUID 0004000
46 #define S_IRWXU 0000700
47 #define S_IRWXG 0000070
48 #define S_IRWXO 0000007
49 #define S_ISGID 0002000
50 #define S_ISVTX 0001000
51 
52 #define S_IRUSR 0000400
53 #define S_IWUSR 0000200
54 
55 #define S_IRGRP 0000040
56 #define S_IWGRP 0000020
57 
58 #define S_IROTH 0000004
59 #define S_IWOTH 0000002
60 
61 #define PATH_SEPARATOR '\\'
62 
63 #if defined(_MSC_VER)  &&  !defined(S_IREAD)
64 #   define S_IFMT   _S_IFMT                     /* File type mask */
65 #   define S_IFDIR  _S_IFDIR                    /* Directory */
66 #   define S_IFCHR  _S_IFCHR                    /* Character device */
67 #   define S_IFFIFO _S_IFFIFO                   /* Pipe */
68 #   define S_IFREG  _S_IFREG                    /* Regular file */
69 #   define S_IREAD  _S_IREAD                    /* Read permission */
70 #   define S_IWRITE _S_IWRITE                   /* Write permission */
71 #   define S_IEXEC  _S_IEXEC                    /* Execute permission */
72 #endif
73 
74 #define S_IFFIFO 0
75 #define S_IFLNK 0
76 #define S_IFBLK   0
77 #define S_IFSOCK  0
78 #define S_IXUSR 0
79 #define S_IXGRP 0
80 #define S_IXOTH 0
81 
82 #if 0
83 #define S_ISLNK(x) 0
84 #define S_ISBLK(x) 0
85 #define S_ISCHR(x) 0
86 #define S_ISFIFO(x) 0
87 #define S_ISSOCK(x) 0
88 #else
89 #define	S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFFIFO)
90 #define	S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
91 #define	S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
92 #define	S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
93 #define	S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
94 #define	S_ISCHR(mode)  (((mode) & S_IFMT) == S_IFCHR)
95 #define	S_ISBLK(mode)  (((mode) & S_IFMT) == S_IFBLK)
96 #endif
97 
98 
99 #define	F_OK	0
100 #define	R_OK	4
101 #define	W_OK	2
102 #define	X_OK	1
103 
104 #ifndef STDIN_FILENO
105 #define STDIN_FILENO 0
106 #endif
107 
108 #ifndef STDOUT_FILENO
109 #define STDOUT_FILENO 1
110 #endif
111 
112 #ifndef STDERR_FILENO
113 #define STDERR_FILENO 2
114 #endif
115 
116 #if _MSC_VER < 1600
117 #define ENOTSUP       ENOSYS
118 #endif
119 typedef unsigned int gid_t;
120 typedef unsigned int uid_t;
121 
122 #if defined(__MINGW64__) && defined(_WIN64)
123 /* MINGW_EXTENSION */
124 typedef long long int pid_t;
125 /* "long long int" is an alternative to __int64 */
126 #else
127 typedef int mode_t;
128 typedef int pid_t;
129 #endif
130 
131 
132 #define getgroups(x,y) 0
133 
geteuid()134 static uid_t geteuid() {
135 	return -2;
136 }
137 
getuid()138 static uid_t getuid() {
139 	return -2;
140 }
141 
readlink(const char * __path,char * __buf,int __buflen)142 static int readlink(const char *__path, char *__buf, int __buflen)
143 {
144     if (!__path) {
145       errno = EINVAL;
146       return -1;
147     }
148     if ( (__buflen < 0) || ((int)strlen(__path)>(__buflen-1)) )
149     {
150       errno = ENAMETOOLONG;
151       return -1;
152     }
153     if (access(__path, R_OK) == 0) {
154       /* ok, copy to buf */
155       strncpy(__buf,__path,__buflen);
156       errno = 0;
157       return 0;
158     }
159     errno = ENOENT;
160     return -1;
161 }
162 
163 
164 #ifdef __cplusplus
165 extern "C" {
166 
167 #if 0
168 int setenv(const char *name, const char *value, int overwrite);
169 int unsetenv (const char *name);
170 #endif
171 
172 }
173 #endif  /* __cplusplus */
174 
175 
sleep(unsigned int sec)176 static int sleep(unsigned int sec) {
177 	Sleep(sec*1000);
178 	return 0;
179 }
180 
181 #endif
182