2 * Copyright (C) 2009-2012 the libgit2 contributors
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.
13 /********************************************
15 ********************************************/
17 static git_error g_git_oom_error
= {
22 static void set_error(int error_class
, char *string
)
24 git_error
*error
= &GIT_GLOBAL
->error_t
;
26 git__free(error
->message
);
28 error
->message
= string
;
29 error
->klass
= error_class
;
31 GIT_GLOBAL
->last_error
= error
;
34 void giterr_set_oom(void)
36 GIT_GLOBAL
->last_error
= &g_git_oom_error
;
39 void giterr_set(int error_class
, const char *string
, ...)
41 git_buf buf
= GIT_BUF_INIT
;
44 int unix_error_code
= 0;
47 DWORD win32_error_code
= 0;
50 if (error_class
== GITERR_OS
) {
51 unix_error_code
= errno
;
55 win32_error_code
= GetLastError();
60 va_start(arglist
, string
);
61 git_buf_vprintf(&buf
, string
, arglist
);
64 /* automatically suffix strerror(errno) for GITERR_OS errors */
65 if (error_class
== GITERR_OS
) {
67 if (unix_error_code
!= 0) {
68 git_buf_PUTS(&buf
, ": ");
69 git_buf_puts(&buf
, strerror(unix_error_code
));
73 else if (win32_error_code
!= 0) {
74 LPVOID lpMsgBuf
= NULL
;
77 FORMAT_MESSAGE_ALLOCATE_BUFFER
|
78 FORMAT_MESSAGE_FROM_SYSTEM
|
79 FORMAT_MESSAGE_IGNORE_INSERTS
,
80 NULL
, win32_error_code
, 0, (LPTSTR
) &lpMsgBuf
, 0, NULL
);
83 git_buf_PUTS(&buf
, ": ");
84 git_buf_puts(&buf
, lpMsgBuf
);
91 if (!git_buf_oom(&buf
))
92 set_error(error_class
, git_buf_detach(&buf
));
95 void giterr_set_str(int error_class
, const char *string
)
97 char *message
= git__strdup(string
);
100 set_error(error_class
, message
);
103 void giterr_set_regex(const regex_t
*regex
, int error_code
)
105 char error_buf
[1024];
106 regerror(error_code
, regex
, error_buf
, sizeof(error_buf
));
107 giterr_set_str(GITERR_REGEX
, error_buf
);
110 void giterr_clear(void)
112 GIT_GLOBAL
->last_error
= NULL
;
120 const git_error
*giterr_last(void)
122 return GIT_GLOBAL
->last_error
;