Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 1 | #include <winsock2.h> |
Martin Storsjö | fe3b2b7 | 2009-11-24 00:55:50 +0200 | [diff] [blame] | 2 | #include <ws2tcpip.h> |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 3 | |
| 4 | /* |
| 5 | * things that are not available in header files |
| 6 | */ |
| 7 | |
| 8 | typedef int pid_t; |
Sebastian Schuberth | e7cf4e9 | 2009-12-28 18:04:21 +0100 | [diff] [blame] | 9 | typedef int uid_t; |
Mike Pape | 772991a | 2010-11-04 02:35:09 +0100 | [diff] [blame] | 10 | typedef int socklen_t; |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 11 | #define hstrerror strerror |
| 12 | |
| 13 | #define S_IFLNK 0120000 /* Symbolic link */ |
| 14 | #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) |
| 15 | #define S_ISSOCK(x) 0 |
Sebastian Schuberth | 4091bfc | 2009-12-28 18:13:52 +0100 | [diff] [blame] | 16 | |
| 17 | #ifndef _STAT_H_ |
| 18 | #define S_IRUSR 0 |
| 19 | #define S_IWUSR 0 |
| 20 | #define S_IXUSR 0 |
| 21 | #define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR) |
| 22 | #endif |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 23 | #define S_IRGRP 0 |
| 24 | #define S_IWGRP 0 |
| 25 | #define S_IXGRP 0 |
Sebastian Schuberth | 4091bfc | 2009-12-28 18:13:52 +0100 | [diff] [blame] | 26 | #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 27 | #define S_IROTH 0 |
Sebastian Schuberth | 4091bfc | 2009-12-28 18:13:52 +0100 | [diff] [blame] | 28 | #define S_IWOTH 0 |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 29 | #define S_IXOTH 0 |
Sebastian Schuberth | 4091bfc | 2009-12-28 18:13:52 +0100 | [diff] [blame] | 30 | #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) |
| 31 | #define S_ISUID 0 |
| 32 | #define S_ISGID 0 |
| 33 | #define S_ISVTX 0 |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 34 | |
Johannes Sixt | 303e7c4 | 2009-07-04 21:26:38 +0200 | [diff] [blame] | 35 | #define WIFEXITED(x) 1 |
| 36 | #define WIFSIGNALED(x) 0 |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 37 | #define WEXITSTATUS(x) ((x) & 0xff) |
Johannes Sixt | 303e7c4 | 2009-07-04 21:26:38 +0200 | [diff] [blame] | 38 | #define WTERMSIG(x) SIGTERM |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 39 | |
Johannes Sixt | d282506 | 2009-01-22 00:57:34 -0500 | [diff] [blame] | 40 | #define SIGHUP 1 |
| 41 | #define SIGQUIT 3 |
| 42 | #define SIGKILL 9 |
| 43 | #define SIGPIPE 13 |
| 44 | #define SIGALRM 14 |
| 45 | #define SIGCHLD 17 |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 46 | |
| 47 | #define F_GETFD 1 |
| 48 | #define F_SETFD 2 |
| 49 | #define FD_CLOEXEC 0x1 |
| 50 | |
Mike Pape | 772991a | 2010-11-04 02:35:09 +0100 | [diff] [blame] | 51 | #define EAFNOSUPPORT WSAEAFNOSUPPORT |
| 52 | #define ECONNABORTED WSAECONNABORTED |
| 53 | |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 54 | struct passwd { |
| 55 | char *pw_name; |
| 56 | char *pw_gecos; |
| 57 | char *pw_dir; |
| 58 | }; |
| 59 | |
Johannes Schindelin | 0dbbbc1 | 2009-05-23 10:04:50 +0200 | [diff] [blame] | 60 | extern char *getpass(const char *prompt); |
| 61 | |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 62 | typedef void (__cdecl *sig_handler_t)(int); |
| 63 | struct sigaction { |
| 64 | sig_handler_t sa_handler; |
| 65 | unsigned sa_flags; |
| 66 | }; |
| 67 | #define sigemptyset(x) (void)0 |
| 68 | #define SA_RESTART 0 |
| 69 | |
| 70 | struct itimerval { |
| 71 | struct timeval it_value, it_interval; |
| 72 | }; |
| 73 | #define ITIMER_REAL 0 |
| 74 | |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 75 | /* |
Eric Sunshine | 77df1f1 | 2010-09-27 07:01:59 -0400 | [diff] [blame] | 76 | * sanitize preprocessor namespace polluted by Windows headers defining |
| 77 | * macros which collide with git local versions |
| 78 | */ |
| 79 | #undef HELP_COMMAND /* from winuser.h */ |
| 80 | |
| 81 | /* |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 82 | * trivial stubs |
| 83 | */ |
| 84 | |
| 85 | static inline int readlink(const char *path, char *buf, size_t bufsiz) |
| 86 | { errno = ENOSYS; return -1; } |
| 87 | static inline int symlink(const char *oldpath, const char *newpath) |
| 88 | { errno = ENOSYS; return -1; } |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 89 | static inline int fchmod(int fildes, mode_t mode) |
| 90 | { errno = ENOSYS; return -1; } |
Sebastian Schuberth | e7cf4e9 | 2009-12-28 18:04:21 +0100 | [diff] [blame] | 91 | static inline pid_t fork(void) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 92 | { errno = ENOSYS; return -1; } |
| 93 | static inline unsigned int alarm(unsigned int seconds) |
| 94 | { return 0; } |
| 95 | static inline int fsync(int fd) |
Erik Faye-Lund | 75f6929 | 2010-05-20 20:57:54 +0200 | [diff] [blame] | 96 | { return _commit(fd); } |
Sebastian Schuberth | e7cf4e9 | 2009-12-28 18:04:21 +0100 | [diff] [blame] | 97 | static inline pid_t getppid(void) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 98 | { return 1; } |
| 99 | static inline void sync(void) |
| 100 | {} |
Sebastian Schuberth | e7cf4e9 | 2009-12-28 18:04:21 +0100 | [diff] [blame] | 101 | static inline uid_t getuid(void) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 102 | { return 1; } |
| 103 | static inline struct passwd *getpwnam(const char *name) |
| 104 | { return NULL; } |
Johannes Sixt | 5f8763a | 2010-03-06 16:40:40 +0100 | [diff] [blame] | 105 | static inline int fcntl(int fd, int cmd, ...) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 106 | { |
| 107 | if (cmd == F_GETFD || cmd == F_SETFD) |
| 108 | return 0; |
| 109 | errno = EINVAL; |
| 110 | return -1; |
| 111 | } |
Johannes Sixt | 47e3de0 | 2009-07-05 20:57:46 +0200 | [diff] [blame] | 112 | /* bash cannot reliably detect negative return codes as failure */ |
| 113 | #define exit(code) exit((code) & 0xff) |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 114 | |
| 115 | /* |
| 116 | * simple adaptors |
| 117 | */ |
| 118 | |
| 119 | static inline int mingw_mkdir(const char *path, int mode) |
| 120 | { |
| 121 | return mkdir(path); |
| 122 | } |
| 123 | #define mkdir mingw_mkdir |
| 124 | |
Johannes Schindelin | 132a6e9 | 2007-01-23 13:39:09 +0100 | [diff] [blame] | 125 | static inline int mingw_unlink(const char *pathname) |
| 126 | { |
| 127 | /* read-only files cannot be removed */ |
| 128 | chmod(pathname, 0666); |
| 129 | return unlink(pathname); |
| 130 | } |
| 131 | #define unlink mingw_unlink |
| 132 | |
Erik Faye-Lund | ef7108c | 2010-11-04 02:35:14 +0100 | [diff] [blame] | 133 | #define WNOHANG 1 |
Erik Faye-Lund | 52de4db | 2010-11-04 02:35:13 +0100 | [diff] [blame] | 134 | pid_t waitpid(pid_t pid, int *status, unsigned options); |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 135 | |
Erik Faye-Lund | 82fc07b | 2010-11-04 02:35:15 +0100 | [diff] [blame] | 136 | #define kill mingw_kill |
| 137 | int mingw_kill(pid_t pid, int sig); |
| 138 | |
Erik Faye-Lund | 514213b | 2009-10-19 17:42:07 +0200 | [diff] [blame] | 139 | #ifndef NO_OPENSSL |
| 140 | #include <openssl/ssl.h> |
| 141 | static inline int mingw_SSL_set_fd(SSL *ssl, int fd) |
| 142 | { |
| 143 | return SSL_set_fd(ssl, _get_osfhandle(fd)); |
| 144 | } |
| 145 | #define SSL_set_fd mingw_SSL_set_fd |
| 146 | |
| 147 | static inline int mingw_SSL_set_rfd(SSL *ssl, int fd) |
| 148 | { |
| 149 | return SSL_set_rfd(ssl, _get_osfhandle(fd)); |
| 150 | } |
| 151 | #define SSL_set_rfd mingw_SSL_set_rfd |
| 152 | |
| 153 | static inline int mingw_SSL_set_wfd(SSL *ssl, int fd) |
| 154 | { |
| 155 | return SSL_set_wfd(ssl, _get_osfhandle(fd)); |
| 156 | } |
| 157 | #define SSL_set_wfd mingw_SSL_set_wfd |
| 158 | #endif |
| 159 | |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 160 | /* |
| 161 | * implementations of missing functions |
| 162 | */ |
| 163 | |
Johannes Sixt | 897bb8c | 2007-12-07 22:05:36 +0100 | [diff] [blame] | 164 | int pipe(int filedes[2]); |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 165 | unsigned int sleep (unsigned int seconds); |
| 166 | int mkstemp(char *template); |
| 167 | int gettimeofday(struct timeval *tv, void *tz); |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 168 | struct tm *gmtime_r(const time_t *timep, struct tm *result); |
| 169 | struct tm *localtime_r(const time_t *timep, struct tm *result); |
| 170 | int getpagesize(void); /* defined in MinGW's libgcc.a */ |
Sebastian Schuberth | e7cf4e9 | 2009-12-28 18:04:21 +0100 | [diff] [blame] | 171 | struct passwd *getpwuid(uid_t uid); |
Johannes Sixt | f4626df | 2007-12-01 21:24:59 +0100 | [diff] [blame] | 172 | int setitimer(int type, struct itimerval *in, struct itimerval *out); |
| 173 | int sigaction(int sig, struct sigaction *in, struct sigaction *out); |
Petr Kodl | 7be401e | 2009-01-24 15:04:39 +0100 | [diff] [blame] | 174 | int link(const char *oldpath, const char *newpath); |
Johannes Sixt | 80ba074 | 2007-12-03 21:55:57 +0100 | [diff] [blame] | 175 | |
| 176 | /* |
Johannes Sixt | 25fe217 | 2008-03-05 21:51:27 +0100 | [diff] [blame] | 177 | * replacements of existing functions |
| 178 | */ |
| 179 | |
Johannes Sixt | 3e4a1ba | 2007-11-15 22:22:47 +0100 | [diff] [blame] | 180 | int mingw_open (const char *filename, int oflags, ...); |
| 181 | #define open mingw_open |
| 182 | |
René Scharfe | c8b2964 | 2010-05-20 20:57:53 +0200 | [diff] [blame] | 183 | ssize_t mingw_write(int fd, const void *buf, size_t count); |
| 184 | #define write mingw_write |
| 185 | |
Johannes Sixt | 3fdcdbd | 2010-02-25 21:03:44 +0100 | [diff] [blame] | 186 | FILE *mingw_fopen (const char *filename, const char *otype); |
| 187 | #define fopen mingw_fopen |
| 188 | |
| 189 | FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); |
| 190 | #define freopen mingw_freopen |
| 191 | |
Johannes Sixt | 25fe217 | 2008-03-05 21:51:27 +0100 | [diff] [blame] | 192 | char *mingw_getcwd(char *pointer, int len); |
| 193 | #define getcwd mingw_getcwd |
| 194 | |
Johannes Sixt | 6fd6aec | 2008-06-22 11:35:21 +0200 | [diff] [blame] | 195 | char *mingw_getenv(const char *name); |
| 196 | #define getenv mingw_getenv |
| 197 | |
Johannes Sixt | 746fb85 | 2007-12-26 13:51:18 +0100 | [diff] [blame] | 198 | struct hostent *mingw_gethostbyname(const char *host); |
| 199 | #define gethostbyname mingw_gethostbyname |
| 200 | |
Martin Storsjö | fe3b2b7 | 2009-11-24 00:55:50 +0200 | [diff] [blame] | 201 | void mingw_freeaddrinfo(struct addrinfo *res); |
| 202 | #define freeaddrinfo mingw_freeaddrinfo |
| 203 | |
| 204 | int mingw_getaddrinfo(const char *node, const char *service, |
| 205 | const struct addrinfo *hints, struct addrinfo **res); |
| 206 | #define getaddrinfo mingw_getaddrinfo |
| 207 | |
| 208 | int mingw_getnameinfo(const struct sockaddr *sa, socklen_t salen, |
| 209 | char *host, DWORD hostlen, char *serv, DWORD servlen, |
| 210 | int flags); |
| 211 | #define getnameinfo mingw_getnameinfo |
| 212 | |
Johannes Sixt | 746fb85 | 2007-12-26 13:51:18 +0100 | [diff] [blame] | 213 | int mingw_socket(int domain, int type, int protocol); |
| 214 | #define socket mingw_socket |
| 215 | |
| 216 | int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); |
| 217 | #define connect mingw_connect |
| 218 | |
Mike Pape | 772991a | 2010-11-04 02:35:09 +0100 | [diff] [blame] | 219 | int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz); |
| 220 | #define bind mingw_bind |
| 221 | |
| 222 | int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen); |
| 223 | #define setsockopt mingw_setsockopt |
| 224 | |
| 225 | int mingw_listen(int sockfd, int backlog); |
| 226 | #define listen mingw_listen |
| 227 | |
| 228 | int mingw_accept(int sockfd, struct sockaddr *sa, socklen_t *sz); |
| 229 | #define accept mingw_accept |
| 230 | |
Johannes Sixt | ea9e98c | 2007-12-07 22:19:40 +0100 | [diff] [blame] | 231 | int mingw_rename(const char*, const char*); |
| 232 | #define rename mingw_rename |
| 233 | |
Ramsay Jones | b1b9520 | 2009-11-07 20:10:31 +0000 | [diff] [blame] | 234 | #if defined(USE_WIN32_MMAP) || defined(_MSC_VER) |
Janos Laube | b130a72 | 2009-03-13 16:50:45 +0100 | [diff] [blame] | 235 | int mingw_getpagesize(void); |
| 236 | #define getpagesize mingw_getpagesize |
| 237 | #endif |
| 238 | |
Marius Storm-Olsen | 5411bdc | 2007-09-03 20:40:26 +0200 | [diff] [blame] | 239 | /* Use mingw_lstat() instead of lstat()/stat() and |
| 240 | * mingw_fstat() instead of fstat() on Windows. |
| 241 | */ |
Johannes Schindelin | 1d4e4cd | 2009-03-05 17:05:12 +0100 | [diff] [blame] | 242 | #define off_t off64_t |
Johannes Schindelin | 1d4e4cd | 2009-03-05 17:05:12 +0100 | [diff] [blame] | 243 | #define lseek _lseeki64 |
Ramsay Jones | b6f714f | 2010-01-15 21:12:19 +0100 | [diff] [blame] | 244 | #ifndef ALREADY_DECLARED_STAT_FUNCS |
| 245 | #define stat _stati64 |
Johannes Sixt | 180964f | 2008-08-18 22:01:06 +0200 | [diff] [blame] | 246 | int mingw_lstat(const char *file_name, struct stat *buf); |
Pat Thoyts | 9b9784c | 2010-03-17 15:17:34 +0000 | [diff] [blame] | 247 | int mingw_stat(const char *file_name, struct stat *buf); |
Johannes Sixt | 180964f | 2008-08-18 22:01:06 +0200 | [diff] [blame] | 248 | int mingw_fstat(int fd, struct stat *buf); |
Marius Storm-Olsen | 5411bdc | 2007-09-03 20:40:26 +0200 | [diff] [blame] | 249 | #define fstat mingw_fstat |
| 250 | #define lstat mingw_lstat |
Pat Thoyts | 9b9784c | 2010-03-17 15:17:34 +0000 | [diff] [blame] | 251 | #define _stati64(x,y) mingw_stat(x,y) |
Ramsay Jones | b6f714f | 2010-01-15 21:12:19 +0100 | [diff] [blame] | 252 | #endif |
Marius Storm-Olsen | 5411bdc | 2007-09-03 20:40:26 +0200 | [diff] [blame] | 253 | |
Johannes Sixt | 7c0ffa1 | 2007-09-07 13:05:00 +0200 | [diff] [blame] | 254 | int mingw_utime(const char *file_name, const struct utimbuf *times); |
| 255 | #define utime mingw_utime |
| 256 | |
Johannes Sixt | 75301f9 | 2010-01-15 21:12:18 +0100 | [diff] [blame] | 257 | pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env, |
Johannes Sixt | f9a2743 | 2010-04-11 22:40:12 +0200 | [diff] [blame] | 258 | const char *dir, |
Johannes Sixt | 75301f9 | 2010-01-15 21:12:18 +0100 | [diff] [blame] | 259 | int fhin, int fhout, int fherr); |
Johannes Sixt | f1a4dfb | 2007-12-04 12:38:32 +0100 | [diff] [blame] | 260 | void mingw_execvp(const char *cmd, char *const *argv); |
| 261 | #define execvp mingw_execvp |
Eric Sunshine | 5debf9a | 2010-09-27 07:02:17 -0400 | [diff] [blame] | 262 | void mingw_execv(const char *cmd, char *const *argv); |
| 263 | #define execv mingw_execv |
Johannes Sixt | f1a4dfb | 2007-12-04 12:38:32 +0100 | [diff] [blame] | 264 | |
Steffen Prohaska | cd800ee | 2007-11-17 19:16:53 +0100 | [diff] [blame] | 265 | static inline unsigned int git_ntohl(unsigned int x) |
| 266 | { return (unsigned int)ntohl(x); } |
| 267 | #define ntohl git_ntohl |
| 268 | |
Johannes Sixt | 6072fc3 | 2007-11-13 10:14:45 +0100 | [diff] [blame] | 269 | sig_handler_t mingw_signal(int sig, sig_handler_t handler); |
| 270 | #define signal mingw_signal |
| 271 | |
Johannes Sixt | 25fe217 | 2008-03-05 21:51:27 +0100 | [diff] [blame] | 272 | /* |
Peter Harris | c09df8a | 2008-07-18 09:34:44 +0200 | [diff] [blame] | 273 | * ANSI emulation wrappers |
| 274 | */ |
| 275 | |
| 276 | int winansi_fputs(const char *str, FILE *stream); |
| 277 | int winansi_printf(const char *format, ...) __attribute__((format (printf, 1, 2))); |
| 278 | int winansi_fprintf(FILE *stream, const char *format, ...) __attribute__((format (printf, 2, 3))); |
| 279 | #define fputs winansi_fputs |
| 280 | #define printf(...) winansi_printf(__VA_ARGS__) |
| 281 | #define fprintf(...) winansi_fprintf(__VA_ARGS__) |
| 282 | |
| 283 | /* |
Johannes Sixt | 80ba074 | 2007-12-03 21:55:57 +0100 | [diff] [blame] | 284 | * git specific compatibility |
| 285 | */ |
| 286 | |
Johannes Sixt | 25fe217 | 2008-03-05 21:51:27 +0100 | [diff] [blame] | 287 | #define has_dos_drive_prefix(path) (isalpha(*(path)) && (path)[1] == ':') |
| 288 | #define is_dir_sep(c) ((c) == '/' || (c) == '\\') |
Johannes Sixt | 80ba074 | 2007-12-03 21:55:57 +0100 | [diff] [blame] | 289 | #define PATH_SEP ';' |
Johannes Sixt | 82f8d96 | 2007-03-23 10:57:05 +0100 | [diff] [blame] | 290 | #define PRIuMAX "I64u" |
Johannes Sixt | ba26f29 | 2007-12-07 22:08:59 +0100 | [diff] [blame] | 291 | |
Steffen Prohaska | 4804aab | 2008-07-13 22:31:20 +0200 | [diff] [blame] | 292 | void mingw_open_html(const char *path); |
| 293 | #define open_html mingw_open_html |
| 294 | |
Johannes Sixt | ba26f29 | 2007-12-07 22:08:59 +0100 | [diff] [blame] | 295 | /* |
| 296 | * helpers |
| 297 | */ |
| 298 | |
Johannes Sixt | 2affea4 | 2009-09-11 19:40:08 +0200 | [diff] [blame] | 299 | char **make_augmented_environ(const char *const *vars); |
Johannes Sixt | ba26f29 | 2007-12-07 22:08:59 +0100 | [diff] [blame] | 300 | void free_environ(char **env); |
Johannes Sixt | 35eeef4 | 2008-07-21 21:19:57 +0200 | [diff] [blame] | 301 | |
| 302 | /* |
| 303 | * A replacement of main() that ensures that argv[0] has a path |
Marius Storm-Olsen | a6ca8c6 | 2009-09-16 10:20:20 +0200 | [diff] [blame] | 304 | * and that default fmode and std(in|out|err) are in binary mode |
Johannes Sixt | 35eeef4 | 2008-07-21 21:19:57 +0200 | [diff] [blame] | 305 | */ |
| 306 | |
Steffen Prohaska | 2253776 | 2008-07-26 11:41:44 +0200 | [diff] [blame] | 307 | #define main(c,v) dummy_decl_mingw_main(); \ |
| 308 | static int mingw_main(); \ |
| 309 | int main(int argc, const char **argv) \ |
Johannes Sixt | 35eeef4 | 2008-07-21 21:19:57 +0200 | [diff] [blame] | 310 | { \ |
Erik Faye-Lund | 52de4db | 2010-11-04 02:35:13 +0100 | [diff] [blame] | 311 | extern CRITICAL_SECTION pinfo_cs; \ |
Marius Storm-Olsen | a6ca8c6 | 2009-09-16 10:20:20 +0200 | [diff] [blame] | 312 | _fmode = _O_BINARY; \ |
| 313 | _setmode(_fileno(stdin), _O_BINARY); \ |
| 314 | _setmode(_fileno(stdout), _O_BINARY); \ |
| 315 | _setmode(_fileno(stderr), _O_BINARY); \ |
Johannes Sixt | 35eeef4 | 2008-07-21 21:19:57 +0200 | [diff] [blame] | 316 | argv[0] = xstrdup(_pgmptr); \ |
Erik Faye-Lund | 52de4db | 2010-11-04 02:35:13 +0100 | [diff] [blame] | 317 | InitializeCriticalSection(&pinfo_cs); \ |
Johannes Sixt | 35eeef4 | 2008-07-21 21:19:57 +0200 | [diff] [blame] | 318 | return mingw_main(argc, argv); \ |
| 319 | } \ |
| 320 | static int mingw_main(c,v) |
Marius Storm-Olsen | e16c60d | 2009-05-31 18:15:22 +0200 | [diff] [blame] | 321 | |
| 322 | #ifndef NO_MINGW_REPLACE_READDIR |
| 323 | /* |
| 324 | * A replacement of readdir, to ensure that it reads the file type at |
| 325 | * the same time. This avoid extra unneeded lstats in git on MinGW |
| 326 | */ |
| 327 | #undef DT_UNKNOWN |
| 328 | #undef DT_DIR |
| 329 | #undef DT_REG |
| 330 | #undef DT_LNK |
| 331 | #define DT_UNKNOWN 0 |
| 332 | #define DT_DIR 1 |
| 333 | #define DT_REG 2 |
| 334 | #define DT_LNK 3 |
| 335 | |
| 336 | struct mingw_dirent |
| 337 | { |
| 338 | long d_ino; /* Always zero. */ |
| 339 | union { |
| 340 | unsigned short d_reclen; /* Always zero. */ |
| 341 | unsigned char d_type; /* Reimplementation adds this */ |
| 342 | }; |
| 343 | unsigned short d_namlen; /* Length of name in d_name. */ |
| 344 | char d_name[FILENAME_MAX]; /* File name. */ |
| 345 | }; |
| 346 | #define dirent mingw_dirent |
| 347 | #define readdir(x) mingw_readdir(x) |
| 348 | struct dirent *mingw_readdir(DIR *dir); |
| 349 | #endif // !NO_MINGW_REPLACE_READDIR |
Andrzej K. Haczewski | 44626dc | 2010-01-15 21:12:20 +0100 | [diff] [blame] | 350 | |
| 351 | /* |
| 352 | * Used by Pthread API implementation for Windows |
| 353 | */ |
| 354 | extern int err_win_to_posix(DWORD winerr); |