Git fork

compat/mingw: split out POSIX-related bits

Split out POSIX-related bits from "compat/mingw.h" and "compat/msvc.h".
This is in preparation for splitting up "git-compat-utils.h" into a
header that provides POSIX-compatibility and a header that provides
common wrappers used by the Git project.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>

authored by

Patrick Steinhardt and committed by
Junio C Hamano
0b960a53 f93b2a04

+467 -453
+431
compat/mingw-posix.h
··· 1 + #ifndef COMPAT_MINGW_POSIX_H 2 + #define COMPAT_MINGW_POSIX_H 3 + 4 + #ifdef __MINGW64_VERSION_MAJOR 5 + #include <stdint.h> 6 + #include <wchar.h> 7 + typedef _sigset_t sigset_t; 8 + #endif 9 + #include <winsock2.h> 10 + #include <ws2tcpip.h> 11 + 12 + /* MinGW-w64 reports to have flockfile, but it does not actually have it. */ 13 + #ifdef __MINGW64_VERSION_MAJOR 14 + #undef _POSIX_THREAD_SAFE_FUNCTIONS 15 + #endif 16 + 17 + /* 18 + * things that are not available in header files 19 + */ 20 + 21 + typedef int uid_t; 22 + typedef int socklen_t; 23 + #ifndef __MINGW64_VERSION_MAJOR 24 + typedef int pid_t; 25 + #define hstrerror strerror 26 + #endif 27 + 28 + #define S_IFLNK 0120000 /* Symbolic link */ 29 + #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) 30 + #define S_ISSOCK(x) 0 31 + 32 + #ifndef S_IRWXG 33 + #define S_IRGRP 0 34 + #define S_IWGRP 0 35 + #define S_IXGRP 0 36 + #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) 37 + #endif 38 + #ifndef S_IRWXO 39 + #define S_IROTH 0 40 + #define S_IWOTH 0 41 + #define S_IXOTH 0 42 + #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) 43 + #endif 44 + 45 + #define S_ISUID 0004000 46 + #define S_ISGID 0002000 47 + #define S_ISVTX 0001000 48 + 49 + #define WIFEXITED(x) 1 50 + #define WIFSIGNALED(x) 0 51 + #define WEXITSTATUS(x) ((x) & 0xff) 52 + #define WTERMSIG(x) SIGTERM 53 + 54 + #ifndef EWOULDBLOCK 55 + #define EWOULDBLOCK EAGAIN 56 + #endif 57 + #ifndef ELOOP 58 + #define ELOOP EMLINK 59 + #endif 60 + #define SHUT_WR SD_SEND 61 + 62 + #define SIGHUP 1 63 + #define SIGQUIT 3 64 + #define SIGKILL 9 65 + #define SIGPIPE 13 66 + #define SIGALRM 14 67 + #define SIGCHLD 17 68 + 69 + #define F_GETFD 1 70 + #define F_SETFD 2 71 + #define FD_CLOEXEC 0x1 72 + 73 + #if !defined O_CLOEXEC && defined O_NOINHERIT 74 + #define O_CLOEXEC O_NOINHERIT 75 + #endif 76 + 77 + #ifndef EAFNOSUPPORT 78 + #define EAFNOSUPPORT WSAEAFNOSUPPORT 79 + #endif 80 + #ifndef ECONNABORTED 81 + #define ECONNABORTED WSAECONNABORTED 82 + #endif 83 + #ifndef ENOTSOCK 84 + #define ENOTSOCK WSAENOTSOCK 85 + #endif 86 + 87 + struct passwd { 88 + char *pw_name; 89 + char *pw_gecos; 90 + char *pw_dir; 91 + }; 92 + 93 + typedef void (__cdecl *sig_handler_t)(int); 94 + struct sigaction { 95 + sig_handler_t sa_handler; 96 + unsigned sa_flags; 97 + }; 98 + #define SA_RESTART 0 99 + 100 + struct itimerval { 101 + struct timeval it_value, it_interval; 102 + }; 103 + #define ITIMER_REAL 0 104 + 105 + struct utsname { 106 + char sysname[16]; 107 + char nodename[1]; 108 + char release[16]; 109 + char version[16]; 110 + char machine[1]; 111 + }; 112 + 113 + /* 114 + * sanitize preprocessor namespace polluted by Windows headers defining 115 + * macros which collide with git local versions 116 + */ 117 + #undef HELP_COMMAND /* from winuser.h */ 118 + 119 + /* 120 + * trivial stubs 121 + */ 122 + 123 + static inline int readlink(const char *path UNUSED, char *buf UNUSED, size_t bufsiz UNUSED) 124 + { errno = ENOSYS; return -1; } 125 + static inline int symlink(const char *oldpath UNUSED, const char *newpath UNUSED) 126 + { errno = ENOSYS; return -1; } 127 + static inline int fchmod(int fildes UNUSED, mode_t mode UNUSED) 128 + { errno = ENOSYS; return -1; } 129 + #ifndef __MINGW64_VERSION_MAJOR 130 + static inline pid_t fork(void) 131 + { errno = ENOSYS; return -1; } 132 + #endif 133 + static inline unsigned int alarm(unsigned int seconds UNUSED) 134 + { return 0; } 135 + static inline int fsync(int fd) 136 + { return _commit(fd); } 137 + static inline void sync(void) 138 + {} 139 + static inline uid_t getuid(void) 140 + { return 1; } 141 + static inline struct passwd *getpwnam(const char *name UNUSED) 142 + { return NULL; } 143 + static inline int fcntl(int fd UNUSED, int cmd, ...) 144 + { 145 + if (cmd == F_GETFD || cmd == F_SETFD) 146 + return 0; 147 + errno = EINVAL; 148 + return -1; 149 + } 150 + 151 + #define sigemptyset(x) (void)0 152 + static inline int sigaddset(sigset_t *set UNUSED, int signum UNUSED) 153 + { return 0; } 154 + #define SIG_BLOCK 0 155 + #define SIG_UNBLOCK 0 156 + static inline int sigprocmask(int how UNUSED, const sigset_t *set UNUSED, sigset_t *oldset UNUSED) 157 + { return 0; } 158 + static inline pid_t getppid(void) 159 + { return 1; } 160 + static inline pid_t getpgid(pid_t pid) 161 + { return pid == 0 ? getpid() : pid; } 162 + static inline pid_t tcgetpgrp(int fd UNUSED) 163 + { return getpid(); } 164 + 165 + /* 166 + * simple adaptors 167 + */ 168 + 169 + int mingw_mkdir(const char *path, int mode); 170 + #define mkdir mingw_mkdir 171 + 172 + #define WNOHANG 1 173 + pid_t waitpid(pid_t pid, int *status, int options); 174 + 175 + #define kill mingw_kill 176 + int mingw_kill(pid_t pid, int sig); 177 + 178 + #define locate_in_PATH mingw_locate_in_PATH 179 + char *mingw_locate_in_PATH(const char *cmd); 180 + 181 + /* 182 + * implementations of missing functions 183 + */ 184 + 185 + int pipe(int filedes[2]); 186 + unsigned int sleep (unsigned int seconds); 187 + int mkstemp(char *template); 188 + int gettimeofday(struct timeval *tv, void *tz); 189 + #ifndef __MINGW64_VERSION_MAJOR 190 + struct tm *gmtime_r(const time_t *timep, struct tm *result); 191 + struct tm *localtime_r(const time_t *timep, struct tm *result); 192 + #endif 193 + int getpagesize(void); /* defined in MinGW's libgcc.a */ 194 + struct passwd *getpwuid(uid_t uid); 195 + int setitimer(int type, struct itimerval *in, struct itimerval *out); 196 + int sigaction(int sig, struct sigaction *in, struct sigaction *out); 197 + int link(const char *oldpath, const char *newpath); 198 + int uname(struct utsname *buf); 199 + 200 + /* 201 + * replacements of existing functions 202 + */ 203 + 204 + int mingw_unlink(const char *pathname); 205 + #define unlink mingw_unlink 206 + 207 + int mingw_rmdir(const char *path); 208 + #define rmdir mingw_rmdir 209 + 210 + int mingw_open (const char *filename, int oflags, ...); 211 + #define open mingw_open 212 + #undef OPEN_RETURNS_EINTR 213 + 214 + int mingw_fgetc(FILE *stream); 215 + #define fgetc mingw_fgetc 216 + 217 + FILE *mingw_fopen (const char *filename, const char *otype); 218 + #define fopen mingw_fopen 219 + 220 + FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); 221 + #define freopen mingw_freopen 222 + 223 + int mingw_fflush(FILE *stream); 224 + #define fflush mingw_fflush 225 + 226 + ssize_t mingw_write(int fd, const void *buf, size_t len); 227 + #define write mingw_write 228 + 229 + int mingw_access(const char *filename, int mode); 230 + #undef access 231 + #define access mingw_access 232 + 233 + int mingw_chdir(const char *dirname); 234 + #define chdir mingw_chdir 235 + 236 + int mingw_chmod(const char *filename, int mode); 237 + #define chmod mingw_chmod 238 + 239 + char *mingw_mktemp(char *template); 240 + #define mktemp mingw_mktemp 241 + 242 + char *mingw_getcwd(char *pointer, int len); 243 + #define getcwd mingw_getcwd 244 + 245 + #ifdef NO_UNSETENV 246 + #error "NO_UNSETENV is incompatible with the Windows-specific startup code!" 247 + #endif 248 + 249 + /* 250 + * We bind *env() routines (even the mingw_ ones) to private mingw_ versions. 251 + * These talk to the CRT using UNICODE/wchar_t, but maintain the original 252 + * narrow-char API. 253 + * 254 + * Note that the MSCRT maintains both ANSI (getenv()) and UNICODE (_wgetenv()) 255 + * routines and stores both versions of each environment variable in parallel 256 + * (and secretly updates both when you set one or the other), but it uses CP_ACP 257 + * to do the conversion rather than CP_UTF8. 258 + * 259 + * Since everything in the git code base is UTF8, we define the mingw_ routines 260 + * to access the CRT using the UNICODE routines and manually convert them to 261 + * UTF8. This also avoids round-trip problems. 262 + * 263 + * This also helps with our linkage, since "_wenviron" is publicly exported 264 + * from the CRT. But to access "_environ" we would have to statically link 265 + * to the CRT (/MT). 266 + * 267 + * We require NO_SETENV (and let gitsetenv() call our mingw_putenv). 268 + */ 269 + #define getenv mingw_getenv 270 + #define putenv mingw_putenv 271 + #define unsetenv mingw_putenv 272 + char *mingw_getenv(const char *name); 273 + int mingw_putenv(const char *name); 274 + 275 + int mingw_gethostname(char *host, int namelen); 276 + #define gethostname mingw_gethostname 277 + 278 + struct hostent *mingw_gethostbyname(const char *host); 279 + #define gethostbyname mingw_gethostbyname 280 + 281 + int mingw_getaddrinfo(const char *node, const char *service, 282 + const struct addrinfo *hints, struct addrinfo **res); 283 + #define getaddrinfo mingw_getaddrinfo 284 + 285 + int mingw_socket(int domain, int type, int protocol); 286 + #define socket mingw_socket 287 + 288 + int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); 289 + #define connect mingw_connect 290 + 291 + int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz); 292 + #define bind mingw_bind 293 + 294 + int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen); 295 + #define setsockopt mingw_setsockopt 296 + 297 + int mingw_shutdown(int sockfd, int how); 298 + #define shutdown mingw_shutdown 299 + 300 + int mingw_listen(int sockfd, int backlog); 301 + #define listen mingw_listen 302 + 303 + int mingw_accept(int sockfd, struct sockaddr *sa, socklen_t *sz); 304 + #define accept mingw_accept 305 + 306 + int mingw_rename(const char*, const char*); 307 + #define rename mingw_rename 308 + 309 + #if defined(USE_WIN32_MMAP) || defined(_MSC_VER) 310 + int mingw_getpagesize(void); 311 + #define getpagesize mingw_getpagesize 312 + #endif 313 + 314 + int win32_fsync_no_flush(int fd); 315 + #define fsync_no_flush win32_fsync_no_flush 316 + 317 + #define FSYNC_COMPONENTS_PLATFORM_DEFAULT (FSYNC_COMPONENTS_DEFAULT | FSYNC_COMPONENT_LOOSE_OBJECT) 318 + #define FSYNC_METHOD_DEFAULT (FSYNC_METHOD_BATCH) 319 + 320 + struct rlimit { 321 + unsigned int rlim_cur; 322 + }; 323 + #define RLIMIT_NOFILE 0 324 + 325 + static inline int getrlimit(int resource, struct rlimit *rlp) 326 + { 327 + if (resource != RLIMIT_NOFILE) { 328 + errno = EINVAL; 329 + return -1; 330 + } 331 + 332 + rlp->rlim_cur = 2048; 333 + return 0; 334 + } 335 + 336 + /* 337 + * Use mingw specific stat()/lstat()/fstat() implementations on Windows, 338 + * including our own struct stat with 64 bit st_size and nanosecond-precision 339 + * file times. 340 + */ 341 + #ifndef __MINGW64_VERSION_MAJOR 342 + #define off_t off64_t 343 + #define lseek _lseeki64 344 + #ifndef _MSC_VER 345 + struct timespec { 346 + time_t tv_sec; 347 + long tv_nsec; 348 + }; 349 + #endif 350 + #endif 351 + 352 + struct mingw_stat { 353 + _dev_t st_dev; 354 + _ino_t st_ino; 355 + _mode_t st_mode; 356 + short st_nlink; 357 + short st_uid; 358 + short st_gid; 359 + _dev_t st_rdev; 360 + off64_t st_size; 361 + struct timespec st_atim; 362 + struct timespec st_mtim; 363 + struct timespec st_ctim; 364 + }; 365 + 366 + #define st_atime st_atim.tv_sec 367 + #define st_mtime st_mtim.tv_sec 368 + #define st_ctime st_ctim.tv_sec 369 + 370 + #ifdef stat 371 + #undef stat 372 + #endif 373 + #define stat mingw_stat 374 + int mingw_lstat(const char *file_name, struct stat *buf); 375 + int mingw_stat(const char *file_name, struct stat *buf); 376 + int mingw_fstat(int fd, struct stat *buf); 377 + #ifdef fstat 378 + #undef fstat 379 + #endif 380 + #define fstat mingw_fstat 381 + #ifdef lstat 382 + #undef lstat 383 + #endif 384 + #define lstat mingw_lstat 385 + 386 + 387 + int mingw_utime(const char *file_name, const struct utimbuf *times); 388 + #define utime mingw_utime 389 + size_t mingw_strftime(char *s, size_t max, 390 + const char *format, const struct tm *tm); 391 + #define strftime mingw_strftime 392 + 393 + pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env, 394 + const char *dir, 395 + int fhin, int fhout, int fherr); 396 + int mingw_execvp(const char *cmd, char *const *argv); 397 + #define execvp mingw_execvp 398 + int mingw_execv(const char *cmd, char *const *argv); 399 + #define execv mingw_execv 400 + 401 + static inline unsigned int git_ntohl(unsigned int x) 402 + { return (unsigned int)ntohl(x); } 403 + #define ntohl git_ntohl 404 + 405 + sig_handler_t mingw_signal(int sig, sig_handler_t handler); 406 + #define signal mingw_signal 407 + 408 + int mingw_raise(int sig); 409 + #define raise mingw_raise 410 + 411 + /* 412 + * ANSI emulation wrappers 413 + */ 414 + 415 + int winansi_isatty(int fd); 416 + #define isatty winansi_isatty 417 + 418 + int winansi_dup2(int oldfd, int newfd); 419 + #define dup2 winansi_dup2 420 + 421 + void winansi_init(void); 422 + HANDLE winansi_get_osfhandle(int fd); 423 + 424 + #if !defined(__MINGW64_VERSION_MAJOR) && (!defined(_MSC_VER) || _MSC_VER < 1800) 425 + #define PRIuMAX "I64u" 426 + #define PRId64 "I64d" 427 + #else 428 + #include <inttypes.h> 429 + #endif 430 + 431 + #endif /* COMPAT_MINGW_POSIX_H */
+1 -425
compat/mingw.h
··· 1 - #ifdef __MINGW64_VERSION_MAJOR 2 - #include <stdint.h> 3 - #include <wchar.h> 4 - typedef _sigset_t sigset_t; 5 - #endif 6 - #include <winsock2.h> 7 - #include <ws2tcpip.h> 8 - 9 - /* MinGW-w64 reports to have flockfile, but it does not actually have it. */ 10 - #ifdef __MINGW64_VERSION_MAJOR 11 - #undef _POSIX_THREAD_SAFE_FUNCTIONS 12 - #endif 1 + #include "mingw-posix.h" 13 2 14 3 struct config_context; 15 4 int mingw_core_config(const char *var, const char *value, 16 5 const struct config_context *ctx, void *cb); 17 6 #define platform_core_config mingw_core_config 18 7 19 - /* 20 - * things that are not available in header files 21 - */ 22 - 23 - typedef int uid_t; 24 - typedef int socklen_t; 25 - #ifndef __MINGW64_VERSION_MAJOR 26 - typedef int pid_t; 27 - #define hstrerror strerror 28 - #endif 29 - 30 - #define S_IFLNK 0120000 /* Symbolic link */ 31 - #define S_ISLNK(x) (((x) & S_IFMT) == S_IFLNK) 32 - #define S_ISSOCK(x) 0 33 - 34 - #ifndef S_IRWXG 35 - #define S_IRGRP 0 36 - #define S_IWGRP 0 37 - #define S_IXGRP 0 38 - #define S_IRWXG (S_IRGRP | S_IWGRP | S_IXGRP) 39 - #endif 40 - #ifndef S_IRWXO 41 - #define S_IROTH 0 42 - #define S_IWOTH 0 43 - #define S_IXOTH 0 44 - #define S_IRWXO (S_IROTH | S_IWOTH | S_IXOTH) 45 - #endif 46 - 47 - #define S_ISUID 0004000 48 - #define S_ISGID 0002000 49 - #define S_ISVTX 0001000 50 - 51 - #define WIFEXITED(x) 1 52 - #define WIFSIGNALED(x) 0 53 - #define WEXITSTATUS(x) ((x) & 0xff) 54 - #define WTERMSIG(x) SIGTERM 55 - 56 - #ifndef EWOULDBLOCK 57 - #define EWOULDBLOCK EAGAIN 58 - #endif 59 - #ifndef ELOOP 60 - #define ELOOP EMLINK 61 - #endif 62 - #define SHUT_WR SD_SEND 63 - 64 - #define SIGHUP 1 65 - #define SIGQUIT 3 66 - #define SIGKILL 9 67 - #define SIGPIPE 13 68 - #define SIGALRM 14 69 - #define SIGCHLD 17 70 - 71 - #define F_GETFD 1 72 - #define F_SETFD 2 73 - #define FD_CLOEXEC 0x1 74 - 75 - #if !defined O_CLOEXEC && defined O_NOINHERIT 76 - #define O_CLOEXEC O_NOINHERIT 77 - #endif 78 - 79 - #ifndef EAFNOSUPPORT 80 - #define EAFNOSUPPORT WSAEAFNOSUPPORT 81 - #endif 82 - #ifndef ECONNABORTED 83 - #define ECONNABORTED WSAECONNABORTED 84 - #endif 85 - #ifndef ENOTSOCK 86 - #define ENOTSOCK WSAENOTSOCK 87 - #endif 88 - 89 - struct passwd { 90 - char *pw_name; 91 - char *pw_gecos; 92 - char *pw_dir; 93 - }; 94 - 95 - typedef void (__cdecl *sig_handler_t)(int); 96 - struct sigaction { 97 - sig_handler_t sa_handler; 98 - unsigned sa_flags; 99 - }; 100 - #define SA_RESTART 0 101 - 102 - struct itimerval { 103 - struct timeval it_value, it_interval; 104 - }; 105 - #define ITIMER_REAL 0 106 - 107 - struct utsname { 108 - char sysname[16]; 109 - char nodename[1]; 110 - char release[16]; 111 - char version[16]; 112 - char machine[1]; 113 - }; 114 - 115 - /* 116 - * sanitize preprocessor namespace polluted by Windows headers defining 117 - * macros which collide with git local versions 118 - */ 119 - #undef HELP_COMMAND /* from winuser.h */ 120 - 121 - /* 122 - * trivial stubs 123 - */ 124 - 125 - static inline int readlink(const char *path UNUSED, char *buf UNUSED, size_t bufsiz UNUSED) 126 - { errno = ENOSYS; return -1; } 127 - static inline int symlink(const char *oldpath UNUSED, const char *newpath UNUSED) 128 - { errno = ENOSYS; return -1; } 129 - static inline int fchmod(int fildes UNUSED, mode_t mode UNUSED) 130 - { errno = ENOSYS; return -1; } 131 - #ifndef __MINGW64_VERSION_MAJOR 132 - static inline pid_t fork(void) 133 - { errno = ENOSYS; return -1; } 134 - #endif 135 - static inline unsigned int alarm(unsigned int seconds UNUSED) 136 - { return 0; } 137 - static inline int fsync(int fd) 138 - { return _commit(fd); } 139 - static inline void sync(void) 140 - {} 141 - static inline uid_t getuid(void) 142 - { return 1; } 143 - static inline struct passwd *getpwnam(const char *name UNUSED) 144 - { return NULL; } 145 - static inline int fcntl(int fd UNUSED, int cmd, ...) 146 - { 147 - if (cmd == F_GETFD || cmd == F_SETFD) 148 - return 0; 149 - errno = EINVAL; 150 - return -1; 151 - } 152 - 153 - #define sigemptyset(x) (void)0 154 - static inline int sigaddset(sigset_t *set UNUSED, int signum UNUSED) 155 - { return 0; } 156 - #define SIG_BLOCK 0 157 - #define SIG_UNBLOCK 0 158 - static inline int sigprocmask(int how UNUSED, const sigset_t *set UNUSED, sigset_t *oldset UNUSED) 159 - { return 0; } 160 - static inline pid_t getppid(void) 161 - { return 1; } 162 - static inline pid_t getpgid(pid_t pid) 163 - { return pid == 0 ? getpid() : pid; } 164 - static inline pid_t tcgetpgrp(int fd UNUSED) 165 - { return getpid(); } 166 - 167 - /* 168 - * simple adaptors 169 - */ 170 - 171 - int mingw_mkdir(const char *path, int mode); 172 - #define mkdir mingw_mkdir 173 - 174 - #define WNOHANG 1 175 - pid_t waitpid(pid_t pid, int *status, int options); 176 - 177 - #define kill mingw_kill 178 - int mingw_kill(pid_t pid, int sig); 179 - 180 - #define locate_in_PATH mingw_locate_in_PATH 181 - char *mingw_locate_in_PATH(const char *cmd); 182 - 183 8 #ifndef NO_OPENSSL 184 9 #include <openssl/ssl.h> 185 10 static inline int mingw_SSL_set_fd(SSL *ssl, int fd) ··· 202 27 #endif 203 28 204 29 /* 205 - * implementations of missing functions 206 - */ 207 - 208 - int pipe(int filedes[2]); 209 - unsigned int sleep (unsigned int seconds); 210 - int mkstemp(char *template); 211 - int gettimeofday(struct timeval *tv, void *tz); 212 - #ifndef __MINGW64_VERSION_MAJOR 213 - struct tm *gmtime_r(const time_t *timep, struct tm *result); 214 - struct tm *localtime_r(const time_t *timep, struct tm *result); 215 - #endif 216 - int getpagesize(void); /* defined in MinGW's libgcc.a */ 217 - struct passwd *getpwuid(uid_t uid); 218 - int setitimer(int type, struct itimerval *in, struct itimerval *out); 219 - int sigaction(int sig, struct sigaction *in, struct sigaction *out); 220 - int link(const char *oldpath, const char *newpath); 221 - int uname(struct utsname *buf); 222 - 223 - /* 224 - * replacements of existing functions 225 - */ 226 - 227 - int mingw_unlink(const char *pathname); 228 - #define unlink mingw_unlink 229 - 230 - int mingw_rmdir(const char *path); 231 - #define rmdir mingw_rmdir 232 - 233 - int mingw_open (const char *filename, int oflags, ...); 234 - #define open mingw_open 235 - #undef OPEN_RETURNS_EINTR 236 - 237 - int mingw_fgetc(FILE *stream); 238 - #define fgetc mingw_fgetc 239 - 240 - FILE *mingw_fopen (const char *filename, const char *otype); 241 - #define fopen mingw_fopen 242 - 243 - FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream); 244 - #define freopen mingw_freopen 245 - 246 - int mingw_fflush(FILE *stream); 247 - #define fflush mingw_fflush 248 - 249 - ssize_t mingw_write(int fd, const void *buf, size_t len); 250 - #define write mingw_write 251 - 252 - int mingw_access(const char *filename, int mode); 253 - #undef access 254 - #define access mingw_access 255 - 256 - int mingw_chdir(const char *dirname); 257 - #define chdir mingw_chdir 258 - 259 - int mingw_chmod(const char *filename, int mode); 260 - #define chmod mingw_chmod 261 - 262 - char *mingw_mktemp(char *template); 263 - #define mktemp mingw_mktemp 264 - 265 - char *mingw_getcwd(char *pointer, int len); 266 - #define getcwd mingw_getcwd 267 - 268 - #ifdef NO_UNSETENV 269 - #error "NO_UNSETENV is incompatible with the Windows-specific startup code!" 270 - #endif 271 - 272 - /* 273 - * We bind *env() routines (even the mingw_ ones) to private mingw_ versions. 274 - * These talk to the CRT using UNICODE/wchar_t, but maintain the original 275 - * narrow-char API. 276 - * 277 - * Note that the MSCRT maintains both ANSI (getenv()) and UNICODE (_wgetenv()) 278 - * routines and stores both versions of each environment variable in parallel 279 - * (and secretly updates both when you set one or the other), but it uses CP_ACP 280 - * to do the conversion rather than CP_UTF8. 281 - * 282 - * Since everything in the git code base is UTF8, we define the mingw_ routines 283 - * to access the CRT using the UNICODE routines and manually convert them to 284 - * UTF8. This also avoids round-trip problems. 285 - * 286 - * This also helps with our linkage, since "_wenviron" is publicly exported 287 - * from the CRT. But to access "_environ" we would have to statically link 288 - * to the CRT (/MT). 289 - * 290 - * We require NO_SETENV (and let gitsetenv() call our mingw_putenv). 291 - */ 292 - #define getenv mingw_getenv 293 - #define putenv mingw_putenv 294 - #define unsetenv mingw_putenv 295 - char *mingw_getenv(const char *name); 296 - int mingw_putenv(const char *name); 297 - 298 - int mingw_gethostname(char *host, int namelen); 299 - #define gethostname mingw_gethostname 300 - 301 - struct hostent *mingw_gethostbyname(const char *host); 302 - #define gethostbyname mingw_gethostbyname 303 - 304 - int mingw_getaddrinfo(const char *node, const char *service, 305 - const struct addrinfo *hints, struct addrinfo **res); 306 - #define getaddrinfo mingw_getaddrinfo 307 - 308 - int mingw_socket(int domain, int type, int protocol); 309 - #define socket mingw_socket 310 - 311 - int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz); 312 - #define connect mingw_connect 313 - 314 - int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz); 315 - #define bind mingw_bind 316 - 317 - int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen); 318 - #define setsockopt mingw_setsockopt 319 - 320 - int mingw_shutdown(int sockfd, int how); 321 - #define shutdown mingw_shutdown 322 - 323 - int mingw_listen(int sockfd, int backlog); 324 - #define listen mingw_listen 325 - 326 - int mingw_accept(int sockfd, struct sockaddr *sa, socklen_t *sz); 327 - #define accept mingw_accept 328 - 329 - int mingw_rename(const char*, const char*); 330 - #define rename mingw_rename 331 - 332 - #if defined(USE_WIN32_MMAP) || defined(_MSC_VER) 333 - int mingw_getpagesize(void); 334 - #define getpagesize mingw_getpagesize 335 - #endif 336 - 337 - int win32_fsync_no_flush(int fd); 338 - #define fsync_no_flush win32_fsync_no_flush 339 - 340 - #define FSYNC_COMPONENTS_PLATFORM_DEFAULT (FSYNC_COMPONENTS_DEFAULT | FSYNC_COMPONENT_LOOSE_OBJECT) 341 - #define FSYNC_METHOD_DEFAULT (FSYNC_METHOD_BATCH) 342 - 343 - struct rlimit { 344 - unsigned int rlim_cur; 345 - }; 346 - #define RLIMIT_NOFILE 0 347 - 348 - static inline int getrlimit(int resource, struct rlimit *rlp) 349 - { 350 - if (resource != RLIMIT_NOFILE) { 351 - errno = EINVAL; 352 - return -1; 353 - } 354 - 355 - rlp->rlim_cur = 2048; 356 - return 0; 357 - } 358 - 359 - /* 360 - * Use mingw specific stat()/lstat()/fstat() implementations on Windows, 361 - * including our own struct stat with 64 bit st_size and nanosecond-precision 362 - * file times. 363 - */ 364 - #ifndef __MINGW64_VERSION_MAJOR 365 - #define off_t off64_t 366 - #define lseek _lseeki64 367 - #ifndef _MSC_VER 368 - struct timespec { 369 - time_t tv_sec; 370 - long tv_nsec; 371 - }; 372 - #endif 373 - #endif 374 - 375 - struct mingw_stat { 376 - _dev_t st_dev; 377 - _ino_t st_ino; 378 - _mode_t st_mode; 379 - short st_nlink; 380 - short st_uid; 381 - short st_gid; 382 - _dev_t st_rdev; 383 - off64_t st_size; 384 - struct timespec st_atim; 385 - struct timespec st_mtim; 386 - struct timespec st_ctim; 387 - }; 388 - 389 - #define st_atime st_atim.tv_sec 390 - #define st_mtime st_mtim.tv_sec 391 - #define st_ctime st_ctim.tv_sec 392 - 393 - #ifdef stat 394 - #undef stat 395 - #endif 396 - #define stat mingw_stat 397 - int mingw_lstat(const char *file_name, struct stat *buf); 398 - int mingw_stat(const char *file_name, struct stat *buf); 399 - int mingw_fstat(int fd, struct stat *buf); 400 - #ifdef fstat 401 - #undef fstat 402 - #endif 403 - #define fstat mingw_fstat 404 - #ifdef lstat 405 - #undef lstat 406 - #endif 407 - #define lstat mingw_lstat 408 - 409 - 410 - int mingw_utime(const char *file_name, const struct utimbuf *times); 411 - #define utime mingw_utime 412 - size_t mingw_strftime(char *s, size_t max, 413 - const char *format, const struct tm *tm); 414 - #define strftime mingw_strftime 415 - 416 - pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **env, 417 - const char *dir, 418 - int fhin, int fhout, int fherr); 419 - int mingw_execvp(const char *cmd, char *const *argv); 420 - #define execvp mingw_execvp 421 - int mingw_execv(const char *cmd, char *const *argv); 422 - #define execv mingw_execv 423 - 424 - static inline unsigned int git_ntohl(unsigned int x) 425 - { return (unsigned int)ntohl(x); } 426 - #define ntohl git_ntohl 427 - 428 - sig_handler_t mingw_signal(int sig, sig_handler_t handler); 429 - #define signal mingw_signal 430 - 431 - int mingw_raise(int sig); 432 - #define raise mingw_raise 433 - 434 - /* 435 - * ANSI emulation wrappers 436 - */ 437 - 438 - int winansi_isatty(int fd); 439 - #define isatty winansi_isatty 440 - 441 - int winansi_dup2(int oldfd, int newfd); 442 - #define dup2 winansi_dup2 443 - 444 - void winansi_init(void); 445 - HANDLE winansi_get_osfhandle(int fd); 446 - 447 - /* 448 30 * git specific compatibility 449 31 */ 450 32 ··· 457 39 #define PATH_SEP ';' 458 40 char *mingw_query_user_email(void); 459 41 #define query_user_email mingw_query_user_email 460 - #if !defined(__MINGW64_VERSION_MAJOR) && (!defined(_MSC_VER) || _MSC_VER < 1800) 461 - #define PRIuMAX "I64u" 462 - #define PRId64 "I64d" 463 - #else 464 - #include <inttypes.h> 465 - #endif 466 42 467 43 /** 468 44 * Verifies that the specified path is owned by the user running the
+33
compat/msvc-posix.h
··· 1 + #ifndef COMPAT_MSVC_POSIX_H 2 + #define COMPAT_MSVC_POSIX_H 3 + 4 + #include <direct.h> 5 + #include <process.h> 6 + #include <malloc.h> 7 + #include <io.h> 8 + 9 + #pragma warning(disable: 4018) /* signed/unsigned comparison */ 10 + #pragma warning(disable: 4244) /* type conversion, possible loss of data */ 11 + #pragma warning(disable: 4090) /* 'function' : different 'const' qualifiers (ALLOC_GROW etc.)*/ 12 + 13 + /* porting function */ 14 + #define inline __inline 15 + #define __inline__ __inline 16 + #define __attribute__(x) 17 + #define strcasecmp _stricmp 18 + #define strncasecmp _strnicmp 19 + #define ftruncate _chsize 20 + #define strtoull _strtoui64 21 + #define strtoll _strtoi64 22 + 23 + #undef ERROR 24 + 25 + #define ftello _ftelli64 26 + 27 + typedef int sigset_t; 28 + /* open for reading, writing, or both (not in fcntl.h) */ 29 + #define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR) 30 + 31 + #include "mingw-posix.h" 32 + 33 + #endif /* COMPAT_MSVC_POSIX_H */
+2 -28
compat/msvc.h
··· 1 1 #ifndef __MSVC__HEAD 2 2 #define __MSVC__HEAD 3 3 4 - #include <direct.h> 5 - #include <process.h> 6 - #include <malloc.h> 7 - #include <io.h> 8 - 9 - #pragma warning(disable: 4018) /* signed/unsigned comparison */ 10 - #pragma warning(disable: 4244) /* type conversion, possible loss of data */ 11 - #pragma warning(disable: 4090) /* 'function' : different 'const' qualifiers (ALLOC_GROW etc.)*/ 12 - 13 - /* porting function */ 14 - #define inline __inline 15 - #define __inline__ __inline 16 - #define __attribute__(x) 17 - #define strcasecmp _stricmp 18 - #define strncasecmp _strnicmp 19 - #define ftruncate _chsize 20 - #define strtoull _strtoui64 21 - #define strtoll _strtoi64 22 - 23 - #undef ERROR 24 - 25 - #define ftello _ftelli64 26 - 27 - typedef int sigset_t; 28 - /* open for reading, writing, or both (not in fcntl.h) */ 29 - #define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR) 30 - 31 - #include "compat/mingw.h" 4 + #include "msvc-posix.h" 5 + #include "mingw.h" 32 6 33 7 #endif