blob: 92235a51d6153e848f4ef2a680eceffcac0d0968 [file] [log] [blame]
Irina Tirdeab5f053b2012-09-08 09:17:54 +03001/* $OpenBSD: strerror_r.c,v 1.6 2005/08/08 08:05:37 espie Exp $ */
2/* Public Domain <marc@snafu.org> */
3
4#include <errno.h>
5#include <limits.h>
6#include <signal.h>
7#include <stdio.h>
8#include <string.h>
9
10struct Pair {
11 int code;
12 const char* msg;
13};
14
15static const char* __code_string_lookup(const Pair* strings, int code) {
16 for (size_t i = 0; strings[i].msg != NULL; ++i) {
17 if (strings[i].code == code) {
18 return strings[i].msg;
19 }
20 }
21 return NULL;
22}
23
24static const Pair _sys_error_strings[] = {
25#define __BIONIC_ERRDEF(x,y,z) { x, z },
26#include <sys/_errdefs.h>
27 { 0, NULL }
28};
29
30int strerror_r(int error_number, char* buf, size_t buf_len) {
31 int saved_errno = errno;
32 size_t length;
33
34 const char* error_name = __code_string_lookup(_sys_error_strings, error_number);
35 if (error_name != NULL) {
36 length = snprintf(buf, buf_len, "%s", error_name);
37 } else {
38 length = snprintf(buf, buf_len, "Unknown error %u", error_number);
39 }
40 if (length >= buf_len) {
41 errno = ERANGE;
42 return -1;
43 }
44
45 errno = saved_errno;
46 return 0;
47}
48
49static const Pair _sys_signal_strings[] = {
50#define __BIONIC_SIGDEF(x,y,z) { y, z },
51#include <sys/_sigdefs.h>
52 { 0, NULL }
53};
54
55extern "C" const char* __strsignal(int signal_number, char* buf, size_t buf_len) {
56 const char* signal_name = __code_string_lookup(_sys_signal_strings, signal_number);
57 if (signal_name != NULL) {
58 return signal_name;
59 }
60
61 const char* prefix = "Unknown";
62 if (signal_number >= SIGRTMIN && signal_number <= SIGRTMAX) {
63 prefix = "Real-time";
64 signal_number -= SIGRTMIN;
65 }
66 size_t length = snprintf(buf, buf_len, "%s signal %d", prefix, signal_number);
67 if (length >= buf_len) {
68 return NULL;
69 }
70 return buf;
71}