]>
Commit | Line | Data |
---|---|---|
f4626df5 JS |
1 | #include "../git-compat-util.h" |
2 | ||
3 | unsigned int _CRT_fmode = _O_BINARY; | |
4 | ||
3e4a1ba0 JS |
5 | #undef open |
6 | int mingw_open (const char *filename, int oflags, ...) | |
7 | { | |
8 | va_list args; | |
9 | unsigned mode; | |
10 | va_start(args, oflags); | |
11 | mode = va_arg(args, int); | |
12 | va_end(args); | |
13 | ||
14 | if (!strcmp(filename, "/dev/null")) | |
15 | filename = "nul"; | |
16 | int fd = open(filename, oflags, mode); | |
17 | if (fd < 0 && (oflags & O_CREAT) && errno == EACCES) { | |
18 | DWORD attrs = GetFileAttributes(filename); | |
19 | if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) | |
20 | errno = EISDIR; | |
21 | } | |
22 | return fd; | |
23 | } | |
24 | ||
f4626df5 JS |
25 | unsigned int sleep (unsigned int seconds) |
26 | { | |
27 | Sleep(seconds*1000); | |
28 | return 0; | |
29 | } | |
30 | ||
31 | int mkstemp(char *template) | |
32 | { | |
33 | char *filename = mktemp(template); | |
34 | if (filename == NULL) | |
35 | return -1; | |
36 | return open(filename, O_RDWR | O_CREAT, 0600); | |
37 | } | |
38 | ||
39 | int gettimeofday(struct timeval *tv, void *tz) | |
40 | { | |
a42a0c2e JS |
41 | SYSTEMTIME st; |
42 | struct tm tm; | |
43 | GetSystemTime(&st); | |
44 | tm.tm_year = st.wYear-1900; | |
45 | tm.tm_mon = st.wMonth-1; | |
46 | tm.tm_mday = st.wDay; | |
47 | tm.tm_hour = st.wHour; | |
48 | tm.tm_min = st.wMinute; | |
49 | tm.tm_sec = st.wSecond; | |
50 | tv->tv_sec = tm_to_time_t(&tm); | |
51 | if (tv->tv_sec < 0) | |
52 | return -1; | |
53 | tv->tv_usec = st.wMilliseconds*1000; | |
54 | return 0; | |
f4626df5 JS |
55 | } |
56 | ||
57 | int poll(struct pollfd *ufds, unsigned int nfds, int timeout) | |
58 | { | |
59 | return -1; | |
60 | } | |
61 | ||
62 | struct tm *gmtime_r(const time_t *timep, struct tm *result) | |
63 | { | |
64 | /* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */ | |
65 | memcpy(result, gmtime(timep), sizeof(struct tm)); | |
66 | return result; | |
67 | } | |
68 | ||
69 | struct tm *localtime_r(const time_t *timep, struct tm *result) | |
70 | { | |
71 | /* localtime() in MSVCRT.DLL is thread-safe, but not reentrant */ | |
72 | memcpy(result, localtime(timep), sizeof(struct tm)); | |
73 | return result; | |
74 | } | |
75 | ||
25fe217b JS |
76 | #undef getcwd |
77 | char *mingw_getcwd(char *pointer, int len) | |
78 | { | |
79 | int i; | |
80 | char *ret = getcwd(pointer, len); | |
81 | if (!ret) | |
82 | return ret; | |
83 | for (i = 0; pointer[i]; i++) | |
84 | if (pointer[i] == '\\') | |
85 | pointer[i] = '/'; | |
86 | return ret; | |
87 | } | |
88 | ||
ea9e98c3 JS |
89 | #undef rename |
90 | int mingw_rename(const char *pold, const char *pnew) | |
91 | { | |
92 | /* | |
93 | * Try native rename() first to get errno right. | |
94 | * It is based on MoveFile(), which cannot overwrite existing files. | |
95 | */ | |
96 | if (!rename(pold, pnew)) | |
97 | return 0; | |
98 | if (errno != EEXIST) | |
99 | return -1; | |
100 | if (MoveFileEx(pold, pnew, MOVEFILE_REPLACE_EXISTING)) | |
101 | return 0; | |
102 | /* TODO: translate more errors */ | |
103 | if (GetLastError() == ERROR_ACCESS_DENIED) { | |
104 | DWORD attrs = GetFileAttributes(pnew); | |
105 | if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY)) { | |
106 | errno = EISDIR; | |
107 | return -1; | |
108 | } | |
109 | } | |
110 | errno = EACCES; | |
111 | return -1; | |
112 | } | |
113 | ||
f4626df5 JS |
114 | struct passwd *getpwuid(int uid) |
115 | { | |
f7597aca | 116 | static char user_name[100]; |
f4626df5 | 117 | static struct passwd p; |
f7597aca JS |
118 | |
119 | DWORD len = sizeof(user_name); | |
120 | if (!GetUserName(user_name, &len)) | |
121 | return NULL; | |
122 | p.pw_name = user_name; | |
123 | p.pw_gecos = "unknown"; | |
124 | p.pw_dir = NULL; | |
f4626df5 JS |
125 | return &p; |
126 | } | |
127 | ||
128 | int setitimer(int type, struct itimerval *in, struct itimerval *out) | |
129 | { | |
130 | return -1; | |
131 | } | |
132 | ||
133 | int sigaction(int sig, struct sigaction *in, struct sigaction *out) | |
134 | { | |
135 | return -1; | |
136 | } |