diff options
Diffstat (limited to 'compat')
-rw-r--r-- | compat/mingw.c | 13 | ||||
-rw-r--r-- | compat/mingw.h | 17 | ||||
-rw-r--r-- | compat/stat.c | 48 |
3 files changed, 75 insertions, 3 deletions
diff --git a/compat/mingw.c b/compat/mingw.c index 70f3191a4f..f74da235f5 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -681,7 +681,7 @@ int pipe(int filedes[2]) return -1; } filedes[1] = _open_osfhandle((int)h[1], O_NOINHERIT); - if (filedes[0] < 0) { + if (filedes[1] < 0) { close(filedes[0]); CloseHandle(h[1]); return -1; @@ -2128,3 +2128,14 @@ void mingw_startup() /* initialize Unicode console */ winansi_init(); } + +int uname(struct utsname *buf) +{ + DWORD v = GetVersion(); + memset(buf, 0, sizeof(*buf)); + strcpy(buf->sysname, "Windows"); + sprintf(buf->release, "%u.%u", v & 0xff, (v >> 8) & 0xff); + /* assuming NT variants only.. */ + sprintf(buf->version, "%u", (v >> 16) & 0x7fff); + return 0; +} diff --git a/compat/mingw.h b/compat/mingw.h index 5e499cfb71..738865c6c0 100644 --- a/compat/mingw.h +++ b/compat/mingw.h @@ -76,6 +76,14 @@ struct itimerval { }; #define ITIMER_REAL 0 +struct utsname { + char sysname[16]; + char nodename[1]; + char release[16]; + char version[16]; + char machine[1]; +}; + /* * sanitize preprocessor namespace polluted by Windows headers defining * macros which collide with git local versions @@ -98,8 +106,6 @@ static inline unsigned int alarm(unsigned int seconds) { return 0; } static inline int fsync(int fd) { return _commit(fd); } -static inline pid_t getppid(void) -{ return 1; } static inline void sync(void) {} static inline uid_t getuid(void) @@ -121,6 +127,12 @@ static inline int sigaddset(sigset_t *set, int signum) #define SIG_UNBLOCK 0 static inline int sigprocmask(int how, const sigset_t *set, sigset_t *oldset) { return 0; } +static inline pid_t getppid(void) +{ return 1; } +static inline pid_t getpgid(pid_t pid) +{ return pid == 0 ? getpid() : pid; } +static inline pid_t tcgetpgrp(int fd) +{ return getpid(); } /* * simple adaptors @@ -171,6 +183,7 @@ struct passwd *getpwuid(uid_t uid); int setitimer(int type, struct itimerval *in, struct itimerval *out); int sigaction(int sig, struct sigaction *in, struct sigaction *out); int link(const char *oldpath, const char *newpath); +int uname(struct utsname *buf); /* * replacements of existing functions diff --git a/compat/stat.c b/compat/stat.c new file mode 100644 index 0000000000..a2d3931cb7 --- /dev/null +++ b/compat/stat.c @@ -0,0 +1,48 @@ +#define _POSIX_C_SOURCE 200112L +#include <sys/stat.h> /* *stat, S_IS* */ +#include <sys/types.h> /* mode_t */ + +static inline mode_t mode_native_to_git(mode_t native_mode) +{ + mode_t perm_bits = native_mode & 07777; + if (S_ISREG(native_mode)) + return 0100000 | perm_bits; + if (S_ISDIR(native_mode)) + return 0040000 | perm_bits; + if (S_ISLNK(native_mode)) + return 0120000 | perm_bits; + if (S_ISBLK(native_mode)) + return 0060000 | perm_bits; + if (S_ISCHR(native_mode)) + return 0020000 | perm_bits; + if (S_ISFIFO(native_mode)) + return 0010000 | perm_bits; + if (S_ISSOCK(native_mode)) + return 0140000 | perm_bits; + /* Non-standard type bits were given. */ + return perm_bits; +} + +int git_stat(const char *path, struct stat *buf) +{ + int rc = stat(path, buf); + if (rc == 0) + buf->st_mode = mode_native_to_git(buf->st_mode); + return rc; +} + +int git_fstat(int fd, struct stat *buf) +{ + int rc = fstat(fd, buf); + if (rc == 0) + buf->st_mode = mode_native_to_git(buf->st_mode); + return rc; +} + +int git_lstat(const char *path, struct stat *buf) +{ + int rc = lstat(path, buf); + if (rc == 0) + buf->st_mode = mode_native_to_git(buf->st_mode); + return rc; +} |