2 * Copyright (C) the libgit2 contributors. All rights reserved.
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.
12 /********************************************
14 ********************************************/
16 static git_error g_git_oom_error
= {
21 static void set_error_from_buffer(int error_class
)
23 git_error
*error
= &GIT_GLOBAL
->error_t
;
24 git_buf
*buf
= &GIT_GLOBAL
->error_buf
;
26 error
->message
= buf
->ptr
;
27 error
->klass
= error_class
;
29 GIT_GLOBAL
->last_error
= error
;
32 static void set_error(int error_class
, char *string
)
34 git_buf
*buf
= &GIT_GLOBAL
->error_buf
;
38 git_buf_puts(buf
, string
);
42 set_error_from_buffer(error_class
);
45 void giterr_set_oom(void)
47 GIT_GLOBAL
->last_error
= &g_git_oom_error
;
50 void giterr_set(int error_class
, const char *string
, ...)
54 DWORD win32_error_code
= (error_class
== GITERR_OS
) ? GetLastError() : 0;
56 int error_code
= (error_class
== GITERR_OS
) ? errno
: 0;
57 git_buf
*buf
= &GIT_GLOBAL
->error_buf
;
61 va_start(arglist
, string
);
62 git_buf_vprintf(buf
, string
, arglist
);
65 if (error_class
== GITERR_OS
)
66 git_buf_PUTS(buf
, ": ");
69 if (error_class
== GITERR_OS
) {
71 char * win32_error
= git_win32_get_error_message(win32_error_code
);
73 git_buf_puts(buf
, win32_error
);
74 git__free(win32_error
);
81 git_buf_puts(buf
, strerror(error_code
));
87 if (!git_buf_oom(buf
))
88 set_error_from_buffer(error_class
);
91 void giterr_set_str(int error_class
, const char *string
)
93 git_buf
*buf
= &GIT_GLOBAL
->error_buf
;
101 git_buf_puts(buf
, string
);
102 if (!git_buf_oom(buf
))
103 set_error_from_buffer(error_class
);
106 int giterr_set_regex(const regex_t
*regex
, int error_code
)
108 char error_buf
[1024];
112 regerror(error_code
, regex
, error_buf
, sizeof(error_buf
));
113 giterr_set_str(GITERR_REGEX
, error_buf
);
115 if (error_code
== REG_NOMATCH
)
116 return GIT_ENOTFOUND
;
118 return GIT_EINVALIDSPEC
;
121 void giterr_clear(void)
123 if (GIT_GLOBAL
->last_error
!= NULL
) {
125 GIT_GLOBAL
->last_error
= NULL
;
134 const git_error
*giterr_last(void)
136 return GIT_GLOBAL
->last_error
;
139 int giterr_state_capture(git_error_state
*state
, int error_code
)
141 git_error
*error
= GIT_GLOBAL
->last_error
;
142 git_buf
*error_buf
= &GIT_GLOBAL
->error_buf
;
144 memset(state
, 0, sizeof(git_error_state
));
149 state
->error_code
= error_code
;
150 state
->oom
= (error
== &g_git_oom_error
);
153 state
->error_msg
.klass
= error
->klass
;
156 state
->error_msg
.message
= g_git_oom_error
.message
;
158 state
->error_msg
.message
= git_buf_detach(error_buf
);
165 int giterr_state_restore(git_error_state
*state
)
171 if (state
&& state
->error_msg
.message
) {
175 set_error(state
->error_msg
.klass
, state
->error_msg
.message
);
177 ret
= state
->error_code
;
178 memset(state
, 0, sizeof(git_error_state
));
184 void giterr_state_free(git_error_state
*state
)
190 git__free(state
->error_msg
.message
);
192 memset(state
, 0, sizeof(git_error_state
));
195 int giterr_system_last(void)
198 return GetLastError();
204 void giterr_system_set(int code
)