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.
10 #include "threadstate.h"
15 /********************************************
17 ********************************************/
19 static git_error g_git_oom_error
= {
24 static git_error g_git_uninitialized_error
= {
25 "libgit2 has not been initialized; you must call git_libgit2_init",
29 static void set_error_from_buffer(int error_class
)
31 git_error
*error
= &GIT_THREADSTATE
->error_t
;
32 git_str
*buf
= &GIT_THREADSTATE
->error_buf
;
34 error
->message
= buf
->ptr
;
35 error
->klass
= error_class
;
37 GIT_THREADSTATE
->last_error
= error
;
40 static void set_error(int error_class
, char *string
)
42 git_str
*buf
= &GIT_THREADSTATE
->error_buf
;
46 git_str_puts(buf
, string
);
50 set_error_from_buffer(error_class
);
53 void git_error_set_oom(void)
55 GIT_THREADSTATE
->last_error
= &g_git_oom_error
;
58 void git_error_set(int error_class
, const char *fmt
, ...)
63 git_error_vset(error_class
, fmt
, ap
);
67 void git_error_vset(int error_class
, const char *fmt
, va_list ap
)
70 DWORD win32_error_code
= (error_class
== GIT_ERROR_OS
) ? GetLastError() : 0;
72 int error_code
= (error_class
== GIT_ERROR_OS
) ? errno
: 0;
73 git_str
*buf
= &GIT_THREADSTATE
->error_buf
;
77 git_str_vprintf(buf
, fmt
, ap
);
78 if (error_class
== GIT_ERROR_OS
)
79 git_str_PUTS(buf
, ": ");
82 if (error_class
== GIT_ERROR_OS
) {
84 char * win32_error
= git_win32_get_error_message(win32_error_code
);
86 git_str_puts(buf
, win32_error
);
87 git__free(win32_error
);
94 git_str_puts(buf
, strerror(error_code
));
100 if (!git_str_oom(buf
))
101 set_error_from_buffer(error_class
);
104 int git_error_set_str(int error_class
, const char *string
)
106 git_str
*buf
= &GIT_THREADSTATE
->error_buf
;
108 GIT_ASSERT_ARG(string
);
111 git_str_puts(buf
, string
);
113 if (git_str_oom(buf
))
116 set_error_from_buffer(error_class
);
120 void git_error_clear(void)
122 if (GIT_THREADSTATE
->last_error
!= NULL
) {
124 GIT_THREADSTATE
->last_error
= NULL
;
133 const git_error
*git_error_last(void)
135 /* If the library is not initialized, return a static error. */
136 if (!git_libgit2_init_count())
137 return &g_git_uninitialized_error
;
139 return GIT_THREADSTATE
->last_error
;
142 int git_error_state_capture(git_error_state
*state
, int error_code
)
144 git_error
*error
= GIT_THREADSTATE
->last_error
;
145 git_str
*error_buf
= &GIT_THREADSTATE
->error_buf
;
147 memset(state
, 0, sizeof(git_error_state
));
152 state
->error_code
= error_code
;
153 state
->oom
= (error
== &g_git_oom_error
);
156 state
->error_msg
.klass
= error
->klass
;
159 state
->error_msg
.message
= g_git_oom_error
.message
;
161 state
->error_msg
.message
= git_str_detach(error_buf
);
168 int git_error_state_restore(git_error_state
*state
)
174 if (state
&& state
->error_msg
.message
) {
178 set_error(state
->error_msg
.klass
, state
->error_msg
.message
);
180 ret
= state
->error_code
;
181 memset(state
, 0, sizeof(git_error_state
));
187 void git_error_state_free(git_error_state
*state
)
193 git__free(state
->error_msg
.message
);
195 memset(state
, 0, sizeof(git_error_state
));
198 int git_error_system_last(void)
201 return GetLastError();
207 void git_error_system_set(int code
)
216 /* Deprecated error values and functions */
218 #ifndef GIT_DEPRECATE_HARD
219 const git_error
*giterr_last(void)
221 return git_error_last();
224 void giterr_clear(void)
229 void giterr_set_str(int error_class
, const char *string
)
231 git_error_set_str(error_class
, string
);
234 void giterr_set_oom(void)