Skip to content

Commit b60b6c6

Browse files
committed
update errno perror strings
1 parent 7a5b490 commit b60b6c6

File tree

4 files changed

+203
-52
lines changed

4 files changed

+203
-52
lines changed

src/libc/errno_str.c

Lines changed: 79 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,85 @@
66

77
static char const * const errno_strings[] = {
88
"no error",
9-
"permission error",
10-
"invalid argument",
11-
"io error",
12-
"math domain error",
13-
"math range error",
9+
"EPERM",
10+
"EINVAL",
11+
"EIO",
12+
"EDOM",
13+
"ERANGE",
14+
"EILSEQ",
15+
/* C++ errno */
16+
"E2BIG",
17+
"EACCES",
18+
"EADDRINUSE",
19+
"EADDRNOTAVAIL",
20+
"EAFNOSUPPORT",
21+
"EAGAIN",
22+
"EALREADY",
23+
"EBADF",
24+
"EBADMSG",
25+
"EBUSY",
26+
"ECANCELED",
27+
"ECHILD",
28+
"ECONNABORTED",
29+
"ECONNREFUSED",
30+
"ECONNRESET",
31+
"EDEADLK",
32+
"EDESTADDRREQ",
33+
"EEXIST",
34+
"EFAULT",
35+
"EFBIG",
36+
"EHOSTUNREACH",
37+
"EIDRM",
38+
"EINPROGRESS",
39+
"EINTR",
40+
"EISCONN",
41+
"EISDIR",
42+
"ELOOP",
43+
"EMFILE",
44+
"EMLINK",
45+
"EMSGSIZE",
46+
"ENAMETOOLONG",
47+
"ENETDOWN",
48+
"ENETRESET",
49+
"ENETUNREACH",
50+
"ENFILE",
51+
"ENOBUFS",
52+
"ENODATA",
53+
"ENODEV",
54+
"ENOENT",
55+
"ENOEXEC",
56+
"ENOLCK",
57+
"ENOLINK",
58+
"ENOMEM",
59+
"ENOMSG",
60+
"ENOPROTOOPT",
61+
"ENOSPC",
62+
"ENOSR",
63+
"ENOSTR",
64+
"ENOSYS",
65+
"ENOTCONN",
66+
"ENOTDIR",
67+
"ENOTEMPTY",
68+
"ENOTRECOVERABLE",
69+
"ENOTSOCK",
70+
"ENOTSUP",
71+
"ENOTTY",
72+
"ENXIO",
73+
"EOPNOTSUPP",
74+
"EOVERFLOW",
75+
"EOWNERDEAD",
76+
"EPIPE",
77+
"EPROTO",
78+
"EPROTONOSUPPORT",
79+
"EPROTOTYPE",
80+
"EROFS",
81+
"ESPIPE",
82+
"ESRCH",
83+
"ETIME",
84+
"ETIMEDOUT",
85+
"ETXTBSY",
86+
"EWOULDBLOCK",
87+
"EXDEV",
1488
};
1589

1690
static char * const unknown_errno_string = "unknown error -8388608";
@@ -35,13 +109,6 @@ char* strerror(int errnum) {
35109
return (char*)errno_strings[errnum];
36110
}
37111

