PostgreSQL Source Code  git master
strerror.c File Reference
#include "c.h"
Include dependency graph for strerror.c:

Go to the source code of this file.

Functions

static char * gnuish_strerror_r (int errnum, char *buf, size_t buflen)
 
static char * get_errno_symbol (int errnum)
 
char * pg_strerror (int errnum)
 
char * pg_strerror_r (int errnum, char *buf, size_t buflen)
 

Function Documentation

◆ get_errno_symbol()

static char * get_errno_symbol ( int  errnum)
static

Definition at line 113 of file strerror.c.

References buf, EADDRINUSE, EADDRNOTAVAIL, EAFNOSUPPORT, EAGAIN, ECONNABORTED, ECONNREFUSED, ECONNRESET, EHOSTDOWN, EHOSTUNREACH, EIDRM, EINPROGRESS, EINTR, EISCONN, EMSGSIZE, ENETDOWN, ENETRESET, ENETUNREACH, ENOBUFS, ENOTCONN, ENOTSOCK, ENOTSUP, EOPNOTSUPP, EOVERFLOW, EPROTONOSUPPORT, EWOULDBLOCK, and snprintf.

Referenced by pg_strerror_r().

114 {
115  switch (errnum)
116  {
117  case E2BIG:
118  return "E2BIG";
119  case EACCES:
120  return "EACCES";
121  case EADDRINUSE:
122  return "EADDRINUSE";
123  case EADDRNOTAVAIL:
124  return "EADDRNOTAVAIL";
125  case EAFNOSUPPORT:
126  return "EAFNOSUPPORT";
127 #ifdef EAGAIN
128  case EAGAIN:
129  return "EAGAIN";
130 #endif
131 #ifdef EALREADY
132  case EALREADY:
133  return "EALREADY";
134 #endif
135  case EBADF:
136  return "EBADF";
137 #ifdef EBADMSG
138  case EBADMSG:
139  return "EBADMSG";
140 #endif
141  case EBUSY:
142  return "EBUSY";
143  case ECHILD:
144  return "ECHILD";
145  case ECONNABORTED:
146  return "ECONNABORTED";
147  case ECONNREFUSED:
148  return "ECONNREFUSED";
149  case ECONNRESET:
150  return "ECONNRESET";
151  case EDEADLK:
152  return "EDEADLK";
153  case EDOM:
154  return "EDOM";
155  case EEXIST:
156  return "EEXIST";
157  case EFAULT:
158  return "EFAULT";
159  case EFBIG:
160  return "EFBIG";
161  case EHOSTDOWN:
162  return "EHOSTDOWN";
163  case EHOSTUNREACH:
164  return "EHOSTUNREACH";
165  case EIDRM:
166  return "EIDRM";
167  case EINPROGRESS:
168  return "EINPROGRESS";
169  case EINTR:
170  return "EINTR";
171  case EINVAL:
172  return "EINVAL";
173  case EIO:
174  return "EIO";
175  case EISCONN:
176  return "EISCONN";
177  case EISDIR:
178  return "EISDIR";
179 #ifdef ELOOP
180  case ELOOP:
181  return "ELOOP";
182 #endif
183  case EMFILE:
184  return "EMFILE";
185  case EMLINK:
186  return "EMLINK";
187  case EMSGSIZE:
188  return "EMSGSIZE";
189  case ENAMETOOLONG:
190  return "ENAMETOOLONG";
191  case ENETDOWN:
192  return "ENETDOWN";
193  case ENETRESET:
194  return "ENETRESET";
195  case ENETUNREACH:
196  return "ENETUNREACH";
197  case ENFILE:
198  return "ENFILE";
199  case ENOBUFS:
200  return "ENOBUFS";
201  case ENODEV:
202  return "ENODEV";
203  case ENOENT:
204  return "ENOENT";
205  case ENOEXEC:
206  return "ENOEXEC";
207  case ENOMEM:
208  return "ENOMEM";
209  case ENOSPC:
210  return "ENOSPC";
211  case ENOSYS:
212  return "ENOSYS";
213  case ENOTCONN:
214  return "ENOTCONN";
215  case ENOTDIR:
216  return "ENOTDIR";
217 #if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */
218  case ENOTEMPTY:
219  return "ENOTEMPTY";
220 #endif
221  case ENOTSOCK:
222  return "ENOTSOCK";
223 #ifdef ENOTSUP
224  case ENOTSUP:
225  return "ENOTSUP";
226 #endif
227  case ENOTTY:
228  return "ENOTTY";
229  case ENXIO:
230  return "ENXIO";
231 #if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (EOPNOTSUPP != ENOTSUP))
232  case EOPNOTSUPP:
233  return "EOPNOTSUPP";
234 #endif
235 #ifdef EOVERFLOW
236  case EOVERFLOW:
237  return "EOVERFLOW";
238 #endif
239  case EPERM:
240  return "EPERM";
241  case EPIPE:
242  return "EPIPE";
243  case EPROTONOSUPPORT:
244  return "EPROTONOSUPPORT";
245  case ERANGE:
246  return "ERANGE";
247 #ifdef EROFS
248  case EROFS:
249  return "EROFS";
250 #endif
251  case ESRCH:
252  return "ESRCH";
253 #ifdef ETIMEDOUT
254  case ETIMEDOUT:
255  return "ETIMEDOUT";
256 #endif
257 #ifdef ETXTBSY
258  case ETXTBSY:
259  return "ETXTBSY";
260 #endif
261 #if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))
262  case EWOULDBLOCK:
263  return "EWOULDBLOCK";
264 #endif
265  case EXDEV:
266  return "EXDEV";
267  }
268 
269  return NULL;
270 }
#define ENETDOWN
Definition: win32_port.h:377
#define ECONNABORTED
Definition: win32_port.h:351
#define EAGAIN
Definition: win32_port.h:341
#define EHOSTDOWN
Definition: win32_port.h:373
#define ENETRESET
Definition: win32_port.h:379
#define ENOTSUP
Definition: private.h:38
#define ENOTSOCK
Definition: win32_port.h:365
#define EHOSTUNREACH
Definition: win32_port.h:375
#define EADDRNOTAVAIL
Definition: win32_port.h:371
#define ECONNREFUSED
Definition: win32_port.h:363
#define ENOTCONN
Definition: win32_port.h:383
#define EISCONN
Definition: win32_port.h:357
#define EIDRM
Definition: win32_port.h:95
#define EAFNOSUPPORT
Definition: win32_port.h:347
#define EPROTONOSUPPORT
Definition: win32_port.h:361
#define ENETUNREACH
Definition: win32_port.h:381
#define EADDRINUSE
Definition: win32_port.h:369
#define ECONNRESET
Definition: win32_port.h:353
#define EOPNOTSUPP
Definition: win32_port.h:367
#define ENOBUFS
Definition: win32_port.h:359
#define EINPROGRESS
Definition: win32_port.h:355
#define EWOULDBLOCK
Definition: win32_port.h:349
#define EINTR
Definition: win32_port.h:343
#define EMSGSIZE
Definition: win32_port.h:345
#define EOVERFLOW
Definition: private.h:41

