]>
Commit | Line | Data |
---|---|---|
02f9e637 | 1 | /* |
5e0de328 | 2 | * Copyright (C) 2009-2012 the libgit2 contributors |
02f9e637 | 3 | * |
bb742ede VM |
4 | * This file is part of libgit2, distributed under the GNU GPL v2 with |
5 | * a Linking Exception. For full terms see the included COPYING file. | |
02f9e637 | 6 | */ |
ae234862 | 7 | #include "common.h" |
a15c550d | 8 | #include "global.h" |
60bc2d20 | 9 | #include "posix.h" |
22772166 | 10 | #include "buffer.h" |
02f9e637 VM |
11 | #include <stdarg.h> |
12 | ||
60bc2d20 VM |
13 | /******************************************** |
14 | * New error handling | |
15 | ********************************************/ | |
16 | ||
1a481123 VM |
17 | static git_error g_git_oom_error = { |
18 | "Out of memory", | |
19 | GITERR_NOMEMORY | |
20 | }; | |
21 | ||
22772166 VM |
22 | static void set_error(int error_class, char *string) |
23 | { | |
24 | git_error *error = &GIT_GLOBAL->error_t; | |
25 | ||
26 | git__free(error->message); | |
27 | ||
28 | error->message = string; | |
29 | error->klass = error_class; | |
30 | ||
31 | GIT_GLOBAL->last_error = error; | |
32 | } | |
33 | ||
1a481123 VM |
34 | void giterr_set_oom(void) |
35 | { | |
36 | GIT_GLOBAL->last_error = &g_git_oom_error; | |
37 | } | |
38 | ||
39 | void giterr_set(int error_class, const char *string, ...) | |
60bc2d20 | 40 | { |
22772166 | 41 | git_buf buf = GIT_BUF_INIT; |
60bc2d20 | 42 | va_list arglist; |
60bc2d20 | 43 | |
22772166 VM |
44 | int unix_error_code = 0; |
45 | ||
46 | #ifdef GIT_WIN32 | |
47 | DWORD win32_error_code = 0; | |
48 | #endif | |
49 | ||
50 | if (error_class == GITERR_OS) { | |
51 | unix_error_code = errno; | |
52 | errno = 0; | |
53 | ||
e3c47510 | 54 | #ifdef GIT_WIN32 |
22772166 VM |
55 | win32_error_code = GetLastError(); |
56 | SetLastError(0); | |
e3c47510 | 57 | #endif |
22772166 | 58 | } |
e3c47510 | 59 | |
60bc2d20 | 60 | va_start(arglist, string); |
22772166 | 61 | git_buf_vprintf(&buf, string, arglist); |
60bc2d20 VM |
62 | va_end(arglist); |
63 | ||
ae9e29fd | 64 | /* automatically suffix strerror(errno) for GITERR_OS errors */ |
dda708e7 | 65 | if (error_class == GITERR_OS) { |
22772166 VM |
66 | |
67 | if (unix_error_code != 0) { | |
68 | git_buf_PUTS(&buf, ": "); | |
69 | git_buf_puts(&buf, strerror(unix_error_code)); | |
e1de726c | 70 | } |
22772166 | 71 | |
e1de726c | 72 | #ifdef GIT_WIN32 |
22772166 | 73 | else if (win32_error_code != 0) { |
e3c47510 | 74 | LPVOID lpMsgBuf = NULL; |
e1de726c RB |
75 | |
76 | FormatMessage( | |
77 | FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
78 | FORMAT_MESSAGE_FROM_SYSTEM | | |
79 | FORMAT_MESSAGE_IGNORE_INSERTS, | |
22772166 | 80 | NULL, win32_error_code, 0, (LPTSTR) &lpMsgBuf, 0, NULL); |
e1de726c RB |
81 | |
82 | if (lpMsgBuf) { | |
22772166 VM |
83 | git_buf_PUTS(&buf, ": "); |
84 | git_buf_puts(&buf, lpMsgBuf); | |
e1de726c RB |
85 | LocalFree(lpMsgBuf); |
86 | } | |
87 | } | |
88 | #endif | |
ae9e29fd RB |
89 | } |
90 | ||
22772166 VM |
91 | if (!git_buf_oom(&buf)) |
92 | set_error(error_class, git_buf_detach(&buf)); | |
dda708e7 VM |
93 | } |
94 | ||
95 | void giterr_set_str(int error_class, const char *string) | |
96 | { | |
22772166 | 97 | char *message = git__strdup(string); |
dda708e7 | 98 | |
22772166 VM |
99 | if (message) |
100 | set_error(error_class, message); | |
60bc2d20 VM |
101 | } |
102 | ||
dda708e7 VM |
103 | void giterr_set_regex(const regex_t *regex, int error_code) |
104 | { | |
105 | char error_buf[1024]; | |
106 | regerror(error_code, regex, error_buf, sizeof(error_buf)); | |
107 | giterr_set_str(GITERR_REGEX, error_buf); | |
108 | } | |
109 | ||
1a481123 | 110 | void giterr_clear(void) |
60bc2d20 | 111 | { |
1a481123 | 112 | GIT_GLOBAL->last_error = NULL; |
97a17e4e RB |
113 | |
114 | errno = 0; | |
115 | #ifdef GIT_WIN32 | |
116 | SetLastError(0); | |
117 | #endif | |
60bc2d20 | 118 | } |
e3c47510 | 119 | |
3fbcac89 | 120 | const git_error *giterr_last(void) |
e3c47510 RB |
121 | { |
122 | return GIT_GLOBAL->last_error; | |
123 | } | |
124 |