38-
#if 0
39-
/** disabled until the prototypes for this function are defined */
40-
size_t strerrorlen_s(errno_t errnum) {
41-
return strlen(strerror(errnum));
42-
}
43-
#endif
44-
45112
void perror(const char *str) {
46113
if (str != NULL && *str != '\0') {
47114
fputs(str, stderr);

src/libc/include/errno.h

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,31 @@
66
#define EIO 3 /* io error */
77
#define EDOM 4 /* math domain error */
88
#define ERANGE 5 /* math range error */
9+
#define EILSEQ 6 /* Illegal byte sequence (C95) */
910

10-
// Not used, but defined for compatibility
11-
#define E2BIG 6 /* Argument list too long */
12-
#define EACCES 7 /* Permission denied */
13-
#define EADDRINUSE 8 /* Address in use */
14-
#define EADDRNOTAVAIL 9 /* Address not available */
15-
#define EAFNOSUPPORT 10 /* Address family not supported */
16-
#define EAGAIN 11 /* Resource unavailable, try again */
17-
#define EALREADY 12 /* Connection already in progress */
18-
#define EBADF 13 /* Bad file descriptor */
19-
#define EBADMSG 14 /* Bad message */
20-
#define EBUSY 15 /* Device or resource busy */
21-
#define ECANCELED 16 /* Operation canceled */
22-
#define ECHILD 17 /* No child processes */
23-
#define ECONNABORTED 18 /* Connection aborted */
24-
#define ECONNREFUSED 19 /* Connection refused */
25-
#define ECONNRESET 20 /* Connection reset */
26-
#define EDEADLK 21 /* Resource deadlock avoided */
27-
#define EDESTADDRREQ 22 /* Destination address required */
28-
#define EEXIST 23 /* File exists */
29-
#define EFAULT 24 /* Bad address */
30-
#define EFBIG 25 /* File too large */
31-
#define EHOSTUNREACH 26 /* Host is unreachable */
32-
#define EIDRM 27 /* Identifier removed */
33-
#define EILSEQ 28 /* Illegal byte sequence */
11+
/* C++ errno */
12+
#define E2BIG 7 /* Argument list too long */
13+
#define EACCES 8 /* Permission denied */
14+
#define EADDRINUSE 9 /* Address in use */
15+
#define EADDRNOTAVAIL 10 /* Address not available */
16+
#define EAFNOSUPPORT 11 /* Address family not supported */
17+
#define EAGAIN 12 /* Resource unavailable, try again */
18+
#define EALREADY 13 /* Connection already in progress */
19+
#define EBADF 14 /* Bad file descriptor */
20+
#define EBADMSG 15 /* Bad message */
21+
#define EBUSY 16 /* Device or resource busy */
22+
#define ECANCELED 17 /* Operation canceled */
23+
#define ECHILD 18 /* No child processes */
24+
#define ECONNABORTED 19 /* Connection aborted */
25+
#define ECONNREFUSED 20 /* Connection refused */
26+
#define ECONNRESET 21 /* Connection reset */
27+
#define EDEADLK 22 /* Resource deadlock avoided */
28+
#define EDESTADDRREQ 23 /* Destination address required */
29+
#define EEXIST 24 /* File exists */
30+
#define EFAULT 25 /* Bad address */
31+
#define EFBIG 26 /* File too large */
32+
#define EHOSTUNREACH 27 /* Host is unreachable */
33+
#define EIDRM 28 /* Identifier removed */
3434
#define EINPROGRESS 29 /* Operation in progress */
3535
#define EINTR 30 /* Interrupted function */
3636
#define EISCONN 31 /* Socket is connected */

test/standalone/errno/autotest.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@
2323
"start": "vram_start",
2424
"size": "vram_16_size",
2525
"expected_CRCs": [
26-
"B0BE2F4E"
26+
"9523A08A"
2727
]
2828
},
2929
"2": {
3030
"description": "Invalid input screen",
3131
"start": "vram_start",
3232
"size": "vram_16_size",
3333
"expected_CRCs": [
34-
"29401BEE"
34+
"382A9C66"
3535
]
3636
},
3737
"3": {

test/standalone/errno/src/main.c

Lines changed: 98 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,92 @@
66
#include <errno.h>
77
#include <limits.h>
88

9+
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
10+
911
/** @note assumes that the following strings are used: */
10-
#if 0
11-
static char const * const errno_str[] = {
12+
static char const * const truth[] = {
1213
"no error",
13-
"permission error",
14-
"invalid argument",
15-
"io error",
16-
"math domain error",
17-
"math range error",
14+
"EPERM",
15+
"EINVAL",
16+
"EIO",
17+
"EDOM",
18+
"ERANGE",
19+
"EILSEQ",
20+
/* C++ errno */
21+
"E2BIG",
22+
"EACCES",
23+
"EADDRINUSE",
24+
"EADDRNOTAVAIL",
25+
"EAFNOSUPPORT",
26+
"EAGAIN",
27+
"EALREADY",
28+
"EBADF",
29+
"EBADMSG",
30+
"EBUSY",
31+
"ECANCELED",
32+
"ECHILD",
33+
"ECONNABORTED",
34+
"ECONNREFUSED",
35+
"ECONNRESET",
36+
"EDEADLK",
37+
"EDESTADDRREQ",
38+
"EEXIST",
39+
"EFAULT",
40+
"EFBIG",
41+
"EHOSTUNREACH",
42+
"EIDRM",
43+
"EINPROGRESS",
44+
"EINTR",
45+
"EISCONN",
46+
"EISDIR",
47+
"ELOOP",
48+
"EMFILE",
49+
"EMLINK",
50+
"EMSGSIZE",
51+
"ENAMETOOLONG",
52+
"ENETDOWN",
53+
"ENETRESET",
54+
"ENETUNREACH",
55+
"ENFILE",
56+
"ENOBUFS",
57+
"ENODATA",
58+
"ENODEV",
59+
"ENOENT",
60+
"ENOEXEC",
61+
"ENOLCK",
62+
"ENOLINK",
63+
"ENOMEM",
64+
"ENOMSG",
65+
"ENOPROTOOPT",
66+
"ENOSPC",
67+
"ENOSR",
68+
"ENOSTR",
69+
"ENOSYS",
70+
"ENOTCONN",
71+
"ENOTDIR",
72+
"ENOTEMPTY",
73+
"ENOTRECOVERABLE",
74+
"ENOTSOCK",
75+
"ENOTSUP",
76+
"ENOTTY",
77+
"ENXIO",
78+
"EOPNOTSUPP",
79+
"EOVERFLOW",
80+
"EOWNERDEAD",
81+
"EPIPE",
82+
"EPROTO",
83+
"EPROTONOSUPPORT",
84+
"EPROTOTYPE",
85+
"EROFS",
86+
"ESPIPE",
87+
"ESRCH",
88+
"ETIME",
89+
"ETIMEDOUT",
90+
"ETXTBSY",
91+
"EWOULDBLOCK",
92+
"EXDEV",
1893
};
1994

20-
static char * const unknown_errno_string = "unknown error -8388608";
21-
#endif
22-
2395
int main(void)
2496
{
2597
os_ClrHome();
@@ -28,20 +100,32 @@ int main(void)
28100
errno = 1; perror("");
29101
errno = 2; perror("\0");
30102
errno = 3; perror(" ");
31-
errno = 4; perror("%d");
103+
errno = 4; perror("%*.*d%n");
32104
errno = 5; perror("perror");
105+
errno = 6; perror(NULL);
33106

34107
while (!os_GetCSC());
35108

36109
os_ClrHome();
37110

38-
errno = 6; perror(NULL);
111+
errno = ARRAY_LENGTH(truth) - 1; perror("\\");
112+
errno = ARRAY_LENGTH(truth); perror(NULL);
39113
errno = -1; perror("");
40-
errno = -123456; perror("%d");
114+
errno = -123456; perror("%*.*d%n");
41115
errno = 123456; perror("???");
42116
errno = INT_MIN; perror(" ");
43117
errno = INT_MAX; perror("#");
44-
118+
119+
for (size_t i = 0; i < ARRAY_LENGTH(truth); i++) {
120+
const char * str = strerror(i);
121+
errno = (int)i;
122+
if (strlen(truth[i]) != strlen(str) || strcmp(truth[i], str) != 0) {
123+
fputs("strerror failed\n", stdout);
124+
break;
125+
}
126+
}
127+
fputs("finished\n", stdout);
128+
45129
while (!os_GetCSC());
46130

47131
return 0;

0 commit comments

Comments
 (0)