diff options
Diffstat (limited to 'src/errors.c')
-rw-r--r-- | src/errors.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/src/errors.c b/src/errors.c index d43d7d9b5..e2629f69e 100644 --- a/src/errors.c +++ b/src/errors.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2012 the libgit2 contributors + * Copyright (C) the libgit2 contributors. All rights reserved. * * This file is part of libgit2, distributed under the GNU GPL v2 with * a Linking Exception. For full terms see the included COPYING file. @@ -40,52 +40,34 @@ void giterr_set(int error_class, const char *string, ...) { git_buf buf = GIT_BUF_INIT; va_list arglist; - - int unix_error_code = 0; - -#ifdef GIT_WIN32 - DWORD win32_error_code = 0; -#endif - - if (error_class == GITERR_OS) { - unix_error_code = errno; - errno = 0; - #ifdef GIT_WIN32 - win32_error_code = GetLastError(); - SetLastError(0); + DWORD win32_error_code = (error_class == GITERR_OS) ? GetLastError() : 0; #endif - } + int error_code = (error_class == GITERR_OS) ? errno : 0; va_start(arglist, string); git_buf_vprintf(&buf, string, arglist); va_end(arglist); - /* automatically suffix strerror(errno) for GITERR_OS errors */ if (error_class == GITERR_OS) { - - if (unix_error_code != 0) { +#ifdef GIT_WIN32 + char * win32_error = git_win32_get_error_message(win32_error_code); + if (win32_error) { git_buf_PUTS(&buf, ": "); - git_buf_puts(&buf, strerror(unix_error_code)); - } + git_buf_puts(&buf, win32_error); + git__free(win32_error); -#ifdef GIT_WIN32 - else if (win32_error_code != 0) { - LPVOID lpMsgBuf = NULL; - - FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, win32_error_code, 0, (LPTSTR) &lpMsgBuf, 0, NULL); - - if (lpMsgBuf) { - git_buf_PUTS(&buf, ": "); - git_buf_puts(&buf, lpMsgBuf); - LocalFree(lpMsgBuf); - } + SetLastError(0); } + else #endif + if (error_code) { + git_buf_PUTS(&buf, ": "); + git_buf_puts(&buf, strerror(error_code)); + } + + if (error_code) + errno = 0; } if (!git_buf_oom(&buf)) @@ -94,22 +76,40 @@ void giterr_set(int error_class, const char *string, ...) void giterr_set_str(int error_class, const char *string) { - char *message = git__strdup(string); + char *message; + + assert(string); + + message = git__strdup(string); if (message) set_error(error_class, message); } -void giterr_set_regex(const regex_t *regex, int error_code) +int giterr_set_regex(const regex_t *regex, int error_code) { char error_buf[1024]; + + assert(error_code); + regerror(error_code, regex, error_buf, sizeof(error_buf)); giterr_set_str(GITERR_REGEX, error_buf); + + if (error_code == REG_NOMATCH) + return GIT_ENOTFOUND; + + return GIT_EINVALIDSPEC; } void giterr_clear(void) { + set_error(0, NULL); GIT_GLOBAL->last_error = NULL; + + errno = 0; +#ifdef GIT_WIN32 + SetLastError(0); +#endif } const git_error *giterr_last(void) |