summaryrefslogtreecommitdiff
path: root/src/win32
diff options
context:
space:
mode:
authorRussell Belfer <arrbee@arrbee.com>2012-03-14 17:36:15 -0700
committerRussell Belfer <arrbee@arrbee.com>2012-03-14 17:36:15 -0700
commitdeafee7bd7a9e2efcdff90627b6094d8c1519319 (patch)
tree4b11910d7d315a6db667cc4af4c6749630612ed3 /src/win32
parentab43ad2fd822504446e7876d6352c968a74beb53 (diff)
downloadlibgit2-deafee7bd7a9e2efcdff90627b6094d8c1519319.tar.gz
Continue error conversion
This converts blob.c, fileops.c, and all of the win32 files. Also, various minor cleanups throughout the code. Plus, in testing the win32 build, I cleaned up a bunch (although not all) of the warnings with the 64-bit build.
Diffstat (limited to 'src/win32')
-rw-r--r--src/win32/dir.c88
-rw-r--r--src/win32/posix_w32.c189
-rw-r--r--src/win32/pthread.c13
-rw-r--r--src/win32/utf-conv.c20
4 files changed, 180 insertions, 130 deletions
diff --git a/src/win32/dir.c b/src/win32/dir.c
index 035e2b685..bc3d40fa5 100644
--- a/src/win32/dir.c
+++ b/src/win32/dir.c
@@ -27,8 +27,8 @@ static int init_filter(char *filter, size_t n, const char *dir)
git__DIR *git__opendir(const char *dir)
{
char filter[4096];
- wchar_t* filter_w;
- git__DIR *new;
+ wchar_t* filter_w = NULL;
+ git__DIR *new = NULL;
if (!dir || !init_filter(filter, sizeof(filter), dir))
return NULL;
@@ -37,25 +37,29 @@ git__DIR *git__opendir(const char *dir)
if (!new)
return NULL;
- new->dir = git__malloc(strlen(dir)+1);
- if (!new->dir) {
- git__free(new);
- return NULL;
- }
- strcpy(new->dir, dir);
+ new->dir = git__strdup(dir);
+ if (!new->dir)
+ goto fail;
filter_w = gitwin_to_utf16(filter);
+ if (!filter_w)
+ goto fail;
+
new->h = FindFirstFileW(filter_w, &new->f);
git__free(filter_w);
if (new->h == INVALID_HANDLE_VALUE) {
- git__free(new->dir);
- git__free(new);
- return NULL;
+ giterr_set(GITERR_OS, "Could not open directory '%s'", dir);
+ goto fail;
}
- new->first = 1;
+ new->first = 1;
return new;
+
+fail:
+ git__free(new->dir);
+ git__free(new);
+ return NULL;
}
int git__readdir_ext(
@@ -67,22 +71,32 @@ int git__readdir_ext(
if (!d || !entry || !result || d->h == INVALID_HANDLE_VALUE)
return -1;
+ *result = NULL;
+
if (d->first)
d->first = 0;
else if (!FindNextFileW(d->h, &d->f)) {
- *result = NULL;
- return 0;
+ if (GetLastError() == ERROR_NO_MORE_FILES)
+ return 0;
+ giterr_set(GITERR_OS, "Could not read from directory '%s'", d->dir);
+ return -1;
}
if (wcslen(d->f.cFileName) >= sizeof(entry->d_name))
return -1;
entry->d_ino = 0;
- WideCharToMultiByte(
+
+ if (WideCharToMultiByte(
gitwin_get_codepage(), 0, d->f.cFileName, -1,
- entry->d_name, GIT_PATH_MAX, NULL, NULL);
+ entry->d_name, GIT_PATH_MAX, NULL, NULL) == 0)
+ {
+ giterr_set(GITERR_OS, "Could not convert filename to UTF-8");
+ return -1;
+ }
*result = entry;
+
if (is_dir != NULL)
*is_dir = ((d->f.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
@@ -102,32 +116,40 @@ void git__rewinddir(git__DIR *d)
char filter[4096];
wchar_t* filter_w;
- if (d) {
- if (d->h != INVALID_HANDLE_VALUE)
- FindClose(d->h);
+ if (!d)
+ return;
+
+ if (d->h != INVALID_HANDLE_VALUE) {
+ FindClose(d->h);
d->h = INVALID_HANDLE_VALUE;
d->first = 0;
+ }
- if (init_filter(filter, sizeof(filter), d->dir)) {
- filter_w = gitwin_to_utf16(filter);
- d->h = FindFirstFileW(filter_w, &d->f);
- git__free(filter_w);
+ if (!init_filter(filter, sizeof(filter), d->dir) ||
+ (filter_w = gitwin_to_utf16(filter)) == NULL)
+ return;
- if (d->h != INVALID_HANDLE_VALUE)
- d->first = 1;
- }
- }
+ d->h = FindFirstFileW(filter_w, &d->f);
+ git__free(filter_w);
+
+ if (d->h == INVALID_HANDLE_VALUE)
+ giterr_set(GITERR_OS, "Could not open directory '%s'", d->dir);
+ else
+ d->first = 1;
}
int git__closedir(git__DIR *d)
{
- if (d) {
- if (d->h != INVALID_HANDLE_VALUE)
- FindClose(d->h);
- if (d->dir)
- git__free(d->dir);
- git__free(d);
+ if (!d)
+ return 0;
+
+ if (d->h != INVALID_HANDLE_VALUE) {
+ FindClose(d->h);
+ d->h = INVALID_HANDLE_VALUE;
}
+ git__free(d->dir);
+ d->dir = NULL;
+ git__free(d);
return 0;
}
diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c
index a9158980b..c6b36a847 100644
--- a/src/win32/posix_w32.c
+++ b/src/win32/posix_w32.c
@@ -17,10 +17,11 @@ int p_unlink(const char *path)
int ret = 0;
wchar_t* buf;
- buf = gitwin_to_utf16(path);
- _wchmod(buf, 0666);
- ret = _wunlink(buf);
- git__free(buf);
+ if ((buf = gitwin_to_utf16(path)) != NULL) {
+ _wchmod(buf, 0666);
+ ret = _wunlink(buf);
+ git__free(buf);
+ }
return ret;
}
@@ -60,6 +61,8 @@ static int do_lstat(const char *file_name, struct stat *buf)
{
WIN32_FILE_ATTRIBUTE_DATA fdata;
wchar_t* fbuf = gitwin_to_utf16(file_name);
+ if (!fbuf)
+ return -1;
if (GetFileAttributesExW(fbuf, GetFileExInfoStandard, &fdata)) {
int fMode = S_IREAD;
@@ -87,54 +90,43 @@ static int do_lstat(const char *file_name, struct stat *buf)
buf->st_ctime = filetime_to_time_t(&(fdata.ftCreationTime));
git__free(fbuf);
- return GIT_SUCCESS;
+ return 0;
}
git__free(fbuf);
-
- switch (GetLastError()) {
- case ERROR_ACCESS_DENIED:
- case ERROR_SHARING_VIOLATION:
- case ERROR_LOCK_VIOLATION:
- case ERROR_SHARING_BUFFER_EXCEEDED:
- return GIT_EOSERR;
-
- case ERROR_BUFFER_OVERFLOW:
- case ERROR_NOT_ENOUGH_MEMORY:
- return GIT_ENOMEM;
-
- default:
- return GIT_EINVALIDPATH;
- }
+ return -1;
}
int p_lstat(const char *file_name, struct stat *buf)
{
- int namelen, error;
- char alt_name[GIT_PATH_MAX];
+ int error;
+ size_t namelen;
+ char *alt_name;
- if ((error = do_lstat(file_name, buf)) == GIT_SUCCESS)
- return GIT_SUCCESS;
+ if (do_lstat(file_name, buf) == 0)
+ return 0;
/* if file_name ended in a '/', Windows returned ENOENT;
* try again without trailing slashes
*/
- if (error != GIT_EINVALIDPATH)
- return git__throw(GIT_EOSERR, "Failed to lstat file");
-
namelen = strlen(file_name);
if (namelen && file_name[namelen-1] != '/')
- return git__throw(GIT_EOSERR, "Failed to lstat file");
+ return -1;
while (namelen && file_name[namelen-1] == '/')
--namelen;
- if (!namelen || namelen >= GIT_PATH_MAX)
- return git__throw(GIT_ENOMEM, "Failed to lstat file");
+ if (!namelen)
+ return -1;
+
+ alt_name = git__strndup(file_name, namelen);
+ if (!alt_name)
+ return -1;
+
+ error = do_lstat(alt_name, buf);
- memcpy(alt_name, file_name, namelen);
- alt_name[namelen] = 0;
- return do_lstat(alt_name, buf);
+ git__free(alt_name);
+ return error;
}
int p_readlink(const char *link, char *target, size_t target_len)
@@ -145,6 +137,9 @@ int p_readlink(const char *link, char *target, size_t target_len)
DWORD dwRet;
wchar_t* link_w;
wchar_t* target_w;
+ int error = 0;
+
+ assert(link && target && target_len > 0);
/*
* Try to load the pointer to pGetFinalPath dynamically, because
@@ -156,12 +151,15 @@ int p_readlink(const char *link, char *target, size_t target_len)
if (library != NULL)
pGetFinalPath = (fpath_func)GetProcAddress(library, "GetFinalPathNameByHandleW");
- if (pGetFinalPath == NULL)
- return git__throw(GIT_EOSERR,
+ if (pGetFinalPath == NULL) {
+ giterr_set(GITERR_OS,
"'GetFinalPathNameByHandleW' is not available in this platform");
+ return -1;
+ }
}
link_w = gitwin_to_utf16(link);
+ GITERR_CHECK_ALLOC(link_w);
hFile = CreateFileW(link_w, // file to open
GENERIC_READ, // open for reading
@@ -173,50 +171,49 @@ int p_readlink(const char *link, char *target, size_t target_len)
git__free(link_w);
- if (hFile == INVALID_HANDLE_VALUE)
- return GIT_EOSERR;
-
- if (target_len <= 0) {
- return GIT_EINVALIDARGS;
+ if (hFile == INVALID_HANDLE_VALUE) {
+ giterr_set(GITERR_OS, "Cannot open '%s' for reading", link);
+ return -1;
}
target_w = (wchar_t*)git__malloc(target_len * sizeof(wchar_t));
+ GITERR_CHECK_ALLOC(target_w);
dwRet = pGetFinalPath(hFile, target_w, target_len, 0x0);
- if (dwRet >= target_len) {
- git__free(target_w);
- CloseHandle(hFile);
- return GIT_ENOMEM;
- }
-
- if (!WideCharToMultiByte(CP_UTF8, 0, target_w, -1, target, target_len * sizeof(char), NULL, NULL)) {
- git__free(target_w);
- return GIT_EOSERR;
- }
+ if (dwRet == 0 ||
+ dwRet >= target_len ||
+ !WideCharToMultiByte(CP_UTF8, 0, target_w, -1, target,
+ target_len * sizeof(char), NULL, NULL))
+ error = -1;
git__free(target_w);
CloseHandle(hFile);
- if (dwRet > 4) {
- /* Skip first 4 characters if they are "\\?\" */
- if (target[0] == '\\' && target[1] == '\\' && target[2] == '?' && target[3] == '\\') {
- char tmp[GIT_PATH_MAX];
- unsigned int offset = 4;
- dwRet -= 4;
-
- /* \??\UNC\ */
- if (dwRet > 7 && target[4] == 'U' && target[5] == 'N' && target[6] == 'C') {
- offset += 2;
- dwRet -= 2;
- target[offset] = '\\';
- }
-
- memcpy(tmp, target + offset, dwRet);
- memcpy(target, tmp, dwRet);
+ if (error)
+ return error;
+
+ /* Skip first 4 characters if they are "\\?\" */
+ if (dwRet > 4 &&
+ target[0] == '\\' && target[1] == '\\' &&
+ target[2] == '?' && target[3] == '\\')
+ {
+ unsigned int offset = 4;
+ dwRet -= 4;
+
+ /* \??\UNC\ */
+ if (dwRet > 7 &&
+ target[4] == 'U' && target[5] == 'N' && target[6] == 'C')
+ {
+ offset += 2;
+ dwRet -= 2;
+ target[offset] = '\\';
}
+
+ memmove(target, target + offset, dwRet);
}
target[dwRet] = '\0';
+
return dwRet;
}
@@ -224,8 +221,9 @@ int p_open(const char *path, int flags)
{
int fd;
wchar_t* buf = gitwin_to_utf16(path);
+ if (!buf)
+ return -1;
fd = _wopen(buf, flags | _O_BINARY);
-
git__free(buf);
return fd;
}
@@ -234,8 +232,9 @@ int p_creat(const char *path, mode_t mode)
{
int fd;
wchar_t* buf = gitwin_to_utf16(path);
+ if (!buf)
+ return -1;
fd = _wopen(buf, _O_WRONLY | _O_CREAT | _O_TRUNC | _O_BINARY, mode);
-
git__free(buf);
return fd;
}
@@ -243,15 +242,15 @@ int p_creat(const char *path, mode_t mode)
int p_getcwd(char *buffer_out, size_t size)
{
wchar_t* buf = (wchar_t*)git__malloc(sizeof(wchar_t) * (int)size);
+ int ret;
+
_wgetcwd(buf, (int)size);
- if (!WideCharToMultiByte(CP_UTF8, 0, buf, -1, buffer_out, size, NULL, NULL)) {
- git__free(buf);
- return GIT_EOSERR;
- }
+ ret = WideCharToMultiByte(
+ CP_UTF8, 0, buf, -1, buffer_out, size, NULL, NULL);
git__free(buf);
- return GIT_SUCCESS;
+ return !ret ? -1 : 0;
}
int p_stat(const char* path, struct stat* buf)
@@ -262,8 +261,10 @@ int p_stat(const char* path, struct stat* buf)
int p_chdir(const char* path)
{
wchar_t* buf = gitwin_to_utf16(path);
- int ret = _wchdir(buf);
-
+ int ret;
+ if (!buf)
+ return -1;
+ ret = _wchdir(buf);
git__free(buf);
return ret;
}
@@ -271,8 +272,10 @@ int p_chdir(const char* path)
int p_chmod(const char* path, mode_t mode)
{
wchar_t* buf = gitwin_to_utf16(path);
- int ret = _wchmod(buf, mode);
-
+ int ret;
+ if (!buf)
+ return -1;
+ ret = _wchmod(buf, mode);
git__free(buf);
return ret;
}
@@ -280,8 +283,10 @@ int p_chmod(const char* path, mode_t mode)
int p_rmdir(const char* path)
{
wchar_t* buf = gitwin_to_utf16(path);
- int ret = _wrmdir(buf);
-
+ int ret;
+ if (!buf)
+ return -1;
+ ret = _wrmdir(buf);
git__free(buf);
return ret;
}
@@ -290,11 +295,13 @@ int p_hide_directory__w32(const char *path)
{
int res;
wchar_t* buf = gitwin_to_utf16(path);
+ if (!buf)
+ return -1;
res = SetFileAttributesW(buf, FILE_ATTRIBUTE_HIDDEN);
git__free(buf);
-
- return (res != 0) ? GIT_SUCCESS : GIT_ERROR; /* MSDN states a "non zero" value indicates a success */
+
+ return (res != 0) ? 0 : -1; /* MSDN states a "non zero" value indicates a success */
}
char *p_realpath(const char *orig_path, char *buffer)
@@ -303,6 +310,9 @@ char *p_realpath(const char *orig_path, char *buffer)
wchar_t* orig_path_w = gitwin_to_utf16(orig_path);
wchar_t* buffer_w = (wchar_t*)git__malloc(GIT_PATH_MAX * sizeof(wchar_t));
+ if (!orig_path_w || !buffer_w)
+ return NULL;
+
ret = GetFullPathNameW(orig_path_w, GIT_PATH_MAX, buffer_w, NULL);
git__free(orig_path_w);
@@ -365,10 +375,10 @@ int p_mkstemp(char *tmp_path)
{
#if defined(_MSC_VER)
if (_mktemp_s(tmp_path, strlen(tmp_path) + 1) != 0)
- return GIT_EOSERR;
+ return -1;
#else
if (_mktemp(tmp_path) == NULL)
- return GIT_EOSERR;
+ return -1;
#endif
return p_creat(tmp_path, 0744);
@@ -377,15 +387,17 @@ int p_mkstemp(char *tmp_path)
int p_setenv(const char* name, const char* value, int overwrite)
{
if (overwrite != 1)
- return EINVAL;
+ return -1;
- return (SetEnvironmentVariableA(name, value) == 0 ? GIT_EOSERR : GIT_SUCCESS);
+ return (SetEnvironmentVariableA(name, value) == 0 ? -1 : 0);
}
int p_access(const char* path, mode_t mode)
{
wchar_t *buf = gitwin_to_utf16(path);
int ret;
+ if (!buf)
+ return -1;
ret = _waccess(buf, mode);
git__free(buf);
@@ -393,13 +405,16 @@ int p_access(const char* path, mode_t mode)
return ret;
}
-extern int p_rename(const char *from, const char *to)
+int p_rename(const char *from, const char *to)
{
wchar_t *wfrom = gitwin_to_utf16(from);
wchar_t *wto = gitwin_to_utf16(to);
int ret;
- ret = MoveFileExW(wfrom, wto, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) ? GIT_SUCCESS : GIT_EOSERR;
+ if (!wfrom || !wto)
+ return -1;
+
+ ret = MoveFileExW(wfrom, wto, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED) ? 0 : -1;
git__free(wfrom);
git__free(wto);
diff --git a/src/win32/pthread.c b/src/win32/pthread.c
index 3db536848..3a186c8d9 100644
--- a/src/win32/pthread.c
+++ b/src/win32/pthread.c
@@ -7,13 +7,16 @@
#include "pthread.h"
-int pthread_create(pthread_t *GIT_RESTRICT thread,
- const pthread_attr_t *GIT_RESTRICT attr,
- void *(*start_routine)(void*), void *GIT_RESTRICT arg)
+int pthread_create(
+ pthread_t *GIT_RESTRICT thread,
+ const pthread_attr_t *GIT_RESTRICT attr,
+ void *(*start_routine)(void*),
+ void *GIT_RESTRICT arg)
{
GIT_UNUSED(attr);
- *thread = (pthread_t) CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);
- return *thread ? GIT_SUCCESS : git__throw(GIT_EOSERR, "Failed to create pthread");
+ *thread = (pthread_t) CreateThread(
+ NULL, 0, (LPTHREAD_START_ROUTINE)start_routine, arg, 0, NULL);
+ return *thread ? 0 : -1;
}
int pthread_join(pthread_t thread, void **value_ptr)
diff --git a/src/win32/utf-conv.c b/src/win32/utf-conv.c
index 3c8be81d1..f00f5be92 100644
--- a/src/win32/utf-conv.c
+++ b/src/win32/utf-conv.c
@@ -33,14 +33,14 @@ wchar_t* gitwin_to_utf16(const char* str)
wchar_t* ret;
int cb;
- if (!str) {
+ if (!str)
return NULL;
- }
cb = strlen(str) * sizeof(wchar_t);
if (cb == 0) {
ret = (wchar_t*)git__malloc(sizeof(wchar_t));
- ret[0] = 0;
+ if (ret)
+ ret[0] = 0;
return ret;
}
@@ -48,8 +48,11 @@ wchar_t* gitwin_to_utf16(const char* str)
cb += sizeof(wchar_t);
ret = (wchar_t*)git__malloc(cb);
+ if (!ret)
+ return NULL;
if (MultiByteToWideChar(_active_codepage, 0, str, -1, ret, cb) == 0) {
+ giterr_set(GITERR_OS, "Could not convert string to UTF-16");
git__free(ret);
ret = NULL;
}
@@ -59,7 +62,10 @@ wchar_t* gitwin_to_utf16(const char* str)
int gitwin_append_utf16(wchar_t *buffer, const char *str, size_t len)
{
- return MultiByteToWideChar(_active_codepage, 0, str, -1, buffer, len);
+ int result = MultiByteToWideChar(_active_codepage, 0, str, -1, buffer, len);
+ if (result == 0)
+ giterr_set(GITERR_OS, "Could not convert string to UTF-16");
+ return result;
}
char* gitwin_from_utf16(const wchar_t* str)
@@ -74,7 +80,8 @@ char* gitwin_from_utf16(const wchar_t* str)
cb = wcslen(str) * sizeof(char);
if (cb == 0) {
ret = (char*)git__malloc(sizeof(char));
- ret[0] = 0;
+ if (ret)
+ ret[0] = 0;
return ret;
}
@@ -82,8 +89,11 @@ char* gitwin_from_utf16(const wchar_t* str)
cb += sizeof(char);
ret = (char*)git__malloc(cb);
+ if (!ret)
+ return NULL;
if (WideCharToMultiByte(_active_codepage, 0, str, -1, ret, cb, NULL, NULL) == 0) {
+ giterr_set(GITERR_OS, "Could not convert string to UTF-8");
git__free(ret);
ret = NULL;
}