◆ gnuish_strerror_r()

static char * gnuish_strerror_r ( int  errnum,
char *  buf,
size_t  buflen 
)
static

Definition at line 85 of file strerror.c.

References buf, strerror, strerror_r, and strlcpy().

Referenced by pg_strerror_r().

86 {
87 #ifdef HAVE_STRERROR_R
88 #ifdef STRERROR_R_INT
89  /* POSIX API */
90  if (strerror_r(errnum, buf, buflen) == 0)
91  return buf;
92  return NULL; /* let caller deal with failure */
93 #else
94  /* GNU API */
95  return strerror_r(errnum, buf, buflen);
96 #endif
97 #else /* !HAVE_STRERROR_R */
98  char *sbuf = strerror(errnum);
99 
100  if (sbuf == NULL) /* can this still happen anywhere? */
101  return NULL;
102  /* To minimize thread-unsafety hazard, copy into caller's buffer */
103  strlcpy(buf, sbuf, buflen);
104  return buf;
105 #endif
106 }
static char * buf
Definition: pg_test_fsync.c:68
size_t strlcpy(char *dst, const char *src, size_t siz)
Definition: strlcpy.c:45
#define strerror
Definition: port.h:228
#define strerror_r
Definition: port.h:232

◆ pg_strerror()

char* pg_strerror ( int  errnum)

Definition at line 35 of file strerror.c.

References pg_strerror_r(), and PG_STRERROR_R_BUFLEN.

36 {
37  static char errorstr_buf[PG_STRERROR_R_BUFLEN];
38 
39  return pg_strerror_r(errnum, errorstr_buf, sizeof(errorstr_buf));
40 }
#define PG_STRERROR_R_BUFLEN
Definition: port.h:233
char * pg_strerror_r(int errnum, char *buf, size_t buflen)
Definition: strerror.c:46

◆ pg_strerror_r()

char* pg_strerror_r ( int  errnum,
char *  buf,
size_t  buflen 
)

Definition at line 46 of file strerror.c.

References _, buf, get_errno_symbol(), gnuish_strerror_r(), snprintf, and generate_unaccent_rules::str.

Referenced by pg_strerror().

47 {
48  char *str;
49 
50  /* If it's a Windows Winsock error, that needs special handling */
51 #ifdef WIN32
52  /* Winsock error code range, per WinError.h */
53  if (errnum >= 10000 && errnum <= 11999)
54  return win32_socket_strerror(errnum, buf, buflen);
55 #endif
56 
57  /* Try the platform's strerror_r(), or maybe just strerror() */
58  str = gnuish_strerror_r(errnum, buf, buflen);
59 
60  /*
61  * Some strerror()s return an empty string for out-of-range errno. This
62  * is ANSI C spec compliant, but not exactly useful. Also, we may get
63  * back strings of question marks if libc cannot transcode the message to
64  * the codeset specified by LC_CTYPE. If we get nothing useful, first try
65  * get_errno_symbol(), and if that fails, print the numeric errno.
66  */
67  if (str == NULL || *str == '\0' || *str == '?')
68  str = get_errno_symbol(errnum);
69 
70  if (str == NULL)
71  {
72  snprintf(buf, buflen, _("operating system error %d"), errnum);
73  str = buf;
74  }
75 
76  return str;
77 }
static char * buf
Definition: pg_test_fsync.c:68
static char * get_errno_symbol(int errnum)
Definition: strerror.c:113
static char * gnuish_strerror_r(int errnum, char *buf, size_t buflen)
Definition: strerror.c:85
#define snprintf
Definition: port.h:215
#define _(x)
Definition: elog.c:88