]> git.proxmox.com Git - libgit2.git/blame - src/errors.c
Merge pull request #1208 from ethomson/ppc_sha1_asm_deadness
[libgit2.git] / src / errors.c
CommitLineData
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
17static git_error g_git_oom_error = {
18 "Out of memory",
19 GITERR_NOMEMORY
20};
21
22772166
VM
22static 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
34void giterr_set_oom(void)
35{
36 GIT_GLOBAL->last_error = &g_git_oom_error;
37}
38
39void 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
84void 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 96int 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 110void 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 120const git_error *giterr_last(void)
e3c47510
RB
121{
122 return GIT_GLOBAL->last_error;
123}
124