]> asedeno.scripts.mit.edu Git - git.git/blob - compat/mingw.c
Windows: Implement gettimeofday().
[git.git] / compat / mingw.c
1 #include "../git-compat-util.h"
2
3 unsigned int _CRT_fmode = _O_BINARY;
4
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
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 {
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;
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
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
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
114 struct passwd *getpwuid(int uid)
115 {
116         static char user_name[100];
117         static struct passwd p;
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;
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 }