OSDN Git Service

* ioctl.cc (ioctl): Make third argument optional.
[pf3gnuchains/pf3gnuchains3x.git] / winsup / cygwin / errno.cc
1 /* errno.cc: errno-related functions
2
3    Copyright 1996, 1997, 1998, 1999, 2000, 2001 Red Hat, Inc.
4
5 This file is part of Cygwin.
6
7 This software is a copyrighted work licensed under the terms of the
8 Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
9 details. */
10
11 #define _sys_nerr FOO_sys_nerr
12 #define sys_nerr FOOsys_nerr
13 #include "winsup.h"
14 #define _REENT_ONLY
15 #include <stdio.h>
16 #include <errno.h>
17 #include "cygerrno.h"
18 #include "thread.h"
19 #undef _sys_nerr
20 #undef sys_nerr
21
22 /* Table to map Windows error codes to Errno values.  */
23 /* FIXME: Doing things this way is a little slow.  It's trivial to change
24    this into a big case statement if necessary.  Left as is for now. */
25
26 #define X(w, e) {ERROR_##w, #w, e}
27
28 static const NO_COPY struct
29   {
30     DWORD w;             /* windows version of error */
31     const char *s;       /* text of windows version */
32     int e;               /* errno version of error */
33   }
34 errmap[] =
35 {
36   /* FIXME: Some of these choices are arbitrary! */
37   X (INVALID_FUNCTION,          EBADRQC),
38   X (FILE_NOT_FOUND,            ENOENT),
39   X (PATH_NOT_FOUND,            ENOENT),
40   X (TOO_MANY_OPEN_FILES,       EMFILE),
41   X (ACCESS_DENIED,             EACCES),
42   X (INVALID_HANDLE,            EBADF),
43   X (NOT_ENOUGH_MEMORY,         ENOMEM),
44   X (INVALID_DATA,              EINVAL),
45   X (OUTOFMEMORY,               ENOMEM),
46   X (INVALID_DRIVE,             ENODEV),
47   X (NOT_SAME_DEVICE,           EXDEV),
48   X (NO_MORE_FILES,             ENMFILE),
49   X (WRITE_PROTECT,             EROFS),
50   X (BAD_UNIT,                  ENODEV),
51   X (SHARING_VIOLATION,         EACCES),
52   X (LOCK_VIOLATION,            EACCES),
53   X (SHARING_BUFFER_EXCEEDED,   ENOLCK),
54   X (HANDLE_EOF,                ENODATA),
55   X (HANDLE_DISK_FULL,          ENOSPC),
56   X (NOT_SUPPORTED,             ENOSYS),
57   X (REM_NOT_LIST,              ENONET),
58   X (DUP_NAME,                  ENOTUNIQ),
59   X (BAD_NETPATH,               ENOSHARE),
60   X (BAD_NET_NAME,              ENOSHARE),
61   X (FILE_EXISTS,               EEXIST),
62   X (CANNOT_MAKE,               EPERM),
63   X (INVALID_PARAMETER,         EINVAL),
64   X (NO_PROC_SLOTS,             EAGAIN),
65   X (BROKEN_PIPE,               EPIPE),
66   X (OPEN_FAILED,               EIO),
67   X (NO_MORE_SEARCH_HANDLES,    ENFILE),
68   X (CALL_NOT_IMPLEMENTED,      ENOSYS),
69   X (INVALID_NAME,              ENOENT),
70   X (WAIT_NO_CHILDREN,          ECHILD),
71   X (CHILD_NOT_COMPLETE,        EBUSY),
72   X (DIR_NOT_EMPTY,             ENOTEMPTY),
73   X (SIGNAL_REFUSED,            EIO),
74   X (BAD_PATHNAME,              ENOENT),
75   X (SIGNAL_PENDING,            EBUSY),
76   X (MAX_THRDS_REACHED,         EAGAIN),
77   X (BUSY,                      EBUSY),
78   X (ALREADY_EXISTS,            EEXIST),
79   X (NO_SIGNAL_SENT,            EIO),
80   X (FILENAME_EXCED_RANGE,      EINVAL),
81   X (META_EXPANSION_TOO_LONG,   EINVAL),
82   X (INVALID_SIGNAL_NUMBER,     EINVAL),
83   X (THREAD_1_INACTIVE,         EINVAL),
84   X (BAD_PIPE,                  EINVAL),
85   X (PIPE_BUSY,                 EBUSY),
86   X (NO_DATA,                   EPIPE),
87   X (PIPE_NOT_CONNECTED,        ECOMM),
88   X (MORE_DATA,                 EAGAIN),
89   X (DIRECTORY,                 ENOTDIR),
90   X (PIPE_CONNECTED,            EBUSY),
91   X (PIPE_LISTENING,            ECOMM),
92   X (NO_TOKEN,                  EINVAL),
93   X (PROCESS_ABORTED,           EFAULT),
94   X (BAD_DEVICE,                ENODEV),
95   X (BAD_USERNAME,              EINVAL),
96   X (NOT_CONNECTED,             ENOLINK),
97   X (OPEN_FILES,                EAGAIN),
98   X (ACTIVE_CONNECTIONS,        EAGAIN),
99   X (DEVICE_IN_USE,             EAGAIN),
100   X (INVALID_AT_INTERRUPT_TIME, EINTR),
101   X (IO_DEVICE,                 EIO),
102   X (NOT_OWNER,                 EPERM),
103   X (END_OF_MEDIA,              ENOSPC),
104   X (EOM_OVERFLOW,              ENOSPC),
105   X (BEGINNING_OF_MEDIA,        ESPIPE),
106   X (SETMARK_DETECTED,          ESPIPE),
107   X (NO_DATA_DETECTED,          ENOSPC),
108   X (POSSIBLE_DEADLOCK,         EDEADLOCK),
109   X (CRC,                       EIO),
110   X (NEGATIVE_SEEK,             EINVAL),
111   X (NOT_READY,                 ENOMEDIUM),
112   X (DISK_FULL,                 ENOSPC),
113   X (NOACCESS,                  EFAULT),
114   X (FILE_INVALID,              ENXIO),
115   { 0, NULL, 0}
116 };
117
118 int __stdcall
119 geterrno_from_win_error (DWORD code, int deferrno)
120 {
121   for (int i = 0; errmap[i].w != 0; ++i)
122     if (code == errmap[i].w)
123       {
124         syscall_printf ("windows error %u == errno %d", code, errmap[i].e);
125         return errmap[i].e;
126       }
127
128   syscall_printf ("unknown windows error %u, setting errno to %d", code,
129                   deferrno);
130   return deferrno;      /* FIXME: what's so special about EACCESS? */
131 }
132
133 /* seterrno_from_win_error: Given a Windows error code, set errno
134    as appropriate. */
135 void __stdcall
136 seterrno_from_win_error (const char *file, int line, DWORD code)
137 {
138   syscall_printf ("%s:%d errno %d", file, line, code);
139   set_errno (geterrno_from_win_error (code, EACCES));
140   return;
141 }
142
143 /* seterrno: Set `errno' based on GetLastError (). */
144 void __stdcall
145 seterrno (const char *file, int line)
146 {
147   seterrno_from_win_error (file, line, GetLastError ());
148 }
149
150 extern char *_user_strerror _PARAMS ((int));
151
152 extern "C" {
153 const NO_COPY char __declspec(dllexport) * const _sys_errlist[]=
154 {
155 /*      NOERROR 0       */ "No error",
156 /*      EPERM 1         */ "Not super-user",
157 /*      ENOENT 2        */ "No such file or directory",
158 /*      ESRCH 3         */ "No such process",
159 /*      EINTR 4         */ "Interrupted system call",
160 /*      EIO 5           */ "I/O error",
161 /*      ENXIO 6         */ "No such device or address",
162 /*      E2BIG 7         */ "Arg list too long",
163 /*      ENOEXEC 8       */ "Exec format error",
164 /*      EBADF 9         */ "Bad file number",
165 /*      ECHILD 10       */ "No children",
166 /*      EAGAIN 11       */ "Resource temporarily unavailable",
167 /*      ENOMEM 12       */ "Not enough core",
168 /*      EACCES 13       */ "Permission denied",
169 /*      EFAULT 14       */ "Bad address",
170 /*      ENOTBLK 15      */ "Block device required",
171 /*      EBUSY 16        */ "Mount device busy",
172 /*      EEXIST 17       */ "File exists",
173 /*      EXDEV 18        */ "Cross-device link",
174 /*      ENODEV 19       */ "No such device",
175 /*      ENOTDIR 20      */ "Not a directory",
176 /*      EISDIR 21       */ "Is a directory",
177 /*      EINVAL 22       */ "Invalid argument",
178 /*      ENFILE 23       */ "Too many open files in system",
179 /*      EMFILE 24       */ "Too many open files",
180 /*      ENOTTY 25       */ "Not a typewriter",
181 /*      ETXTBSY 26      */ "Text file busy",
182 /*      EFBIG 27        */ "File too large",
183 /*      ENOSPC 28       */ "No space left on device",
184 /*      ESPIPE 29       */ "Illegal seek",
185 /*      EROFS 30        */ "Read only file system",
186 /*      EMLINK 31       */ "Too many links",
187 /*      EPIPE 32        */ "Broken pipe",
188 /*      EDOM 33         */ "Math arg out of domain of func",
189 /*      ERANGE 34       */ "Math result not representable",
190 /*      ENOMSG 35       */ "No message of desired type",
191 /*      EIDRM 36        */ "Identifier removed",
192 /*      ECHRNG 37       */ "Channel number out of range",
193 /*      EL2NSYNC 38     */ "Level 2 not synchronized",
194 /*      EL3HLT 39       */ "Level 3 halted",
195 /*      EL3RST 40       */ "Level 3 reset",
196 /*      ELNRNG 41       */ "Link number out of range",
197 /*      EUNATCH 42      */ "Protocol driver not attached",
198 /*      ENOCSI 43       */ "No CSI structure available",
199 /*      EL2HLT 44       */ "Level 2 halted",
200 /*      EDEADLK 45      */ "Deadlock condition",
201 /*      ENOLCK 46       */ "No record locks available",
202                            "47",
203                            "48",
204                            "49",
205 /* EBADE 50     */ "Invalid exchange",
206 /* EBADR 51     */ "Invalid request descriptor",
207 /* EXFULL 52    */ "Exchange full",
208 /* ENOANO 53    */ "No anode",
209 /* EBADRQC 54   */ "Invalid request code",
210 /* EBADSLT 55   */ "Invalid slot",
211 /* EDEADLOCK 56 */ "File locking deadlock error",
212 /* EBFONT 57    */ "Bad font file fmt",
213                            "58",
214                            "59",
215 /* ENOSTR 60    */ "Device not a stream",
216 /* ENODATA 61   */ "No data (for no delay io)",
217 /* ETIME 62     */ "Timer expired",
218 /* ENOSR 63     */ "Out of streams resources",
219 /* ENONET 64    */ "Machine is not on the network",
220 /* ENOPKG 65    */ "Package not installed",
221 /* EREMOTE 66   */ "The object is remote",
222 /* ENOLINK 67   */ "The link has been severed",
223 /* EADV 68              */ "Advertise error",
224 /* ESRMNT 69    */ "Srmount error",
225 /*      ECOMM 70        */ "Communication error on send",
226 /* EPROTO 71    */ "Protocol error",
227                            "72",
228                            "73",
229 /*      EMULTIHOP 74    */ "Multihop attempted",
230 /*      ELBIN 75        */ "Inode is remote (not really error)",
231 /*      EDOTDOT 76      */ "Cross mount point (not really error)",
232 /* EBADMSG 77   */ "Trying to read unreadable message",
233                            "78",
234                            "79",
235 /* ENOTUNIQ 80  */ "Given log. name not unique",
236 /* EBADFD 81    */ "f.d. invalid for this operation",
237 /* EREMCHG 82   */ "Remote address changed",
238 /* ELIBACC 83   */ "Can't access a needed shared lib",
239 /* ELIBBAD 84   */ "Accessing a corrupted shared lib",
240 /* ELIBSCN 85   */ ".lib section in a.out corrupted",
241 /* ELIBMAX 86   */ "Attempting to link in too many libs",
242 /* ELIBEXEC 87  */ "Attempting to exec a shared library",
243 /* ENOSYS 88    */ "Function not implemented",
244 /* ENMFILE 89      */ "No more files",
245 /* ENOTEMPTY 90 */ "Directory not empty",
246 /* ENAMETOOLONG 91      */ "File or path name too long",
247 /* ELOOP 92     */ "Too many symbolic links",
248                    "93",
249                    "94",
250 /* EOPNOTSUPP 95 */ "Operation not supported on transport endpoint",
251 /* EPFNOSUPPORT 96 */ "Protocol family not supported",
252                    "97",
253                    "98",
254                    "99",
255                    "100",
256                    "101",
257                    "102",
258                    "103",
259 /* ECONNRESET 104 */ "Connection reset by peer",
260 /* ENOBUFS 105 */ "No buffer space available",
261 /* EAFNOSUPPORT 106 */ "Address family not supported by protocol",
262 /* EPROTOTYPE 107 */ "Protocol wrong type for transport endpoint",
263 /* ENOTSOCK 108 */  "Socket operation on non-socket",
264 /* ENOPROTOOPT 109 */ "Protocol not available",
265 /* ESHUTDOWN 110 */ "Cannot send after transport endpoint shutdown",
266 /* ECONNREFUSED 111 */ "Connection refused",
267 /* EADDRINUSE 112 */ "Address already in use",
268 /* ECONNABORTED 113 */ "Connection aborted",
269 /* ENETUNREACH 114 */ "Network is unreachable",
270 /* ENETDOWN 115 */ "Network is down",
271 /* ETIMEDOUT 116 */ "Connection timed out",
272 /* EHOSTDOWN 117 */ "Host is down",
273 /* EHOSTUNREACH 118 */ "No route to host",
274 /* EINPROGRESS 119 */ "Operation now in progress",
275 /* EALREADY 120 */ "Operation already in progress",
276 /* EDESTADDRREQ 121 */ "Destination address required",
277 /* EMSGSIZE 122 */ "Message too long",
278 /* EPROTONOSUPPORT 123 */ "Protocol not supported",
279 /* ESOCKTNOSUPPORT 124 */ "Socket type not supported",
280 /* EADDRNOTAVAIL 125 */ "Cannot assign requested address",
281 /* ENETRESET 126 */ "Network dropped connection because of reset",
282 /* EISCONN 127 */ "Transport endpoint is already connected",
283 /* ENOTCONN 128 */ "Transport endpoint is not connected",
284 /* ETOOMANYREFS 129 */ "Too many references: cannot splice",
285 /* EPROCLIM 130 */ "Process limit exceeded",
286 /* EUSERS 131 */ "Too many users",
287 /* EDQUOT 132 */ "Quota exceeded",
288 /* ESTALE 133 */ "Stale NFS file handle",
289 /* ENOTSUP 134 */   "134",
290 /* ENOMEDIUM 135 */ "no medium",
291 /* ENOSHARE 136 */   "No such host or network path",
292 /* ECASECLASH 137 */ "Filename exists with different case"
293 };
294
295 extern int const NO_COPY __declspec(dllexport) _sys_nerr = sizeof (_sys_errlist) / sizeof (_sys_errlist[0]);
296 };
297
298 /* FIXME: Why is strerror() a long switch and not just:
299         return sys_errlist[errnum];
300         (or moral equivalent).
301         Some entries in sys_errlist[] don't match the corresponding
302         entries in strerror().  This seems odd.
303 */
304
305 /* CYGWIN internal */
306 /* strerror: convert from errno values to error strings */
307 extern "C" char *
308 strerror (int errnum)
309 {
310   const char *error;
311   switch (errnum)
312     {
313     case EPERM:
314       error = "Not owner";
315       break;
316     case ENOENT:
317       error = "No such file or directory";
318       break;
319     case ESRCH:
320       error = "No such process";
321       break;
322     case EINTR:
323       error = "Interrupted system call";
324       break;
325     case EIO:
326       error = "I/O error";
327       break;
328     case ENXIO:
329       error = "No such device or address";
330       break;
331     case E2BIG:
332       error = "Arg list too long";
333       break;
334     case ENOEXEC:
335       error = "Exec format error";
336       break;
337     case EBADF:
338       error = "Bad file number";
339       break;
340     case ECHILD:
341       error = "No children";
342       break;
343     case EAGAIN:
344       error = "Resource temporarily unavailable";
345       break;
346     case ENOMEM:
347       error = "Not enough memory";
348       break;
349     case EACCES:
350       error = "Permission denied";
351       break;
352     case EFAULT:
353       error = "Bad address";
354       break;
355     case ENOTBLK:
356       error = "Block device required";
357       break;
358     case EBUSY:
359       error = "Device or resource busy";
360       break;
361     case EEXIST:
362       error = "File exists";
363       break;
364     case EXDEV:
365       error = "Cross-device link";
366       break;
367     case ENODEV:
368       error = "No such device";
369       break;
370     case ENOTDIR:
371       error = "Not a directory";
372       break;
373     case EISDIR:
374       error = "Is a directory";
375       break;
376     case EINVAL:
377       error = "Invalid argument";
378       break;
379     case ENFILE:
380       error = "Too many open files in system";
381       break;
382     case EMFILE:
383       error = "Too many open files";
384       break;
385     case ENOTTY:
386       error = "Not a character device";
387       break;
388     case ETXTBSY:
389       error = "Text file busy";
390       break;
391     case EFBIG:
392       error = "File too large";
393       break;
394     case ENOSPC:
395       error = "No space left on device";
396       break;
397     case ESPIPE:
398       error = "Illegal seek";
399       break;
400     case EROFS:
401       error = "Read-only file system";
402       break;
403     case EMLINK:
404       error = "Too many links";
405       break;
406     case EPIPE:
407       error = "Broken pipe";
408       break;
409     case EDOM:
410       error = "Math arg out of domain of func";
411       break;
412     case ERANGE:
413       error = "Math result out of range";
414       break;
415     case ENOMSG:
416       error = "No message of desired type";
417       break;
418     case EIDRM:
419       error = "Identifier removed";
420       break;
421     case ECHRNG:
422       error = "Channel number out of range";
423       break;
424     case EL2NSYNC:
425       error = "Level 2 not synchronized";
426       break;
427     case EL3HLT:
428       error = "Level 3 halted";
429       break;
430     case EL3RST:
431       error = "Level 3 reset";
432       break;
433     case ELNRNG:
434       error = "Link number out of range";
435       break;
436     case EUNATCH:
437       error = "Protocol driver not attached";
438       break;
439     case ENOCSI:
440       error = "No CSI structure available";
441       break;
442     case EL2HLT:
443       error = "Level 2 halted";
444       break;
445     case EDEADLK:
446       error = "Deadlock condition";
447       break;
448     case ENOLCK:
449       error = "No lock";
450       break;
451     case EBADE:
452       error = "Invalid exchange";
453       break;
454     case EBADR:
455       error = "Invalid request descriptor";
456       break;
457     case EXFULL:
458       error = "Exchange full";
459       break;
460     case ENOANO:
461       error = "No anode";
462       break;
463     case EBADRQC:
464       error = "Invalid request code";
465       break;
466     case EBADSLT:
467       error = "Invalid slot";
468       break;
469     case EDEADLOCK:
470       error = "File locking deadlock error";
471       break;
472     case EBFONT:
473       error = "Bad font file fmt";
474       break;
475     case ENOSTR:
476       error = "Not a stream";
477       break;
478     case ENODATA:
479       error = "No data (for no delay io)";
480       break;
481     case ETIME:
482       error = "Stream ioctl timeout";
483       break;
484     case ENOSR:
485       error = "No stream resources";
486       break;
487     case ENONET:
488       error = "Machine is not on the network";
489       break;
490     case ENOPKG:
491       error = "No package";
492       break;
493     case EREMOTE:
494       error = "Resource is remote";
495       break;
496     case ENOLINK:
497       error = "Virtual circuit is gone";
498       break;
499     case EADV:
500       error = "Advertise error";
501       break;
502     case ESRMNT:
503       error = "Srmount error";
504       break;
505     case ECOMM:
506       error = "Communication error";
507       break;
508     case EPROTO:
509       error = "Protocol error";
510       break;
511     case EMULTIHOP:
512       error = "Multihop attempted";
513       break;
514     case ELBIN:
515       error = "Inode is remote (not really error)";
516       break;
517     case EDOTDOT:
518       error = "Cross mount point (not really error)";
519       break;
520     case EBADMSG:
521       error = "Bad message";
522       break;
523     case ENOTUNIQ:
524       error = "Given log. name not unique";
525       break;
526     case EBADFD:
527       error = "f.d. invalid for this operation";
528       break;
529     case EREMCHG:
530       error = "Remote address changed";
531       break;
532     case ELIBACC:
533       error = "Cannot access a needed shared library";
534       break;
535     case ELIBBAD:
536       error = "Accessing a corrupted shared library";
537       break;
538     case ELIBSCN:
539       error = ".lib section in a.out corrupted";
540       break;
541     case ELIBMAX:
542       error = "Attempting to link in more shared libraries than system limit";
543       break;
544     case ELIBEXEC:
545       error = "Cannot exec a shared library directly";
546       break;
547     case ENOSYS:
548       error = "Function not implemented";
549       break;
550     case ENMFILE:
551       error = "No more files";
552       break;
553     case ENOTEMPTY:
554       error = "Directory not empty";
555       break;
556     case ENAMETOOLONG:
557       error = "File or path name too long";
558       break;
559     case ELOOP:
560       error = "Too many symbolic links";
561       break;
562     case EOPNOTSUPP:
563       error = "Operation not supported on transport endpoint";
564       break;
565     case EPFNOSUPPORT:
566       error = "Protocol family not supported";
567       break;
568     case ECONNRESET:
569       error = "Connection reset by peer";
570       break;
571     case ENOBUFS:
572       error = "No buffer space available; the socket cannot be connected";
573       break;
574     case EAFNOSUPPORT:
575       error = "Addresses in the specified family cannot be used with this socket";
576       break;
577     case EPROTOTYPE:
578       error = "errno EPROTOTYPE triggered";
579       break;
580     case ENOTSOCK:
581       error = "The descriptor is a file, not a socket";
582       break;
583     case ENOPROTOOPT:
584       error = "This option is unsupported";
585       break;
586     case ESHUTDOWN:
587       error = "errno ESHUTDOWN triggered";
588       break;
589     case ECONNREFUSED:
590       error = "Connection refused";
591       break;
592     case EADDRINUSE:
593       error = "Address already in use";
594       break;
595     case ECONNABORTED:
596       error = "The connection was aborted";
597       break;
598     case ENETUNREACH:
599       error ="The network can't be reached from this host at this time";
600       break;
601     case ENETDOWN:
602       error = "Network failed.";
603       break;
604     case ETIMEDOUT:
605       error = "Attempt to connect timed out without establishing a connection";
606       break;
607     case EHOSTDOWN:
608       error = "errno EHOSTDOWN triggered";
609       break;
610     case EHOSTUNREACH:
611       error = "errno EHOSTUNREACH triggered";
612       break;
613     case EINPROGRESS:
614       error = "errno EINPROGRESS triggered";
615       break;
616     case EALREADY:
617       error = "errno EALREADY triggered";
618       break;
619     case EDESTADDRREQ:
620       error = "errno EDESTADDRREQ triggered";
621       break;
622     case EMSGSIZE:
623       error = "errno EMSGSIZE triggered";
624       break;
625
626     case EPROTONOSUPPORT:
627       error = "errno EPROTONOSUPPORT triggered";
628       break;
629     case ESOCKTNOSUPPORT:
630       error = "errno ESOCKTNOSUPPORT triggered";
631       break;
632     case EADDRNOTAVAIL:
633       error = "errno EADDRNOTAVAIL triggered";
634       break;
635     case ENETRESET:
636       error = "errno ENETRESET triggered";
637       break;
638     case EISCONN:
639       error = "The socket is already connected";
640       break;
641     case ENOTCONN:
642       error = "The socket is not connected";
643       break;
644     case ETOOMANYREFS:
645       error = "errno ETOOMANYREFS triggered";
646       break;
647     case EPROCLIM:
648       error = "errno EPROCLIM triggered";
649       break;
650     case EUSERS:
651       error = "errno EUSERS triggered";
652       break;
653     case EDQUOT:
654       error = "errno EDQUOT triggered";
655       break;
656     case ESTALE:
657       error = "errno ESTALE triggered";
658       break;
659     case ENOTSUP:
660       error = "errno ENOTSUP triggered";
661       break;
662     case ENOMEDIUM:
663       error = "no medium";
664       break;
665     case ENOSHARE:
666       error = "No such host or network path";
667       break;
668     case ECASECLASH:
669       error = "Filename exists with different case";
670       break;
671     default:
672 #ifdef _MT_SAFE
673       char *buf= _reent_winsup()->_strerror_buf;
674 #else
675       static NO_COPY char buf[20];
676 #endif
677       __small_sprintf (buf, "error %d", errnum);
678       error = buf;
679       break;
680     }
681
682   /* FIXME: strerror should really be const in the appropriate newlib
683      include files. */
684   return (char *) error;
685 }