]>
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; |
3ae0aad7 RB |
43 | #ifdef GIT_WIN32 |
44 | DWORD win32_error_code = (error_class == GITERR_OS) ? GetLastError() : 0; | |
45 | #endif | |
46 | int error_code = (error_class == GITERR_OS) ? errno : 0; | |
60bc2d20 VM |
47 | |
48 | va_start(arglist, string); | |
22772166 | 49 | git_buf_vprintf(&buf, string, arglist); |
60bc2d20 VM |
50 | va_end(arglist); |
51 | ||
dda708e7 | 52 | if (error_class == GITERR_OS) { |
e1de726c | 53 | #ifdef GIT_WIN32 |
8f624a47 PK |
54 | if (win32_error_code) { |
55 | char *lpMsgBuf; | |
e1de726c | 56 | |
8f624a47 PK |
57 | if (FormatMessageA( |
58 | FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
59 | FORMAT_MESSAGE_FROM_SYSTEM | | |
60 | FORMAT_MESSAGE_IGNORE_INSERTS, | |
61 | NULL, win32_error_code, 0, (LPSTR)&lpMsgBuf, 0, NULL)) { | |
22772166 VM |
62 | git_buf_PUTS(&buf, ": "); |
63 | git_buf_puts(&buf, lpMsgBuf); | |
e1de726c RB |
64 | LocalFree(lpMsgBuf); |
65 | } | |
8f624a47 PK |
66 | |
67 | SetLastError(0); | |
e1de726c | 68 | } |
8f624a47 | 69 | else |
e1de726c | 70 | #endif |
8f624a47 PK |
71 | if (error_code) { |
72 | git_buf_PUTS(&buf, ": "); | |
73 | git_buf_puts(&buf, strerror(error_code)); | |
74 | } | |
75 | ||
76 | if (error_code) | |
77 | errno = 0; | |
ae9e29fd RB |
78 | } |
79 | ||
22772166 VM |
80 | if (!git_buf_oom(&buf)) |
81 | set_error(error_class, git_buf_detach(&buf)); | |
dda708e7 VM |
82 | } |
83 | ||
84 | void giterr_set_str(int error_class, const char *string) | |
85 | { | |
1a628100 RB |
86 | char *message; |
87 | ||
88 | assert(string); | |
89 | ||
90 | message = git__strdup(string); | |
dda708e7 | 91 | |
22772166 VM |
92 | if (message) |
93 | set_error(error_class, message); | |
60bc2d20 VM |
94 | } |
95 | ||
cc146626 | 96 | int giterr_set_regex(const regex_t *regex, int error_code) |
dda708e7 VM |
97 | { |
98 | char error_buf[1024]; | |
99 | regerror(error_code, regex, error_buf, sizeof(error_buf)); | |
100 | giterr_set_str(GITERR_REGEX, error_buf); | |
cc146626 | 101 | |
102 | if (error_code == REG_NOMATCH) | |
103 | return GIT_ENOTFOUND; | |
104 | else if (error_code > REG_BADPAT) | |
105 | return GIT_EINVALIDSPEC; | |
106 | else | |
107 | return -1; | |
dda708e7 VM |
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 |