💾 Archived View for gemini.rmf-dev.com › repo › Vaati › Vgmi › files › b6cfe9512cb3258e39ea0035c9220… captured on 2023-12-28 at 15:42:46. Gemini links have been rewritten to link to archived content
-=-=-=-=-=-=-
0 /*
1 * ISC License
2 * Copyright (c) 2023 RMF <rawmonk@firemail.cc>
3 */
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <errno.h>
7 #include <string.h>
8
9 #include <sys/types.h>
10 #include <sys/socket.h>
11 #include <netdb.h>
12 #include <tls.h>
13
14 #include "strlcpy.h"
15 #include "macro.h"
16 #include "error.h"
17
18 #define ERROR_MASK 0xFFFF
19
20 char error_tls[1024];
21
22 int error_string(int error, char *out, size_t len) {
23 const char *ptr;
24 switch (error & ERROR_MASK) {
25 case ERROR_MEMORY_FAILURE:
26 strlcpy(out, "Memory failure", len);
27 break;
28 case ERROR_ERRNO:
29 strlcpy(out, strerror(errno), len);
30 break;
31 case ERROR_UNKNOWN_PROTOCOL:
32 strlcpy(out, "Unknown protocol", len);
33 break;
34 case ERROR_UNSUPPORTED_PROTOCOL:
35 strlcpy(out, "Protocol not supported", len);
36 break;
37 case ERROR_UNKNOWN_HOST:
38 strlcpy(out, "Unknown host", len);
39 break;
40 case ERROR_TLS_FAILURE:
41 strlcpy(out, error_tls, len);
42 break;
43 case ERROR_GETADDRINFO:
44 ptr = gai_strerror(-((error & 0xFFFF0000) >> 16));
45 strlcpy(out, ptr, len);
46 break;
47 case ERROR_INVALID_DATA:
48 strlcpy(out, "Invalid response", len);
49 break;
50 case ERROR_INVALID_ARGUMENT:
51 strlcpy(out, "Invalid argument", len);
52 break;
53 case ERROR_INVALID_METADATA:
54 strlcpy(out, "No metadata", len);
55 break;
56 case ERROR_INVALID_ADDRESS:
57 strlcpy(out, "Invalid address", len);
58 break;
59 case ERROR_INVALID_STATUS:
60 strlcpy(out, "Invalid status", len);
61 break;
62 case ERROR_NO_CRLN:
63 strlcpy(out, "Invalid response", len);
64 break;
65 case ERROR_TERMBOX_FAILURE:
66 strlcpy(out, "Failed initializing TUI mode", len);
67 break;
68 case ERROR_TOO_MANY_REDIRECT:
69 strlcpy(out, "Too many redirects", len);
70 break;
71 case ERROR_INVALID_URL:
72 strlcpy(out, "Invalid URL", len);
73 break;
74 case ERROR_CERTIFICATE_MISMATCH:
75 strlcpy(out, "The server certificate changed", len);
76 break;
77 case ERROR_STORAGE_ACCESS:
78 snprintf(out, len, "Failed to access disk storage (%s)",
79 strerror(errno));
80 break;
81 case ERROR_SANDBOX_FAILURE:
82 snprintf(out, len, "Failed to apply sandboxing (%s)",
83 strerror(errno));
84 break;
85 case ERROR_RESPONSE_TOO_LARGE:
86 strlcpy(out, "The server response is too large", len);
87 break;
88 case ERROR_XDG:
89 strlcpy(out, "Unable to open the link", len);
90 break;
91 default:
92 snprintf(out, len, "Unknown error (%d)", error);
93 return -1;
94 }
95 return 0;
96 }
97