Git 2.8-rc2
[git] / compat / mingw.c
1 #include "../git-compat-util.h"
2 #include "win32.h"
3 #include <conio.h>
4 #include <wchar.h>
5 #include "../strbuf.h"
6 #include "../run-command.h"
7 #include "../cache.h"
8
9 #define HCAST(type, handle) ((type)(intptr_t)handle)
10
11 static const int delay[] = { 0, 1, 10, 20, 40 };
12
13 int err_win_to_posix(DWORD winerr)
14 {
15         int error = ENOSYS;
16         switch(winerr) {
17         case ERROR_ACCESS_DENIED: error = EACCES; break;
18         case ERROR_ACCOUNT_DISABLED: error = EACCES; break;
19         case ERROR_ACCOUNT_RESTRICTION: error = EACCES; break;
20         case ERROR_ALREADY_ASSIGNED: error = EBUSY; break;
21         case ERROR_ALREADY_EXISTS: error = EEXIST; break;
22         case ERROR_ARITHMETIC_OVERFLOW: error = ERANGE; break;
23         case ERROR_BAD_COMMAND: error = EIO; break;
24         case ERROR_BAD_DEVICE: error = ENODEV; break;
25         case ERROR_BAD_DRIVER_LEVEL: error = ENXIO; break;
26         case ERROR_BAD_EXE_FORMAT: error = ENOEXEC; break;
27         case ERROR_BAD_FORMAT: error = ENOEXEC; break;
28         case ERROR_BAD_LENGTH: error = EINVAL; break;
29         case ERROR_BAD_PATHNAME: error = ENOENT; break;
30         case ERROR_BAD_PIPE: error = EPIPE; break;
31         case ERROR_BAD_UNIT: error = ENODEV; break;
32         case ERROR_BAD_USERNAME: error = EINVAL; break;
33         case ERROR_BROKEN_PIPE: error = EPIPE; break;
34         case ERROR_BUFFER_OVERFLOW: error = ENAMETOOLONG; break;
35         case ERROR_BUSY: error = EBUSY; break;
36         case ERROR_BUSY_DRIVE: error = EBUSY; break;
37         case ERROR_CALL_NOT_IMPLEMENTED: error = ENOSYS; break;
38         case ERROR_CANNOT_MAKE: error = EACCES; break;
39         case ERROR_CANTOPEN: error = EIO; break;
40         case ERROR_CANTREAD: error = EIO; break;
41         case ERROR_CANTWRITE: error = EIO; break;
42         case ERROR_CRC: error = EIO; break;
43         case ERROR_CURRENT_DIRECTORY: error = EACCES; break;
44         case ERROR_DEVICE_IN_USE: error = EBUSY; break;
45         case ERROR_DEV_NOT_EXIST: error = ENODEV; break;
46         case ERROR_DIRECTORY: error = EINVAL; break;
47         case ERROR_DIR_NOT_EMPTY: error = ENOTEMPTY; break;
48         case ERROR_DISK_CHANGE: error = EIO; break;
49         case ERROR_DISK_FULL: error = ENOSPC; break;
50         case ERROR_DRIVE_LOCKED: error = EBUSY; break;
51         case ERROR_ENVVAR_NOT_FOUND: error = EINVAL; break;
52         case ERROR_EXE_MARKED_INVALID: error = ENOEXEC; break;
53         case ERROR_FILENAME_EXCED_RANGE: error = ENAMETOOLONG; break;
54         case ERROR_FILE_EXISTS: error = EEXIST; break;
55         case ERROR_FILE_INVALID: error = ENODEV; break;
56         case ERROR_FILE_NOT_FOUND: error = ENOENT; break;
57         case ERROR_GEN_FAILURE: error = EIO; break;
58         case ERROR_HANDLE_DISK_FULL: error = ENOSPC; break;
59         case ERROR_INSUFFICIENT_BUFFER: error = ENOMEM; break;
60         case ERROR_INVALID_ACCESS: error = EACCES; break;
61         case ERROR_INVALID_ADDRESS: error = EFAULT; break;
62         case ERROR_INVALID_BLOCK: error = EFAULT; break;
63         case ERROR_INVALID_DATA: error = EINVAL; break;
64         case ERROR_INVALID_DRIVE: error = ENODEV; break;
65         case ERROR_INVALID_EXE_SIGNATURE: error = ENOEXEC; break;
66         case ERROR_INVALID_FLAGS: error = EINVAL; break;
67         case ERROR_INVALID_FUNCTION: error = ENOSYS; break;
68         case ERROR_INVALID_HANDLE: error = EBADF; break;
69         case ERROR_INVALID_LOGON_HOURS: error = EACCES; break;
70         case ERROR_INVALID_NAME: error = EINVAL; break;
71         case ERROR_INVALID_OWNER: error = EINVAL; break;
72         case ERROR_INVALID_PARAMETER: error = EINVAL; break;
73         case ERROR_INVALID_PASSWORD: error = EPERM; break;
74         case ERROR_INVALID_PRIMARY_GROUP: error = EINVAL; break;
75         case ERROR_INVALID_SIGNAL_NUMBER: error = EINVAL; break;
76         case ERROR_INVALID_TARGET_HANDLE: error = EIO; break;
77         case ERROR_INVALID_WORKSTATION: error = EACCES; break;
78         case ERROR_IO_DEVICE: error = EIO; break;
79         case ERROR_IO_INCOMPLETE: error = EINTR; break;
80         case ERROR_LOCKED: error = EBUSY; break;
81         case ERROR_LOCK_VIOLATION: error = EACCES; break;
82         case ERROR_LOGON_FAILURE: error = EACCES; break;
83         case ERROR_MAPPED_ALIGNMENT: error = EINVAL; break;
84         case ERROR_META_EXPANSION_TOO_LONG: error = E2BIG; break;
85         case ERROR_MORE_DATA: error = EPIPE; break;
86         case ERROR_NEGATIVE_SEEK: error = ESPIPE; break;
87         case ERROR_NOACCESS: error = EFAULT; break;
88         case ERROR_NONE_MAPPED: error = EINVAL; break;
89         case ERROR_NOT_ENOUGH_MEMORY: error = ENOMEM; break;
90         case ERROR_NOT_READY: error = EAGAIN; break;
91         case ERROR_NOT_SAME_DEVICE: error = EXDEV; break;
92         case ERROR_NO_DATA: error = EPIPE; break;
93         case ERROR_NO_MORE_SEARCH_HANDLES: error = EIO; break;
94         case ERROR_NO_PROC_SLOTS: error = EAGAIN; break;
95         case ERROR_NO_SUCH_PRIVILEGE: error = EACCES; break;
96         case ERROR_OPEN_FAILED: error = EIO; break;
97         case ERROR_OPEN_FILES: error = EBUSY; break;
98         case ERROR_OPERATION_ABORTED: error = EINTR; break;
99         case ERROR_OUTOFMEMORY: error = ENOMEM; break;
100         case ERROR_PASSWORD_EXPIRED: error = EACCES; break;
101         case ERROR_PATH_BUSY: error = EBUSY; break;
102         case ERROR_PATH_NOT_FOUND: error = ENOENT; break;
103         case ERROR_PIPE_BUSY: error = EBUSY; break;
104         case ERROR_PIPE_CONNECTED: error = EPIPE; break;
105         case ERROR_PIPE_LISTENING: error = EPIPE; break;
106         case ERROR_PIPE_NOT_CONNECTED: error = EPIPE; break;
107         case ERROR_PRIVILEGE_NOT_HELD: error = EACCES; break;
108         case ERROR_READ_FAULT: error = EIO; break;
109         case ERROR_SEEK: error = EIO; break;
110         case ERROR_SEEK_ON_DEVICE: error = ESPIPE; break;
111         case ERROR_SHARING_BUFFER_EXCEEDED: error = ENFILE; break;
112         case ERROR_SHARING_VIOLATION: error = EACCES; break;
113         case ERROR_STACK_OVERFLOW: error = ENOMEM; break;
114         case ERROR_SWAPERROR: error = ENOENT; break;
115         case ERROR_TOO_MANY_MODULES: error = EMFILE; break;
116         case ERROR_TOO_MANY_OPEN_FILES: error = EMFILE; break;
117         case ERROR_UNRECOGNIZED_MEDIA: error = ENXIO; break;
118         case ERROR_UNRECOGNIZED_VOLUME: error = ENODEV; break;
119         case ERROR_WAIT_NO_CHILDREN: error = ECHILD; break;
120         case ERROR_WRITE_FAULT: error = EIO; break;
121         case ERROR_WRITE_PROTECT: error = EROFS; break;
122         }
123         return error;
124 }
125
126 static inline int is_file_in_use_error(DWORD errcode)
127 {
128         switch (errcode) {
129         case ERROR_SHARING_VIOLATION:
130         case ERROR_ACCESS_DENIED:
131                 return 1;
132         }
133
134         return 0;
135 }
136
137 static int read_yes_no_answer(void)
138 {
139         char answer[1024];
140
141         if (fgets(answer, sizeof(answer), stdin)) {
142                 size_t answer_len = strlen(answer);
143                 int got_full_line = 0, c;
144
145                 /* remove the newline */
146                 if (answer_len >= 2 && answer[answer_len-2] == '\r') {
147                         answer[answer_len-2] = '\0';
148                         got_full_line = 1;
149                 } else if (answer_len >= 1 && answer[answer_len-1] == '\n') {
150                         answer[answer_len-1] = '\0';
151                         got_full_line = 1;
152                 }
153                 /* flush the buffer in case we did not get the full line */
154                 if (!got_full_line)
155                         while ((c = getchar()) != EOF && c != '\n')
156                                 ;
157         } else
158                 /* we could not read, return the
159                  * default answer which is no */
160                 return 0;
161
162         if (tolower(answer[0]) == 'y' && !answer[1])
163                 return 1;
164         if (!strncasecmp(answer, "yes", sizeof(answer)))
165                 return 1;
166         if (tolower(answer[0]) == 'n' && !answer[1])
167                 return 0;
168         if (!strncasecmp(answer, "no", sizeof(answer)))
169                 return 0;
170
171         /* did not find an answer we understand */
172         return -1;
173 }
174
175 static int ask_yes_no_if_possible(const char *format, ...)
176 {
177         char question[4096];
178         const char *retry_hook[] = { NULL, NULL, NULL };
179         va_list args;
180
181         va_start(args, format);
182         vsnprintf(question, sizeof(question), format, args);
183         va_end(args);
184
185         if ((retry_hook[0] = mingw_getenv("GIT_ASK_YESNO"))) {
186                 retry_hook[1] = question;
187                 return !run_command_v_opt(retry_hook, 0);
188         }
189
190         if (!isatty(_fileno(stdin)) || !isatty(_fileno(stderr)))
191                 return 0;
192
193         while (1) {
194                 int answer;
195                 fprintf(stderr, "%s (y/n) ", question);
196
197                 if ((answer = read_yes_no_answer()) >= 0)
198                         return answer;
199
200                 fprintf(stderr, "Sorry, I did not understand your answer. "
201                                 "Please type 'y' or 'n'\n");
202         }
203 }
204
205 int mingw_unlink(const char *pathname)
206 {
207         int ret, tries = 0;
208         wchar_t wpathname[MAX_PATH];
209         if (xutftowcs_path(wpathname, pathname) < 0)
210                 return -1;
211
212         /* read-only files cannot be removed */
213         _wchmod(wpathname, 0666);
214         while ((ret = _wunlink(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
215                 if (!is_file_in_use_error(GetLastError()))
216                         break;
217                 /*
218                  * We assume that some other process had the source or
219                  * destination file open at the wrong moment and retry.
220                  * In order to give the other process a higher chance to
221                  * complete its operation, we give up our time slice now.
222                  * If we have to retry again, we do sleep a bit.
223                  */
224                 Sleep(delay[tries]);
225                 tries++;
226         }
227         while (ret == -1 && is_file_in_use_error(GetLastError()) &&
228                ask_yes_no_if_possible("Unlink of file '%s' failed. "
229                         "Should I try again?", pathname))
230                ret = _wunlink(wpathname);
231         return ret;
232 }
233
234 static int is_dir_empty(const wchar_t *wpath)
235 {
236         WIN32_FIND_DATAW findbuf;
237         HANDLE handle;
238         wchar_t wbuf[MAX_PATH + 2];
239         wcscpy(wbuf, wpath);
240         wcscat(wbuf, L"\\*");
241         handle = FindFirstFileW(wbuf, &findbuf);
242         if (handle == INVALID_HANDLE_VALUE)
243                 return GetLastError() == ERROR_NO_MORE_FILES;
244
245         while (!wcscmp(findbuf.cFileName, L".") ||
246                         !wcscmp(findbuf.cFileName, L".."))
247                 if (!FindNextFileW(handle, &findbuf)) {
248                         DWORD err = GetLastError();
249                         FindClose(handle);
250                         return err == ERROR_NO_MORE_FILES;
251                 }
252         FindClose(handle);
253         return 0;
254 }
255
256 int mingw_rmdir(const char *pathname)
257 {
258         int ret, tries = 0;
259         wchar_t wpathname[MAX_PATH];
260         if (xutftowcs_path(wpathname, pathname) < 0)
261                 return -1;
262
263         while ((ret = _wrmdir(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
264                 if (!is_file_in_use_error(GetLastError()))
265                         errno = err_win_to_posix(GetLastError());
266                 if (errno != EACCES)
267                         break;
268                 if (!is_dir_empty(wpathname)) {
269                         errno = ENOTEMPTY;
270                         break;
271                 }
272                 /*
273                  * We assume that some other process had the source or
274                  * destination file open at the wrong moment and retry.
275                  * In order to give the other process a higher chance to
276                  * complete its operation, we give up our time slice now.
277                  * If we have to retry again, we do sleep a bit.
278                  */
279                 Sleep(delay[tries]);
280                 tries++;
281         }
282         while (ret == -1 && errno == EACCES && is_file_in_use_error(GetLastError()) &&
283                ask_yes_no_if_possible("Deletion of directory '%s' failed. "
284                         "Should I try again?", pathname))
285                ret = _wrmdir(wpathname);
286         return ret;
287 }
288
289 int mingw_mkdir(const char *path, int mode)
290 {
291         int ret;
292         wchar_t wpath[MAX_PATH];
293         if (xutftowcs_path(wpath, path) < 0)
294                 return -1;
295         ret = _wmkdir(wpath);
296         return ret;
297 }
298
299 int mingw_open (const char *filename, int oflags, ...)
300 {
301         va_list args;
302         unsigned mode;
303         int fd;
304         wchar_t wfilename[MAX_PATH];
305
306         va_start(args, oflags);
307         mode = va_arg(args, int);
308         va_end(args);
309
310         if (filename && !strcmp(filename, "/dev/null"))
311                 filename = "nul";
312
313         if (xutftowcs_path(wfilename, filename) < 0)
314                 return -1;
315         fd = _wopen(wfilename, oflags, mode);
316
317         if (fd < 0 && (oflags & O_ACCMODE) != O_RDONLY && errno == EACCES) {
318                 DWORD attrs = GetFileAttributesW(wfilename);
319                 if (attrs != INVALID_FILE_ATTRIBUTES && (attrs & FILE_ATTRIBUTE_DIRECTORY))
320                         errno = EISDIR;
321         }
322         return fd;
323 }
324
325 static BOOL WINAPI ctrl_ignore(DWORD type)
326 {
327         return TRUE;
328 }
329
330 #undef fgetc
331 int mingw_fgetc(FILE *stream)
332 {
333         int ch;
334         if (!isatty(_fileno(stream)))
335                 return fgetc(stream);
336
337         SetConsoleCtrlHandler(ctrl_ignore, TRUE);
338         while (1) {
339                 ch = fgetc(stream);
340                 if (ch != EOF || GetLastError() != ERROR_OPERATION_ABORTED)
341                         break;
342
343                 /* Ctrl+C was pressed, simulate SIGINT and retry */
344                 mingw_raise(SIGINT);
345         }
346         SetConsoleCtrlHandler(ctrl_ignore, FALSE);
347         return ch;
348 }
349
350 #undef fopen
351 FILE *mingw_fopen (const char *filename, const char *otype)
352 {
353         FILE *file;
354         wchar_t wfilename[MAX_PATH], wotype[4];
355         if (filename && !strcmp(filename, "/dev/null"))
356                 filename = "nul";
357         if (xutftowcs_path(wfilename, filename) < 0 ||
358                 xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
359                 return NULL;
360         file = _wfopen(wfilename, wotype);
361         return file;
362 }
363
364 FILE *mingw_freopen (const char *filename, const char *otype, FILE *stream)
365 {
366         FILE *file;
367         wchar_t wfilename[MAX_PATH], wotype[4];
368         if (filename && !strcmp(filename, "/dev/null"))
369                 filename = "nul";
370         if (xutftowcs_path(wfilename, filename) < 0 ||
371                 xutftowcs(wotype, otype, ARRAY_SIZE(wotype)) < 0)
372                 return NULL;
373         file = _wfreopen(wfilename, wotype, stream);
374         return file;
375 }
376
377 #undef fflush
378 int mingw_fflush(FILE *stream)
379 {
380         int ret = fflush(stream);
381
382         /*
383          * write() is used behind the scenes of stdio output functions.
384          * Since git code does not check for errors after each stdio write
385          * operation, it can happen that write() is called by a later
386          * stdio function even if an earlier write() call failed. In the
387          * case of a pipe whose readable end was closed, only the first
388          * call to write() reports EPIPE on Windows. Subsequent write()
389          * calls report EINVAL. It is impossible to notice whether this
390          * fflush invocation triggered such a case, therefore, we have to
391          * catch all EINVAL errors whole-sale.
392          */
393         if (ret && errno == EINVAL)
394                 errno = EPIPE;
395
396         return ret;
397 }
398
399 #undef write
400 ssize_t mingw_write(int fd, const void *buf, size_t len)
401 {
402         ssize_t result = write(fd, buf, len);
403
404         if (result < 0 && errno == EINVAL && buf) {
405                 /* check if fd is a pipe */
406                 HANDLE h = (HANDLE) _get_osfhandle(fd);
407                 if (GetFileType(h) == FILE_TYPE_PIPE)
408                         errno = EPIPE;
409                 else
410                         errno = EINVAL;
411         }
412
413         return result;
414 }
415
416 int mingw_access(const char *filename, int mode)
417 {
418         wchar_t wfilename[MAX_PATH];
419         if (xutftowcs_path(wfilename, filename) < 0)
420                 return -1;
421         /* X_OK is not supported by the MSVCRT version */
422         return _waccess(wfilename, mode & ~X_OK);
423 }
424
425 int mingw_chdir(const char *dirname)
426 {
427         wchar_t wdirname[MAX_PATH];
428         if (xutftowcs_path(wdirname, dirname) < 0)
429                 return -1;
430         return _wchdir(wdirname);
431 }
432
433 int mingw_chmod(const char *filename, int mode)
434 {
435         wchar_t wfilename[MAX_PATH];
436         if (xutftowcs_path(wfilename, filename) < 0)
437                 return -1;
438         return _wchmod(wfilename, mode);
439 }
440
441 /*
442  * The unit of FILETIME is 100-nanoseconds since January 1, 1601, UTC.
443  * Returns the 100-nanoseconds ("hekto nanoseconds") since the epoch.
444  */
445 static inline long long filetime_to_hnsec(const FILETIME *ft)
446 {
447         long long winTime = ((long long)ft->dwHighDateTime << 32) + ft->dwLowDateTime;
448         /* Windows to Unix Epoch conversion */
449         return winTime - 116444736000000000LL;
450 }
451
452 static inline time_t filetime_to_time_t(const FILETIME *ft)
453 {
454         return (time_t)(filetime_to_hnsec(ft) / 10000000);
455 }
456
457 /**
458  * Verifies that safe_create_leading_directories() would succeed.
459  */
460 static int has_valid_directory_prefix(wchar_t *wfilename)
461 {
462         int n = wcslen(wfilename);
463
464         while (n > 0) {
465                 wchar_t c = wfilename[--n];
466                 DWORD attributes;
467
468                 if (!is_dir_sep(c))
469                         continue;
470
471                 wfilename[n] = L'\0';
472                 attributes = GetFileAttributesW(wfilename);
473                 wfilename[n] = c;
474                 if (attributes == FILE_ATTRIBUTE_DIRECTORY ||
475                                 attributes == FILE_ATTRIBUTE_DEVICE)
476                         return 1;
477                 if (attributes == INVALID_FILE_ATTRIBUTES)
478                         switch (GetLastError()) {
479                         case ERROR_PATH_NOT_FOUND:
480                                 continue;
481                         case ERROR_FILE_NOT_FOUND:
482                                 /* This implies parent directory exists. */
483                                 return 1;
484                         }
485                 return 0;
486         }
487         return 1;
488 }
489
490 /* We keep the do_lstat code in a separate function to avoid recursion.
491  * When a path ends with a slash, the stat will fail with ENOENT. In
492  * this case, we strip the trailing slashes and stat again.
493  *
494  * If follow is true then act like stat() and report on the link
495  * target. Otherwise report on the link itself.
496  */
497 static int do_lstat(int follow, const char *file_name, struct stat *buf)
498 {
499         WIN32_FILE_ATTRIBUTE_DATA fdata;
500         wchar_t wfilename[MAX_PATH];
501         if (xutftowcs_path(wfilename, file_name) < 0)
502                 return -1;
503
504         if (GetFileAttributesExW(wfilename, GetFileExInfoStandard, &fdata)) {
505                 buf->st_ino = 0;
506                 buf->st_gid = 0;
507                 buf->st_uid = 0;
508                 buf->st_nlink = 1;
509                 buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
510                 buf->st_size = fdata.nFileSizeLow |
511                         (((off_t)fdata.nFileSizeHigh)<<32);
512                 buf->st_dev = buf->st_rdev = 0; /* not used by Git */
513                 buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
514                 buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
515                 buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
516                 if (fdata.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) {
517                         WIN32_FIND_DATAW findbuf;
518                         HANDLE handle = FindFirstFileW(wfilename, &findbuf);
519                         if (handle != INVALID_HANDLE_VALUE) {
520                                 if ((findbuf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
521                                                 (findbuf.dwReserved0 == IO_REPARSE_TAG_SYMLINK)) {
522                                         if (follow) {
523                                                 char buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
524                                                 buf->st_size = readlink(file_name, buffer, MAXIMUM_REPARSE_DATA_BUFFER_SIZE);
525                                         } else {
526                                                 buf->st_mode = S_IFLNK;
527                                         }
528                                         buf->st_mode |= S_IREAD;
529                                         if (!(findbuf.dwFileAttributes & FILE_ATTRIBUTE_READONLY))
530                                                 buf->st_mode |= S_IWRITE;
531                                 }
532                                 FindClose(handle);
533                         }
534                 }
535                 return 0;
536         }
537         switch (GetLastError()) {
538         case ERROR_ACCESS_DENIED:
539         case ERROR_SHARING_VIOLATION:
540         case ERROR_LOCK_VIOLATION:
541         case ERROR_SHARING_BUFFER_EXCEEDED:
542                 errno = EACCES;
543                 break;
544         case ERROR_BUFFER_OVERFLOW:
545                 errno = ENAMETOOLONG;
546                 break;
547         case ERROR_NOT_ENOUGH_MEMORY:
548                 errno = ENOMEM;
549                 break;
550         case ERROR_PATH_NOT_FOUND:
551                 if (!has_valid_directory_prefix(wfilename)) {
552                         errno = ENOTDIR;
553                         break;
554                 }
555                 /* fallthru */
556         default:
557                 errno = ENOENT;
558                 break;
559         }
560         return -1;
561 }
562
563 /* We provide our own lstat/fstat functions, since the provided
564  * lstat/fstat functions are so slow. These stat functions are
565  * tailored for Git's usage (read: fast), and are not meant to be
566  * complete. Note that Git stat()s are redirected to mingw_lstat()
567  * too, since Windows doesn't really handle symlinks that well.
568  */
569 static int do_stat_internal(int follow, const char *file_name, struct stat *buf)
570 {
571         int namelen;
572         char alt_name[PATH_MAX];
573
574         if (!do_lstat(follow, file_name, buf))
575                 return 0;
576
577         /* if file_name ended in a '/', Windows returned ENOENT;
578          * try again without trailing slashes
579          */
580         if (errno != ENOENT)
581                 return -1;
582
583         namelen = strlen(file_name);
584         if (namelen && file_name[namelen-1] != '/')
585                 return -1;
586         while (namelen && file_name[namelen-1] == '/')
587                 --namelen;
588         if (!namelen || namelen >= PATH_MAX)
589                 return -1;
590
591         memcpy(alt_name, file_name, namelen);
592         alt_name[namelen] = 0;
593         return do_lstat(follow, alt_name, buf);
594 }
595
596 int mingw_lstat(const char *file_name, struct stat *buf)
597 {
598         return do_stat_internal(0, file_name, buf);
599 }
600 int mingw_stat(const char *file_name, struct stat *buf)
601 {
602         return do_stat_internal(1, file_name, buf);
603 }
604
605 int mingw_fstat(int fd, struct stat *buf)
606 {
607         HANDLE fh = (HANDLE)_get_osfhandle(fd);
608         BY_HANDLE_FILE_INFORMATION fdata;
609
610         if (fh == INVALID_HANDLE_VALUE) {
611                 errno = EBADF;
612                 return -1;
613         }
614         /* direct non-file handles to MS's fstat() */
615         if (GetFileType(fh) != FILE_TYPE_DISK)
616                 return _fstati64(fd, buf);
617
618         if (GetFileInformationByHandle(fh, &fdata)) {
619                 buf->st_ino = 0;
620                 buf->st_gid = 0;
621                 buf->st_uid = 0;
622                 buf->st_nlink = 1;
623                 buf->st_mode = file_attr_to_st_mode(fdata.dwFileAttributes);
624                 buf->st_size = fdata.nFileSizeLow |
625                         (((off_t)fdata.nFileSizeHigh)<<32);
626                 buf->st_dev = buf->st_rdev = 0; /* not used by Git */
627                 buf->st_atime = filetime_to_time_t(&(fdata.ftLastAccessTime));
628                 buf->st_mtime = filetime_to_time_t(&(fdata.ftLastWriteTime));
629                 buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
630                 return 0;
631         }
632         errno = EBADF;
633         return -1;
634 }
635
636 static inline void time_t_to_filetime(time_t t, FILETIME *ft)
637 {
638         long long winTime = t * 10000000LL + 116444736000000000LL;
639         ft->dwLowDateTime = winTime;
640         ft->dwHighDateTime = winTime >> 32;
641 }
642
643 int mingw_utime (const char *file_name, const struct utimbuf *times)
644 {
645         FILETIME mft, aft;
646         int fh, rc;
647         DWORD attrs;
648         wchar_t wfilename[MAX_PATH];
649         if (xutftowcs_path(wfilename, file_name) < 0)
650                 return -1;
651
652         /* must have write permission */
653         attrs = GetFileAttributesW(wfilename);
654         if (attrs != INVALID_FILE_ATTRIBUTES &&
655             (attrs & FILE_ATTRIBUTE_READONLY)) {
656                 /* ignore errors here; open() will report them */
657                 SetFileAttributesW(wfilename, attrs & ~FILE_ATTRIBUTE_READONLY);
658         }
659
660         if ((fh = _wopen(wfilename, O_RDWR | O_BINARY)) < 0) {
661                 rc = -1;
662                 goto revert_attrs;
663         }
664
665         if (times) {
666                 time_t_to_filetime(times->modtime, &mft);
667                 time_t_to_filetime(times->actime, &aft);
668         } else {
669                 GetSystemTimeAsFileTime(&mft);
670                 aft = mft;
671         }
672         if (!SetFileTime((HANDLE)_get_osfhandle(fh), NULL, &aft, &mft)) {
673                 errno = EINVAL;
674                 rc = -1;
675         } else
676                 rc = 0;
677         close(fh);
678
679 revert_attrs:
680         if (attrs != INVALID_FILE_ATTRIBUTES &&
681             (attrs & FILE_ATTRIBUTE_READONLY)) {
682                 /* ignore errors again */
683                 SetFileAttributesW(wfilename, attrs);
684         }
685         return rc;
686 }
687
688 unsigned int sleep (unsigned int seconds)
689 {
690         Sleep(seconds*1000);
691         return 0;
692 }
693
694 char *mingw_mktemp(char *template)
695 {
696         wchar_t wtemplate[MAX_PATH];
697         if (xutftowcs_path(wtemplate, template) < 0)
698                 return NULL;
699         if (!_wmktemp(wtemplate))
700                 return NULL;
701         if (xwcstoutf(template, wtemplate, strlen(template) + 1) < 0)
702                 return NULL;
703         return template;
704 }
705
706 int mkstemp(char *template)
707 {
708         char *filename = mktemp(template);
709         if (filename == NULL)
710                 return -1;
711         return open(filename, O_RDWR | O_CREAT, 0600);
712 }
713
714 int gettimeofday(struct timeval *tv, void *tz)
715 {
716         FILETIME ft;
717         long long hnsec;
718
719         GetSystemTimeAsFileTime(&ft);
720         hnsec = filetime_to_hnsec(&ft);
721         tv->tv_sec = hnsec / 10000000;
722         tv->tv_usec = (hnsec % 10000000) / 10;
723         return 0;
724 }
725
726 int pipe(int filedes[2])
727 {
728         HANDLE h[2];
729
730         /* this creates non-inheritable handles */
731         if (!CreatePipe(&h[0], &h[1], NULL, 8192)) {
732                 errno = err_win_to_posix(GetLastError());
733                 return -1;
734         }
735         filedes[0] = _open_osfhandle(HCAST(int, h[0]), O_NOINHERIT);
736         if (filedes[0] < 0) {
737                 CloseHandle(h[0]);
738                 CloseHandle(h[1]);
739                 return -1;
740         }
741         filedes[1] = _open_osfhandle(HCAST(int, h[1]), O_NOINHERIT);
742         if (filedes[1] < 0) {
743                 close(filedes[0]);
744                 CloseHandle(h[1]);
745                 return -1;
746         }
747         return 0;
748 }
749
750 struct tm *gmtime_r(const time_t *timep, struct tm *result)
751 {
752         /* gmtime() in MSVCRT.DLL is thread-safe, but not reentrant */
753         memcpy(result, gmtime(timep), sizeof(struct tm));
754         return result;
755 }
756
757 struct tm *localtime_r(const time_t *timep, struct tm *result)
758 {
759         /* localtime() in MSVCRT.DLL is thread-safe, but not reentrant */
760         memcpy(result, localtime(timep), sizeof(struct tm));
761         return result;
762 }
763
764 char *mingw_getcwd(char *pointer, int len)
765 {
766         int i;
767         wchar_t wpointer[MAX_PATH];
768         if (!_wgetcwd(wpointer, ARRAY_SIZE(wpointer)))
769                 return NULL;
770         if (xwcstoutf(pointer, wpointer, len) < 0)
771                 return NULL;
772         for (i = 0; pointer[i]; i++)
773                 if (pointer[i] == '\\')
774                         pointer[i] = '/';
775         return pointer;
776 }
777
778 /*
779  * See http://msdn2.microsoft.com/en-us/library/17w5ykft(vs.71).aspx
780  * (Parsing C++ Command-Line Arguments)
781  */
782 static const char *quote_arg(const char *arg)
783 {
784         /* count chars to quote */
785         int len = 0, n = 0;
786         int force_quotes = 0;
787         char *q, *d;
788         const char *p = arg;
789         if (!*p) force_quotes = 1;
790         while (*p) {
791                 if (isspace(*p) || *p == '*' || *p == '?' || *p == '{' || *p == '\'')
792                         force_quotes = 1;
793                 else if (*p == '"')
794                         n++;
795                 else if (*p == '\\') {
796                         int count = 0;
797                         while (*p == '\\') {
798                                 count++;
799                                 p++;
800                                 len++;
801                         }
802                         if (*p == '"')
803                                 n += count*2 + 1;
804                         continue;
805                 }
806                 len++;
807                 p++;
808         }
809         if (!force_quotes && n == 0)
810                 return arg;
811
812         /* insert \ where necessary */
813         d = q = xmalloc(st_add3(len, n, 3));
814         *d++ = '"';
815         while (*arg) {
816                 if (*arg == '"')
817                         *d++ = '\\';
818                 else if (*arg == '\\') {
819                         int count = 0;
820                         while (*arg == '\\') {
821                                 count++;
822                                 *d++ = *arg++;
823                         }
824                         if (*arg == '"') {
825                                 while (count-- > 0)
826                                         *d++ = '\\';
827                                 *d++ = '\\';
828                         }
829                 }
830                 *d++ = *arg++;
831         }
832         *d++ = '"';
833         *d++ = 0;
834         return q;
835 }
836
837 static const char *parse_interpreter(const char *cmd)
838 {
839         static char buf[100];
840         char *p, *opt;
841         int n, fd;
842
843         /* don't even try a .exe */
844         n = strlen(cmd);
845         if (n >= 4 && !strcasecmp(cmd+n-4, ".exe"))
846                 return NULL;
847
848         fd = open(cmd, O_RDONLY);
849         if (fd < 0)
850                 return NULL;
851         n = read(fd, buf, sizeof(buf)-1);
852         close(fd);
853         if (n < 4)      /* at least '#!/x' and not error */
854                 return NULL;
855
856         if (buf[0] != '#' || buf[1] != '!')
857                 return NULL;
858         buf[n] = '\0';
859         p = buf + strcspn(buf, "\r\n");
860         if (!*p)
861                 return NULL;
862
863         *p = '\0';
864         if (!(p = strrchr(buf+2, '/')) && !(p = strrchr(buf+2, '\\')))
865                 return NULL;
866         /* strip options */
867         if ((opt = strchr(p+1, ' ')))
868                 *opt = '\0';
869         return p+1;
870 }
871
872 /*
873  * Splits the PATH into parts.
874  */
875 static char **get_path_split(void)
876 {
877         char *p, **path, *envpath = mingw_getenv("PATH");
878         int i, n = 0;
879
880         if (!envpath || !*envpath)
881                 return NULL;
882
883         envpath = xstrdup(envpath);
884         p = envpath;
885         while (p) {
886                 char *dir = p;
887                 p = strchr(p, ';');
888                 if (p) *p++ = '\0';
889                 if (*dir) {     /* not earlier, catches series of ; */
890                         ++n;
891                 }
892         }
893         if (!n)
894                 return NULL;
895
896         ALLOC_ARRAY(path, n + 1);
897         p = envpath;
898         i = 0;
899         do {
900                 if (*p)
901                         path[i++] = xstrdup(p);
902                 p = p+strlen(p)+1;
903         } while (i < n);
904         path[i] = NULL;
905
906         free(envpath);
907
908         return path;
909 }
910
911 static void free_path_split(char **path)
912 {
913         char **p = path;
914
915         if (!path)
916                 return;
917
918         while (*p)
919                 free(*p++);
920         free(path);
921 }
922
923 /*
924  * exe_only means that we only want to detect .exe files, but not scripts
925  * (which do not have an extension)
926  */
927 static char *lookup_prog(const char *dir, const char *cmd, int isexe, int exe_only)
928 {
929         char path[MAX_PATH];
930         snprintf(path, sizeof(path), "%s/%s.exe", dir, cmd);
931
932         if (!isexe && access(path, F_OK) == 0)
933                 return xstrdup(path);
934         path[strlen(path)-4] = '\0';
935         if ((!exe_only || isexe) && access(path, F_OK) == 0)
936                 if (!(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY))
937                         return xstrdup(path);
938         return NULL;
939 }
940
941 /*
942  * Determines the absolute path of cmd using the split path in path.
943  * If cmd contains a slash or backslash, no lookup is performed.
944  */
945 static char *path_lookup(const char *cmd, char **path, int exe_only)
946 {
947         char *prog = NULL;
948         int len = strlen(cmd);
949         int isexe = len >= 4 && !strcasecmp(cmd+len-4, ".exe");
950
951         if (strchr(cmd, '/') || strchr(cmd, '\\'))
952                 prog = xstrdup(cmd);
953
954         while (!prog && *path)
955                 prog = lookup_prog(*path++, cmd, isexe, exe_only);
956
957         return prog;
958 }
959
960 static int do_putenv(char **env, const char *name, int size, int free_old);
961
962 /* used number of elements of environ array, including terminating NULL */
963 static int environ_size = 0;
964 /* allocated size of environ array, in bytes */
965 static int environ_alloc = 0;
966
967 /*
968  * Create environment block suitable for CreateProcess. Merges current
969  * process environment and the supplied environment changes.
970  */
971 static wchar_t *make_environment_block(char **deltaenv)
972 {
973         wchar_t *wenvblk = NULL;
974         char **tmpenv;
975         int i = 0, size = environ_size, wenvsz = 0, wenvpos = 0;
976
977         while (deltaenv && deltaenv[i])
978                 i++;
979
980         /* copy the environment, leaving space for changes */
981         ALLOC_ARRAY(tmpenv, size + i);
982         memcpy(tmpenv, environ, size * sizeof(char*));
983
984         /* merge supplied environment changes into the temporary environment */
985         for (i = 0; deltaenv && deltaenv[i]; i++)
986                 size = do_putenv(tmpenv, deltaenv[i], size, 0);
987
988         /* create environment block from temporary environment */
989         for (i = 0; tmpenv[i]; i++) {
990                 size = 2 * strlen(tmpenv[i]) + 2; /* +2 for final \0 */
991                 ALLOC_GROW(wenvblk, (wenvpos + size) * sizeof(wchar_t), wenvsz);
992                 wenvpos += xutftowcs(&wenvblk[wenvpos], tmpenv[i], size) + 1;
993         }
994         /* add final \0 terminator */
995         wenvblk[wenvpos] = 0;
996         free(tmpenv);
997         return wenvblk;
998 }
999
1000 struct pinfo_t {
1001         struct pinfo_t *next;
1002         pid_t pid;
1003         HANDLE proc;
1004 };
1005 static struct pinfo_t *pinfo = NULL;
1006 CRITICAL_SECTION pinfo_cs;
1007
1008 static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaenv,
1009                               const char *dir,
1010                               int prepend_cmd, int fhin, int fhout, int fherr)
1011 {
1012         STARTUPINFOW si;
1013         PROCESS_INFORMATION pi;
1014         struct strbuf args;
1015         wchar_t wcmd[MAX_PATH], wdir[MAX_PATH], *wargs, *wenvblk = NULL;
1016         unsigned flags = CREATE_UNICODE_ENVIRONMENT;
1017         BOOL ret;
1018
1019         /* Determine whether or not we are associated to a console */
1020         HANDLE cons = CreateFile("CONOUT$", GENERIC_WRITE,
1021                         FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
1022                         FILE_ATTRIBUTE_NORMAL, NULL);
1023         if (cons == INVALID_HANDLE_VALUE) {
1024                 /* There is no console associated with this process.
1025                  * Since the child is a console process, Windows
1026                  * would normally create a console window. But
1027                  * since we'll be redirecting std streams, we do
1028                  * not need the console.
1029                  * It is necessary to use DETACHED_PROCESS
1030                  * instead of CREATE_NO_WINDOW to make ssh
1031                  * recognize that it has no console.
1032                  */
1033                 flags |= DETACHED_PROCESS;
1034         } else {
1035                 /* There is already a console. If we specified
1036                  * DETACHED_PROCESS here, too, Windows would
1037                  * disassociate the child from the console.
1038                  * The same is true for CREATE_NO_WINDOW.
1039                  * Go figure!
1040                  */
1041                 CloseHandle(cons);
1042         }
1043         memset(&si, 0, sizeof(si));
1044         si.cb = sizeof(si);
1045         si.dwFlags = STARTF_USESTDHANDLES;
1046         si.hStdInput = winansi_get_osfhandle(fhin);
1047         si.hStdOutput = winansi_get_osfhandle(fhout);
1048         si.hStdError = winansi_get_osfhandle(fherr);
1049
1050         if (xutftowcs_path(wcmd, cmd) < 0)
1051                 return -1;
1052         if (dir && xutftowcs_path(wdir, dir) < 0)
1053                 return -1;
1054
1055         /* concatenate argv, quoting args as we go */
1056         strbuf_init(&args, 0);
1057         if (prepend_cmd) {
1058                 char *quoted = (char *)quote_arg(cmd);
1059                 strbuf_addstr(&args, quoted);
1060                 if (quoted != cmd)
1061                         free(quoted);
1062         }
1063         for (; *argv; argv++) {
1064                 char *quoted = (char *)quote_arg(*argv);
1065                 if (*args.buf)
1066                         strbuf_addch(&args, ' ');
1067                 strbuf_addstr(&args, quoted);
1068                 if (quoted != *argv)
1069                         free(quoted);
1070         }
1071
1072         ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1));
1073         xutftowcs(wargs, args.buf, 2 * args.len + 1);
1074         strbuf_release(&args);
1075
1076         wenvblk = make_environment_block(deltaenv);
1077
1078         memset(&pi, 0, sizeof(pi));
1079         ret = CreateProcessW(wcmd, wargs, NULL, NULL, TRUE, flags,
1080                 wenvblk, dir ? wdir : NULL, &si, &pi);
1081
1082         free(wenvblk);
1083         free(wargs);
1084
1085         if (!ret) {
1086                 errno = ENOENT;
1087                 return -1;
1088         }
1089         CloseHandle(pi.hThread);
1090
1091         /*
1092          * The process ID is the human-readable identifier of the process
1093          * that we want to present in log and error messages. The handle
1094          * is not useful for this purpose. But we cannot close it, either,
1095          * because it is not possible to turn a process ID into a process
1096          * handle after the process terminated.
1097          * Keep the handle in a list for waitpid.
1098          */
1099         EnterCriticalSection(&pinfo_cs);
1100         {
1101                 struct pinfo_t *info = xmalloc(sizeof(struct pinfo_t));
1102                 info->pid = pi.dwProcessId;
1103                 info->proc = pi.hProcess;
1104                 info->next = pinfo;
1105                 pinfo = info;
1106         }
1107         LeaveCriticalSection(&pinfo_cs);
1108
1109         return (pid_t)pi.dwProcessId;
1110 }
1111
1112 static pid_t mingw_spawnv(const char *cmd, const char **argv, int prepend_cmd)
1113 {
1114         return mingw_spawnve_fd(cmd, argv, NULL, NULL, prepend_cmd, 0, 1, 2);
1115 }
1116
1117 pid_t mingw_spawnvpe(const char *cmd, const char **argv, char **deltaenv,
1118                      const char *dir,
1119                      int fhin, int fhout, int fherr)
1120 {
1121         pid_t pid;
1122         char **path = get_path_split();
1123         char *prog = path_lookup(cmd, path, 0);
1124
1125         if (!prog) {
1126                 errno = ENOENT;
1127                 pid = -1;
1128         }
1129         else {
1130                 const char *interpr = parse_interpreter(prog);
1131
1132                 if (interpr) {
1133                         const char *argv0 = argv[0];
1134                         char *iprog = path_lookup(interpr, path, 1);
1135                         argv[0] = prog;
1136                         if (!iprog) {
1137                                 errno = ENOENT;
1138                                 pid = -1;
1139                         }
1140                         else {
1141                                 pid = mingw_spawnve_fd(iprog, argv, deltaenv, dir, 1,
1142                                                        fhin, fhout, fherr);
1143                                 free(iprog);
1144                         }
1145                         argv[0] = argv0;
1146                 }
1147                 else
1148                         pid = mingw_spawnve_fd(prog, argv, deltaenv, dir, 0,
1149                                                fhin, fhout, fherr);
1150                 free(prog);
1151         }
1152         free_path_split(path);
1153         return pid;
1154 }
1155
1156 static int try_shell_exec(const char *cmd, char *const *argv)
1157 {
1158         const char *interpr = parse_interpreter(cmd);
1159         char **path;
1160         char *prog;
1161         int pid = 0;
1162
1163         if (!interpr)
1164                 return 0;
1165         path = get_path_split();
1166         prog = path_lookup(interpr, path, 1);
1167         if (prog) {
1168                 int argc = 0;
1169                 const char **argv2;
1170                 while (argv[argc]) argc++;
1171                 ALLOC_ARRAY(argv2, argc + 1);
1172                 argv2[0] = (char *)cmd; /* full path to the script file */
1173                 memcpy(&argv2[1], &argv[1], sizeof(*argv) * argc);
1174                 pid = mingw_spawnv(prog, argv2, 1);
1175                 if (pid >= 0) {
1176                         int status;
1177                         if (waitpid(pid, &status, 0) < 0)
1178                                 status = 255;
1179                         exit(status);
1180                 }
1181                 pid = 1;        /* indicate that we tried but failed */
1182                 free(prog);
1183                 free(argv2);
1184         }
1185         free_path_split(path);
1186         return pid;
1187 }
1188
1189 int mingw_execv(const char *cmd, char *const *argv)
1190 {
1191         /* check if git_command is a shell script */
1192         if (!try_shell_exec(cmd, argv)) {
1193                 int pid, status;
1194
1195                 pid = mingw_spawnv(cmd, (const char **)argv, 0);
1196                 if (pid < 0)
1197                         return -1;
1198                 if (waitpid(pid, &status, 0) < 0)
1199                         status = 255;
1200                 exit(status);
1201         }
1202         return -1;
1203 }
1204
1205 int mingw_execvp(const char *cmd, char *const *argv)
1206 {
1207         char **path = get_path_split();
1208         char *prog = path_lookup(cmd, path, 0);
1209
1210         if (prog) {
1211                 mingw_execv(prog, argv);
1212                 free(prog);
1213         } else
1214                 errno = ENOENT;
1215
1216         free_path_split(path);
1217         return -1;
1218 }
1219
1220 int mingw_kill(pid_t pid, int sig)
1221 {
1222         if (pid > 0 && sig == SIGTERM) {
1223                 HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
1224
1225                 if (TerminateProcess(h, -1)) {
1226                         CloseHandle(h);
1227                         return 0;
1228                 }
1229
1230                 errno = err_win_to_posix(GetLastError());
1231                 CloseHandle(h);
1232                 return -1;
1233         } else if (pid > 0 && sig == 0) {
1234                 HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
1235                 if (h) {
1236                         CloseHandle(h);
1237                         return 0;
1238                 }
1239         }
1240
1241         errno = EINVAL;
1242         return -1;
1243 }
1244
1245 /*
1246  * Compare environment entries by key (i.e. stopping at '=' or '\0').
1247  */
1248 static int compareenv(const void *v1, const void *v2)
1249 {
1250         const char *e1 = *(const char**)v1;
1251         const char *e2 = *(const char**)v2;
1252
1253         for (;;) {
1254                 int c1 = *e1++;
1255                 int c2 = *e2++;
1256                 c1 = (c1 == '=') ? 0 : tolower(c1);
1257                 c2 = (c2 == '=') ? 0 : tolower(c2);
1258                 if (c1 > c2)
1259                         return 1;
1260                 if (c1 < c2)
1261                         return -1;
1262                 if (c1 == 0)
1263                         return 0;
1264         }
1265 }
1266
1267 static int bsearchenv(char **env, const char *name, size_t size)
1268 {
1269         unsigned low = 0, high = size;
1270         while (low < high) {
1271                 unsigned mid = low + ((high - low) >> 1);
1272                 int cmp = compareenv(&env[mid], &name);
1273                 if (cmp < 0)
1274                         low = mid + 1;
1275                 else if (cmp > 0)
1276                         high = mid;
1277                 else
1278                         return mid;
1279         }
1280         return ~low; /* not found, return 1's complement of insert position */
1281 }
1282
1283 /*
1284  * If name contains '=', then sets the variable, otherwise it unsets it
1285  * Size includes the terminating NULL. Env must have room for size + 1 entries
1286  * (in case of insert). Returns the new size. Optionally frees removed entries.
1287  */
1288 static int do_putenv(char **env, const char *name, int size, int free_old)
1289 {
1290         int i = bsearchenv(env, name, size - 1);
1291
1292         /* optionally free removed / replaced entry */
1293         if (i >= 0 && free_old)
1294                 free(env[i]);
1295
1296         if (strchr(name, '=')) {
1297                 /* if new value ('key=value') is specified, insert or replace entry */
1298                 if (i < 0) {
1299                         i = ~i;
1300                         memmove(&env[i + 1], &env[i], (size - i) * sizeof(char*));
1301                         size++;
1302                 }
1303                 env[i] = (char*) name;
1304         } else if (i >= 0) {
1305                 /* otherwise ('key') remove existing entry */
1306                 size--;
1307                 memmove(&env[i], &env[i + 1], (size - i) * sizeof(char*));
1308         }
1309         return size;
1310 }
1311
1312 char *mingw_getenv(const char *name)
1313 {
1314         char *value;
1315         int pos = bsearchenv(environ, name, environ_size - 1);
1316         if (pos < 0)
1317                 return NULL;
1318         value = strchr(environ[pos], '=');
1319         return value ? &value[1] : NULL;
1320 }
1321
1322 int mingw_putenv(const char *namevalue)
1323 {
1324         ALLOC_GROW(environ, (environ_size + 1) * sizeof(char*), environ_alloc);
1325         environ_size = do_putenv(environ, namevalue, environ_size, 1);
1326         return 0;
1327 }
1328
1329 /*
1330  * Note, this isn't a complete replacement for getaddrinfo. It assumes
1331  * that service contains a numerical port, or that it is null. It
1332  * does a simple search using gethostbyname, and returns one IPv4 host
1333  * if one was found.
1334  */
1335 static int WSAAPI getaddrinfo_stub(const char *node, const char *service,
1336                                    const struct addrinfo *hints,
1337                                    struct addrinfo **res)
1338 {
1339         struct hostent *h = NULL;
1340         struct addrinfo *ai;
1341         struct sockaddr_in *sin;
1342
1343         if (node) {
1344                 h = gethostbyname(node);
1345                 if (!h)
1346                         return WSAGetLastError();
1347         }
1348
1349         ai = xmalloc(sizeof(struct addrinfo));
1350         *res = ai;
1351         ai->ai_flags = 0;
1352         ai->ai_family = AF_INET;
1353         ai->ai_socktype = hints ? hints->ai_socktype : 0;
1354         switch (ai->ai_socktype) {
1355         case SOCK_STREAM:
1356                 ai->ai_protocol = IPPROTO_TCP;
1357                 break;
1358         case SOCK_DGRAM:
1359                 ai->ai_protocol = IPPROTO_UDP;
1360                 break;
1361         default:
1362                 ai->ai_protocol = 0;
1363                 break;
1364         }
1365         ai->ai_addrlen = sizeof(struct sockaddr_in);
1366         if (hints && (hints->ai_flags & AI_CANONNAME))
1367                 ai->ai_canonname = h ? xstrdup(h->h_name) : NULL;
1368         else
1369                 ai->ai_canonname = NULL;
1370
1371         sin = xcalloc(1, ai->ai_addrlen);
1372         sin->sin_family = AF_INET;
1373         /* Note: getaddrinfo is supposed to allow service to be a string,
1374          * which should be looked up using getservbyname. This is
1375          * currently not implemented */
1376         if (service)
1377                 sin->sin_port = htons(atoi(service));
1378         if (h)
1379                 sin->sin_addr = *(struct in_addr *)h->h_addr;
1380         else if (hints && (hints->ai_flags & AI_PASSIVE))
1381                 sin->sin_addr.s_addr = INADDR_ANY;
1382         else
1383                 sin->sin_addr.s_addr = INADDR_LOOPBACK;
1384         ai->ai_addr = (struct sockaddr *)sin;
1385         ai->ai_next = NULL;
1386         return 0;
1387 }
1388
1389 static void WSAAPI freeaddrinfo_stub(struct addrinfo *res)
1390 {
1391         free(res->ai_canonname);
1392         free(res->ai_addr);
1393         free(res);
1394 }
1395
1396 static int WSAAPI getnameinfo_stub(const struct sockaddr *sa, socklen_t salen,
1397                                    char *host, DWORD hostlen,
1398                                    char *serv, DWORD servlen, int flags)
1399 {
1400         const struct sockaddr_in *sin = (const struct sockaddr_in *)sa;
1401         if (sa->sa_family != AF_INET)
1402                 return EAI_FAMILY;
1403         if (!host && !serv)
1404                 return EAI_NONAME;
1405
1406         if (host && hostlen > 0) {
1407                 struct hostent *ent = NULL;
1408                 if (!(flags & NI_NUMERICHOST))
1409                         ent = gethostbyaddr((const char *)&sin->sin_addr,
1410                                             sizeof(sin->sin_addr), AF_INET);
1411
1412                 if (ent)
1413                         snprintf(host, hostlen, "%s", ent->h_name);
1414                 else if (flags & NI_NAMEREQD)
1415                         return EAI_NONAME;
1416                 else
1417                         snprintf(host, hostlen, "%s", inet_ntoa(sin->sin_addr));
1418         }
1419
1420         if (serv && servlen > 0) {
1421                 struct servent *ent = NULL;
1422                 if (!(flags & NI_NUMERICSERV))
1423                         ent = getservbyport(sin->sin_port,
1424                                             flags & NI_DGRAM ? "udp" : "tcp");
1425
1426                 if (ent)
1427                         snprintf(serv, servlen, "%s", ent->s_name);
1428                 else
1429                         snprintf(serv, servlen, "%d", ntohs(sin->sin_port));
1430         }
1431
1432         return 0;
1433 }
1434
1435 static HMODULE ipv6_dll = NULL;
1436 static void (WSAAPI *ipv6_freeaddrinfo)(struct addrinfo *res);
1437 static int (WSAAPI *ipv6_getaddrinfo)(const char *node, const char *service,
1438                                       const struct addrinfo *hints,
1439                                       struct addrinfo **res);
1440 static int (WSAAPI *ipv6_getnameinfo)(const struct sockaddr *sa, socklen_t salen,
1441                                       char *host, DWORD hostlen,
1442                                       char *serv, DWORD servlen, int flags);
1443 /*
1444  * gai_strerror is an inline function in the ws2tcpip.h header, so we
1445  * don't need to try to load that one dynamically.
1446  */
1447
1448 static void socket_cleanup(void)
1449 {
1450         WSACleanup();
1451         if (ipv6_dll)
1452                 FreeLibrary(ipv6_dll);
1453         ipv6_dll = NULL;
1454         ipv6_freeaddrinfo = freeaddrinfo_stub;
1455         ipv6_getaddrinfo = getaddrinfo_stub;
1456         ipv6_getnameinfo = getnameinfo_stub;
1457 }
1458
1459 static void ensure_socket_initialization(void)
1460 {
1461         WSADATA wsa;
1462         static int initialized = 0;
1463         const char *libraries[] = { "ws2_32.dll", "wship6.dll", NULL };
1464         const char **name;
1465
1466         if (initialized)
1467                 return;
1468
1469         if (WSAStartup(MAKEWORD(2,2), &wsa))
1470                 die("unable to initialize winsock subsystem, error %d",
1471                         WSAGetLastError());
1472
1473         for (name = libraries; *name; name++) {
1474                 ipv6_dll = LoadLibrary(*name);
1475                 if (!ipv6_dll)
1476                         continue;
1477
1478                 ipv6_freeaddrinfo = (void (WSAAPI *)(struct addrinfo *))
1479                         GetProcAddress(ipv6_dll, "freeaddrinfo");
1480                 ipv6_getaddrinfo = (int (WSAAPI *)(const char *, const char *,
1481                                                    const struct addrinfo *,
1482                                                    struct addrinfo **))
1483                         GetProcAddress(ipv6_dll, "getaddrinfo");
1484                 ipv6_getnameinfo = (int (WSAAPI *)(const struct sockaddr *,
1485                                                    socklen_t, char *, DWORD,
1486                                                    char *, DWORD, int))
1487                         GetProcAddress(ipv6_dll, "getnameinfo");
1488                 if (!ipv6_freeaddrinfo || !ipv6_getaddrinfo || !ipv6_getnameinfo) {
1489                         FreeLibrary(ipv6_dll);
1490                         ipv6_dll = NULL;
1491                 } else
1492                         break;
1493         }
1494         if (!ipv6_freeaddrinfo || !ipv6_getaddrinfo || !ipv6_getnameinfo) {
1495                 ipv6_freeaddrinfo = freeaddrinfo_stub;
1496                 ipv6_getaddrinfo = getaddrinfo_stub;
1497                 ipv6_getnameinfo = getnameinfo_stub;
1498         }
1499
1500         atexit(socket_cleanup);
1501         initialized = 1;
1502 }
1503
1504 #undef gethostname
1505 int mingw_gethostname(char *name, int namelen)
1506 {
1507     ensure_socket_initialization();
1508     return gethostname(name, namelen);
1509 }
1510
1511 #undef gethostbyname
1512 struct hostent *mingw_gethostbyname(const char *host)
1513 {
1514         ensure_socket_initialization();
1515         return gethostbyname(host);
1516 }
1517
1518 void mingw_freeaddrinfo(struct addrinfo *res)
1519 {
1520         ipv6_freeaddrinfo(res);
1521 }
1522
1523 int mingw_getaddrinfo(const char *node, const char *service,
1524                       const struct addrinfo *hints, struct addrinfo **res)
1525 {
1526         ensure_socket_initialization();
1527         return ipv6_getaddrinfo(node, service, hints, res);
1528 }
1529
1530 int mingw_getnameinfo(const struct sockaddr *sa, socklen_t salen,
1531                       char *host, DWORD hostlen, char *serv, DWORD servlen,
1532                       int flags)
1533 {
1534         ensure_socket_initialization();
1535         return ipv6_getnameinfo(sa, salen, host, hostlen, serv, servlen, flags);
1536 }
1537
1538 int mingw_socket(int domain, int type, int protocol)
1539 {
1540         int sockfd;
1541         SOCKET s;
1542
1543         ensure_socket_initialization();
1544         s = WSASocket(domain, type, protocol, NULL, 0, 0);
1545         if (s == INVALID_SOCKET) {
1546                 /*
1547                  * WSAGetLastError() values are regular BSD error codes
1548                  * biased by WSABASEERR.
1549                  * However, strerror() does not know about networking
1550                  * specific errors, which are values beginning at 38 or so.
1551                  * Therefore, we choose to leave the biased error code
1552                  * in errno so that _if_ someone looks up the code somewhere,
1553                  * then it is at least the number that are usually listed.
1554                  */
1555                 errno = WSAGetLastError();
1556                 return -1;
1557         }
1558         /* convert into a file descriptor */
1559         if ((sockfd = _open_osfhandle(s, O_RDWR|O_BINARY)) < 0) {
1560                 closesocket(s);
1561                 return error("unable to make a socket file descriptor: %s",
1562                         strerror(errno));
1563         }
1564         return sockfd;
1565 }
1566
1567 #undef connect
1568 int mingw_connect(int sockfd, struct sockaddr *sa, size_t sz)
1569 {
1570         SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1571         return connect(s, sa, sz);
1572 }
1573
1574 #undef bind
1575 int mingw_bind(int sockfd, struct sockaddr *sa, size_t sz)
1576 {
1577         SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1578         return bind(s, sa, sz);
1579 }
1580
1581 #undef setsockopt
1582 int mingw_setsockopt(int sockfd, int lvl, int optname, void *optval, int optlen)
1583 {
1584         SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1585         return setsockopt(s, lvl, optname, (const char*)optval, optlen);
1586 }
1587
1588 #undef shutdown
1589 int mingw_shutdown(int sockfd, int how)
1590 {
1591         SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1592         return shutdown(s, how);
1593 }
1594
1595 #undef listen
1596 int mingw_listen(int sockfd, int backlog)
1597 {
1598         SOCKET s = (SOCKET)_get_osfhandle(sockfd);
1599         return listen(s, backlog);
1600 }
1601
1602 #undef accept
1603 int mingw_accept(int sockfd1, struct sockaddr *sa, socklen_t *sz)
1604 {
1605         int sockfd2;
1606
1607         SOCKET s1 = (SOCKET)_get_osfhandle(sockfd1);
1608         SOCKET s2 = accept(s1, sa, sz);
1609
1610         /* convert into a file descriptor */
1611         if ((sockfd2 = _open_osfhandle(s2, O_RDWR|O_BINARY)) < 0) {
1612                 int err = errno;
1613                 closesocket(s2);
1614                 return error("unable to make a socket file descriptor: %s",
1615                         strerror(err));
1616         }
1617         return sockfd2;
1618 }
1619
1620 #undef rename
1621 int mingw_rename(const char *pold, const char *pnew)
1622 {
1623         DWORD attrs, gle;
1624         int tries = 0;
1625         wchar_t wpold[MAX_PATH], wpnew[MAX_PATH];
1626         if (xutftowcs_path(wpold, pold) < 0 || xutftowcs_path(wpnew, pnew) < 0)
1627                 return -1;
1628
1629         /*
1630          * Try native rename() first to get errno right.
1631          * It is based on MoveFile(), which cannot overwrite existing files.
1632          */
1633         if (!_wrename(wpold, wpnew))
1634                 return 0;
1635         if (errno != EEXIST)
1636                 return -1;
1637 repeat:
1638         if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
1639                 return 0;
1640         /* TODO: translate more errors */
1641         gle = GetLastError();
1642         if (gle == ERROR_ACCESS_DENIED &&
1643             (attrs = GetFileAttributesW(wpnew)) != INVALID_FILE_ATTRIBUTES) {
1644                 if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
1645                         DWORD attrsold = GetFileAttributesW(wpold);
1646                         if (attrsold == INVALID_FILE_ATTRIBUTES ||
1647                             !(attrsold & FILE_ATTRIBUTE_DIRECTORY))
1648                                 errno = EISDIR;
1649                         else if (!_wrmdir(wpnew))
1650                                 goto repeat;
1651                         return -1;
1652                 }
1653                 if ((attrs & FILE_ATTRIBUTE_READONLY) &&
1654                     SetFileAttributesW(wpnew, attrs & ~FILE_ATTRIBUTE_READONLY)) {
1655                         if (MoveFileExW(wpold, wpnew, MOVEFILE_REPLACE_EXISTING))
1656                                 return 0;
1657                         gle = GetLastError();
1658                         /* revert file attributes on failure */
1659                         SetFileAttributesW(wpnew, attrs);
1660                 }
1661         }
1662         if (tries < ARRAY_SIZE(delay) && gle == ERROR_ACCESS_DENIED) {
1663                 /*
1664                  * We assume that some other process had the source or
1665                  * destination file open at the wrong moment and retry.
1666                  * In order to give the other process a higher chance to
1667                  * complete its operation, we give up our time slice now.
1668                  * If we have to retry again, we do sleep a bit.
1669                  */
1670                 Sleep(delay[tries]);
1671                 tries++;
1672                 goto repeat;
1673         }
1674         if (gle == ERROR_ACCESS_DENIED &&
1675                ask_yes_no_if_possible("Rename from '%s' to '%s' failed. "
1676                        "Should I try again?", pold, pnew))
1677                 goto repeat;
1678
1679         errno = EACCES;
1680         return -1;
1681 }
1682
1683 /*
1684  * Note that this doesn't return the actual pagesize, but
1685  * the allocation granularity. If future Windows specific git code
1686  * needs the real getpagesize function, we need to find another solution.
1687  */
1688 int mingw_getpagesize(void)
1689 {
1690         SYSTEM_INFO si;
1691         GetSystemInfo(&si);
1692         return si.dwAllocationGranularity;
1693 }
1694
1695 struct passwd *getpwuid(int uid)
1696 {
1697         static char user_name[100];
1698         static struct passwd p;
1699
1700         DWORD len = sizeof(user_name);
1701         if (!GetUserName(user_name, &len))
1702                 return NULL;
1703         p.pw_name = user_name;
1704         p.pw_gecos = "unknown";
1705         p.pw_dir = NULL;
1706         return &p;
1707 }
1708
1709 static HANDLE timer_event;
1710 static HANDLE timer_thread;
1711 static int timer_interval;
1712 static int one_shot;
1713 static sig_handler_t timer_fn = SIG_DFL, sigint_fn = SIG_DFL;
1714
1715 /* The timer works like this:
1716  * The thread, ticktack(), is a trivial routine that most of the time
1717  * only waits to receive the signal to terminate. The main thread tells
1718  * the thread to terminate by setting the timer_event to the signalled
1719  * state.
1720  * But ticktack() interrupts the wait state after the timer's interval
1721  * length to call the signal handler.
1722  */
1723
1724 static unsigned __stdcall ticktack(void *dummy)
1725 {
1726         while (WaitForSingleObject(timer_event, timer_interval) == WAIT_TIMEOUT) {
1727                 mingw_raise(SIGALRM);
1728                 if (one_shot)
1729                         break;
1730         }
1731         return 0;
1732 }
1733
1734 static int start_timer_thread(void)
1735 {
1736         timer_event = CreateEvent(NULL, FALSE, FALSE, NULL);
1737         if (timer_event) {
1738                 timer_thread = (HANDLE) _beginthreadex(NULL, 0, ticktack, NULL, 0, NULL);
1739                 if (!timer_thread )
1740                         return errno = ENOMEM,
1741                                 error("cannot start timer thread");
1742         } else
1743                 return errno = ENOMEM,
1744                         error("cannot allocate resources for timer");
1745         return 0;
1746 }
1747
1748 static void stop_timer_thread(void)
1749 {
1750         if (timer_event)
1751                 SetEvent(timer_event);  /* tell thread to terminate */
1752         if (timer_thread) {
1753                 int rc = WaitForSingleObject(timer_thread, 1000);
1754                 if (rc == WAIT_TIMEOUT)
1755                         error("timer thread did not terminate timely");
1756                 else if (rc != WAIT_OBJECT_0)
1757                         error("waiting for timer thread failed: %lu",
1758                               GetLastError());
1759                 CloseHandle(timer_thread);
1760         }
1761         if (timer_event)
1762                 CloseHandle(timer_event);
1763         timer_event = NULL;
1764         timer_thread = NULL;
1765 }
1766
1767 static inline int is_timeval_eq(const struct timeval *i1, const struct timeval *i2)
1768 {
1769         return i1->tv_sec == i2->tv_sec && i1->tv_usec == i2->tv_usec;
1770 }
1771
1772 int setitimer(int type, struct itimerval *in, struct itimerval *out)
1773 {
1774         static const struct timeval zero;
1775         static int atexit_done;
1776
1777         if (out != NULL)
1778                 return errno = EINVAL,
1779                         error("setitimer param 3 != NULL not implemented");
1780         if (!is_timeval_eq(&in->it_interval, &zero) &&
1781             !is_timeval_eq(&in->it_interval, &in->it_value))
1782                 return errno = EINVAL,
1783                         error("setitimer: it_interval must be zero or eq it_value");
1784
1785         if (timer_thread)
1786                 stop_timer_thread();
1787
1788         if (is_timeval_eq(&in->it_value, &zero) &&
1789             is_timeval_eq(&in->it_interval, &zero))
1790                 return 0;
1791
1792         timer_interval = in->it_value.tv_sec * 1000 + in->it_value.tv_usec / 1000;
1793         one_shot = is_timeval_eq(&in->it_interval, &zero);
1794         if (!atexit_done) {
1795                 atexit(stop_timer_thread);
1796                 atexit_done = 1;
1797         }
1798         return start_timer_thread();
1799 }
1800
1801 int sigaction(int sig, struct sigaction *in, struct sigaction *out)
1802 {
1803         if (sig != SIGALRM)
1804                 return errno = EINVAL,
1805                         error("sigaction only implemented for SIGALRM");
1806         if (out != NULL)
1807                 return errno = EINVAL,
1808                         error("sigaction: param 3 != NULL not implemented");
1809
1810         timer_fn = in->sa_handler;
1811         return 0;
1812 }
1813
1814 #undef signal
1815 sig_handler_t mingw_signal(int sig, sig_handler_t handler)
1816 {
1817         sig_handler_t old;
1818
1819         switch (sig) {
1820         case SIGALRM:
1821                 old = timer_fn;
1822                 timer_fn = handler;
1823                 break;
1824
1825         case SIGINT:
1826                 old = sigint_fn;
1827                 sigint_fn = handler;
1828                 break;
1829
1830         default:
1831                 return signal(sig, handler);
1832         }
1833
1834         return old;
1835 }
1836
1837 #undef raise
1838 int mingw_raise(int sig)
1839 {
1840         switch (sig) {
1841         case SIGALRM:
1842                 if (timer_fn == SIG_DFL) {
1843                         if (isatty(STDERR_FILENO))
1844                                 fputs("Alarm clock\n", stderr);
1845                         exit(128 + SIGALRM);
1846                 } else if (timer_fn != SIG_IGN)
1847                         timer_fn(SIGALRM);
1848                 return 0;
1849
1850         case SIGINT:
1851                 if (sigint_fn == SIG_DFL)
1852                         exit(128 + SIGINT);
1853                 else if (sigint_fn != SIG_IGN)
1854                         sigint_fn(SIGINT);
1855                 return 0;
1856
1857         default:
1858                 return raise(sig);
1859         }
1860 }
1861
1862
1863 static const char *make_backslash_path(const char *path)
1864 {
1865         static char buf[PATH_MAX + 1];
1866         char *c;
1867
1868         if (strlcpy(buf, path, PATH_MAX) >= PATH_MAX)
1869                 die("Too long path: %.*s", 60, path);
1870
1871         for (c = buf; *c; c++) {
1872                 if (*c == '/')
1873                         *c = '\\';
1874         }
1875         return buf;
1876 }
1877
1878 void mingw_open_html(const char *unixpath)
1879 {
1880         const char *htmlpath = make_backslash_path(unixpath);
1881         typedef HINSTANCE (WINAPI *T)(HWND, const char *,
1882                         const char *, const char *, const char *, INT);
1883         T ShellExecute;
1884         HMODULE shell32;
1885         int r;
1886
1887         shell32 = LoadLibrary("shell32.dll");
1888         if (!shell32)
1889                 die("cannot load shell32.dll");
1890         ShellExecute = (T)GetProcAddress(shell32, "ShellExecuteA");
1891         if (!ShellExecute)
1892                 die("cannot run browser");
1893
1894         printf("Launching default browser to display HTML ...\n");
1895         r = HCAST(int, ShellExecute(NULL, "open", htmlpath,
1896                                 NULL, "\\", SW_SHOWNORMAL));
1897         FreeLibrary(shell32);
1898         /* see the MSDN documentation referring to the result codes here */
1899         if (r <= 32) {
1900                 die("failed to launch browser for %.*s", MAX_PATH, unixpath);
1901         }
1902 }
1903
1904 int link(const char *oldpath, const char *newpath)
1905 {
1906         typedef BOOL (WINAPI *T)(LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
1907         static T create_hard_link = NULL;
1908         wchar_t woldpath[MAX_PATH], wnewpath[MAX_PATH];
1909         if (xutftowcs_path(woldpath, oldpath) < 0 ||
1910                 xutftowcs_path(wnewpath, newpath) < 0)
1911                 return -1;
1912
1913         if (!create_hard_link) {
1914                 create_hard_link = (T) GetProcAddress(
1915                         GetModuleHandle("kernel32.dll"), "CreateHardLinkW");
1916                 if (!create_hard_link)
1917                         create_hard_link = (T)-1;
1918         }
1919         if (create_hard_link == (T)-1) {
1920                 errno = ENOSYS;
1921                 return -1;
1922         }
1923         if (!create_hard_link(wnewpath, woldpath, NULL)) {
1924                 errno = err_win_to_posix(GetLastError());
1925                 return -1;
1926         }
1927         return 0;
1928 }
1929
1930 pid_t waitpid(pid_t pid, int *status, int options)
1931 {
1932         HANDLE h = OpenProcess(SYNCHRONIZE | PROCESS_QUERY_INFORMATION,
1933             FALSE, pid);
1934         if (!h) {
1935                 errno = ECHILD;
1936                 return -1;
1937         }
1938
1939         if (pid > 0 && options & WNOHANG) {
1940                 if (WAIT_OBJECT_0 != WaitForSingleObject(h, 0)) {
1941                         CloseHandle(h);
1942                         return 0;
1943                 }
1944                 options &= ~WNOHANG;
1945         }
1946
1947         if (options == 0) {
1948                 struct pinfo_t **ppinfo;
1949                 if (WaitForSingleObject(h, INFINITE) != WAIT_OBJECT_0) {
1950                         CloseHandle(h);
1951                         return 0;
1952                 }
1953
1954                 if (status)
1955                         GetExitCodeProcess(h, (LPDWORD)status);
1956
1957                 EnterCriticalSection(&pinfo_cs);
1958
1959                 ppinfo = &pinfo;
1960                 while (*ppinfo) {
1961                         struct pinfo_t *info = *ppinfo;
1962                         if (info->pid == pid) {
1963                                 CloseHandle(info->proc);
1964                                 *ppinfo = info->next;
1965                                 free(info);
1966                                 break;
1967                         }
1968                         ppinfo = &info->next;
1969                 }
1970
1971                 LeaveCriticalSection(&pinfo_cs);
1972
1973                 CloseHandle(h);
1974                 return pid;
1975         }
1976         CloseHandle(h);
1977
1978         errno = EINVAL;
1979         return -1;
1980 }
1981
1982 int mingw_skip_dos_drive_prefix(char **path)
1983 {
1984         int ret = has_dos_drive_prefix(*path);
1985         *path += ret;
1986         return ret;
1987 }
1988
1989 int mingw_offset_1st_component(const char *path)
1990 {
1991         char *pos = (char *)path;
1992
1993         /* unc paths */
1994         if (!skip_dos_drive_prefix(&pos) &&
1995                         is_dir_sep(pos[0]) && is_dir_sep(pos[1])) {
1996                 /* skip server name */
1997                 pos = strpbrk(pos + 2, "\\/");
1998                 if (!pos)
1999                         return 0; /* Error: malformed unc path */
2000
2001                 do {
2002                         pos++;
2003                 } while (*pos && !is_dir_sep(*pos));
2004         }
2005
2006         return pos + is_dir_sep(*pos) - path;
2007 }
2008
2009 int xutftowcsn(wchar_t *wcs, const char *utfs, size_t wcslen, int utflen)
2010 {
2011         int upos = 0, wpos = 0;
2012         const unsigned char *utf = (const unsigned char*) utfs;
2013         if (!utf || !wcs || wcslen < 1) {
2014                 errno = EINVAL;
2015                 return -1;
2016         }
2017         /* reserve space for \0 */
2018         wcslen--;
2019         if (utflen < 0)
2020                 utflen = INT_MAX;
2021
2022         while (upos < utflen) {
2023                 int c = utf[upos++] & 0xff;
2024                 if (utflen == INT_MAX && c == 0)
2025                         break;
2026
2027                 if (wpos >= wcslen) {
2028                         wcs[wpos] = 0;
2029                         errno = ERANGE;
2030                         return -1;
2031                 }
2032
2033                 if (c < 0x80) {
2034                         /* ASCII */
2035                         wcs[wpos++] = c;
2036                 } else if (c >= 0xc2 && c < 0xe0 && upos < utflen &&
2037                                 (utf[upos] & 0xc0) == 0x80) {
2038                         /* 2-byte utf-8 */
2039                         c = ((c & 0x1f) << 6);
2040                         c |= (utf[upos++] & 0x3f);
2041                         wcs[wpos++] = c;
2042                 } else if (c >= 0xe0 && c < 0xf0 && upos + 1 < utflen &&
2043                                 !(c == 0xe0 && utf[upos] < 0xa0) && /* over-long encoding */
2044                                 (utf[upos] & 0xc0) == 0x80 &&
2045                                 (utf[upos + 1] & 0xc0) == 0x80) {
2046                         /* 3-byte utf-8 */
2047                         c = ((c & 0x0f) << 12);
2048                         c |= ((utf[upos++] & 0x3f) << 6);
2049                         c |= (utf[upos++] & 0x3f);
2050                         wcs[wpos++] = c;
2051                 } else if (c >= 0xf0 && c < 0xf5 && upos + 2 < utflen &&
2052                                 wpos + 1 < wcslen &&
2053                                 !(c == 0xf0 && utf[upos] < 0x90) && /* over-long encoding */
2054                                 !(c == 0xf4 && utf[upos] >= 0x90) && /* > \u10ffff */
2055                                 (utf[upos] & 0xc0) == 0x80 &&
2056                                 (utf[upos + 1] & 0xc0) == 0x80 &&
2057                                 (utf[upos + 2] & 0xc0) == 0x80) {
2058                         /* 4-byte utf-8: convert to \ud8xx \udcxx surrogate pair */
2059                         c = ((c & 0x07) << 18);
2060                         c |= ((utf[upos++] & 0x3f) << 12);
2061                         c |= ((utf[upos++] & 0x3f) << 6);
2062                         c |= (utf[upos++] & 0x3f);
2063                         c -= 0x10000;
2064                         wcs[wpos++] = 0xd800 | (c >> 10);
2065                         wcs[wpos++] = 0xdc00 | (c & 0x3ff);
2066                 } else if (c >= 0xa0) {
2067                         /* invalid utf-8 byte, printable unicode char: convert 1:1 */
2068                         wcs[wpos++] = c;
2069                 } else {
2070                         /* invalid utf-8 byte, non-printable unicode: convert to hex */
2071                         static const char *hex = "0123456789abcdef";
2072                         wcs[wpos++] = hex[c >> 4];
2073                         if (wpos < wcslen)
2074                                 wcs[wpos++] = hex[c & 0x0f];
2075                 }
2076         }
2077         wcs[wpos] = 0;
2078         return wpos;
2079 }
2080
2081 int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen)
2082 {
2083         if (!wcs || !utf || utflen < 1) {
2084                 errno = EINVAL;
2085                 return -1;
2086         }
2087         utflen = WideCharToMultiByte(CP_UTF8, 0, wcs, -1, utf, utflen, NULL, NULL);
2088         if (utflen)
2089                 return utflen - 1;
2090         errno = ERANGE;
2091         return -1;
2092 }
2093
2094 static void setup_windows_environment()
2095 {
2096         char *tmp = getenv("TMPDIR");
2097
2098         /* on Windows it is TMP and TEMP */
2099         if (!tmp) {
2100                 if (!(tmp = getenv("TMP")))
2101                         tmp = getenv("TEMP");
2102                 if (tmp) {
2103                         setenv("TMPDIR", tmp, 1);
2104                         tmp = getenv("TMPDIR");
2105                 }
2106         }
2107
2108         if (tmp) {
2109                 /*
2110                  * Convert all dir separators to forward slashes,
2111                  * to help shell commands called from the Git
2112                  * executable (by not mistaking the dir separators
2113                  * for escape characters).
2114                  */
2115                 for (; *tmp; tmp++)
2116                         if (*tmp == '\\')
2117                                 *tmp = '/';
2118         }
2119
2120         /* simulate TERM to enable auto-color (see color.c) */
2121         if (!getenv("TERM"))
2122                 setenv("TERM", "cygwin", 1);
2123 }
2124
2125 /*
2126  * Disable MSVCRT command line wildcard expansion (__getmainargs called from
2127  * mingw startup code, see init.c in mingw runtime).
2128  */
2129 int _CRT_glob = 0;
2130
2131 typedef struct {
2132         int newmode;
2133 } _startupinfo;
2134
2135 extern int __wgetmainargs(int *argc, wchar_t ***argv, wchar_t ***env, int glob,
2136                 _startupinfo *si);
2137
2138 static NORETURN void die_startup()
2139 {
2140         fputs("fatal: not enough memory for initialization", stderr);
2141         exit(128);
2142 }
2143
2144 static void *malloc_startup(size_t size)
2145 {
2146         void *result = malloc(size);
2147         if (!result)
2148                 die_startup();
2149         return result;
2150 }
2151
2152 static char *wcstoutfdup_startup(char *buffer, const wchar_t *wcs, size_t len)
2153 {
2154         len = xwcstoutf(buffer, wcs, len) + 1;
2155         return memcpy(malloc_startup(len), buffer, len);
2156 }
2157
2158 void mingw_startup()
2159 {
2160         int i, maxlen, argc;
2161         char *buffer;
2162         wchar_t **wenv, **wargv;
2163         _startupinfo si;
2164
2165         /* get wide char arguments and environment */
2166         si.newmode = 0;
2167         if (__wgetmainargs(&argc, &wargv, &wenv, _CRT_glob, &si) < 0)
2168                 die_startup();
2169
2170         /* determine size of argv and environ conversion buffer */
2171         maxlen = wcslen(_wpgmptr);
2172         for (i = 1; i < argc; i++)
2173                 maxlen = max(maxlen, wcslen(wargv[i]));
2174         for (i = 0; wenv[i]; i++)
2175                 maxlen = max(maxlen, wcslen(wenv[i]));
2176
2177         /*
2178          * nedmalloc can't free CRT memory, allocate resizable environment
2179          * list. Note that xmalloc / xmemdupz etc. call getenv, so we cannot
2180          * use it while initializing the environment itself.
2181          */
2182         environ_size = i + 1;
2183         environ_alloc = alloc_nr(environ_size * sizeof(char*));
2184         environ = malloc_startup(environ_alloc);
2185
2186         /* allocate buffer (wchar_t encodes to max 3 UTF-8 bytes) */
2187         maxlen = 3 * maxlen + 1;
2188         buffer = malloc_startup(maxlen);
2189
2190         /* convert command line arguments and environment to UTF-8 */
2191         __argv[0] = wcstoutfdup_startup(buffer, _wpgmptr, maxlen);
2192         for (i = 1; i < argc; i++)
2193                 __argv[i] = wcstoutfdup_startup(buffer, wargv[i], maxlen);
2194         for (i = 0; wenv[i]; i++)
2195                 environ[i] = wcstoutfdup_startup(buffer, wenv[i], maxlen);
2196         environ[i] = NULL;
2197         free(buffer);
2198
2199         /* sort environment for O(log n) getenv / putenv */
2200         qsort(environ, i, sizeof(char*), compareenv);
2201
2202         /* fix Windows specific environment settings */
2203         setup_windows_environment();
2204
2205         /* initialize critical section for waitpid pinfo_t list */
2206         InitializeCriticalSection(&pinfo_cs);
2207
2208         /* set up default file mode and file modes for stdin/out/err */
2209         _fmode = _O_BINARY;
2210         _setmode(_fileno(stdin), _O_BINARY);
2211         _setmode(_fileno(stdout), _O_BINARY);
2212         _setmode(_fileno(stderr), _O_BINARY);
2213
2214         /* initialize Unicode console */
2215         winansi_init();
2216 }
2217
2218 int uname(struct utsname *buf)
2219 {
2220         unsigned v = (unsigned)GetVersion();
2221         memset(buf, 0, sizeof(*buf));
2222         xsnprintf(buf->sysname, sizeof(buf->sysname), "Windows");
2223         xsnprintf(buf->release, sizeof(buf->release),
2224                  "%u.%u", v & 0xff, (v >> 8) & 0xff);
2225         /* assuming NT variants only.. */
2226         xsnprintf(buf->version, sizeof(buf->version),
2227                   "%u", (v >> 16) & 0x7fff);
2228         return 0;
2229 }