|
@@ -26,12 +26,15 @@
|
|
|
*
|
|
|
* ATTENTION! ATTENTION! ATTENTION! ATTENTION! ATTENTION! */
|
|
|
|
|
|
+#define _STDIO_UTILITY
|
|
|
#define _GNU_SOURCE
|
|
|
#include <string.h>
|
|
|
#include <strings.h>
|
|
|
+#include <stdio.h>
|
|
|
#include <limits.h>
|
|
|
#include <ctype.h>
|
|
|
#include <stdlib.h>
|
|
|
+#include <errno.h>
|
|
|
|
|
|
#ifdef WANT_WIDE
|
|
|
#include <wchar.h>
|
|
@@ -53,6 +56,291 @@ typedef unsigned char __string_uchar_t;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
+/**********************************************************************/
|
|
|
+/* NOTE: If we ever do internationalized syserr messages, this will
|
|
|
+ * have to be changed! */
|
|
|
+
|
|
|
+#if _SYS_ERRMSG_MAXLEN < __UIM_BUFLEN_INT + 14
|
|
|
+#define _STRERROR_BUFSIZE (__UIM_BUFLEN_INT + 14)
|
|
|
+#else
|
|
|
+#define _STRERROR_BUFSIZE _SYS_ERRMSG_MAXLEN
|
|
|
+#endif
|
|
|
+
|
|
|
+#define _SYS_NERR 125
|
|
|
+#define _SYS_ERRMSG_MAXLEN 50
|
|
|
+
|
|
|
+extern const char _string_syserrmsgs[];
|
|
|
+
|
|
|
+/**********************************************************************/
|
|
|
+#ifdef L__string_syserrmsgs
|
|
|
+
|
|
|
+const char _string_syserrmsgs[] = {
|
|
|
+ /* 0: 0, 8 */ "Success\0"
|
|
|
+ /* 1: 8, 24 */ "Operation not permitted\0"
|
|
|
+ /* 2: 32, 26 */ "No such file or directory\0"
|
|
|
+ /* 3: 58, 16 */ "No such process\0"
|
|
|
+ /* 4: 74, 24 */ "Interrupted system call\0"
|
|
|
+ /* 5: 98, 19 */ "Input/output error\0"
|
|
|
+ /* 6: 117, 26 */ "No such device or address\0"
|
|
|
+ /* 7: 143, 23 */ "Argument list too long\0"
|
|
|
+ /* 8: 166, 18 */ "Exec format error\0"
|
|
|
+ /* 9: 184, 20 */ "Bad file descriptor\0"
|
|
|
+ /* 10: 204, 19 */ "No child processes\0"
|
|
|
+ /* 11: 223, 33 */ "Resource temporarily unavailable\0"
|
|
|
+ /* 12: 256, 23 */ "Cannot allocate memory\0"
|
|
|
+ /* 13: 279, 18 */ "Permission denied\0"
|
|
|
+ /* 14: 297, 12 */ "Bad address\0"
|
|
|
+ /* 15: 309, 22 */ "Block device required\0"
|
|
|
+ /* 16: 331, 24 */ "Device or resource busy\0"
|
|
|
+ /* 17: 355, 12 */ "File exists\0"
|
|
|
+ /* 18: 367, 26 */ "Invalid cross-device link\0"
|
|
|
+ /* 19: 393, 15 */ "No such device\0"
|
|
|
+ /* 20: 408, 16 */ "Not a directory\0"
|
|
|
+ /* 21: 424, 15 */ "Is a directory\0"
|
|
|
+ /* 22: 439, 17 */ "Invalid argument\0"
|
|
|
+ /* 23: 456, 30 */ "Too many open files in system\0"
|
|
|
+ /* 24: 486, 20 */ "Too many open files\0"
|
|
|
+ /* 25: 506, 31 */ "Inappropriate ioctl for device\0"
|
|
|
+ /* 26: 537, 15 */ "Text file busy\0"
|
|
|
+ /* 27: 552, 15 */ "File too large\0"
|
|
|
+ /* 28: 567, 24 */ "No space left on device\0"
|
|
|
+ /* 29: 591, 13 */ "Illegal seek\0"
|
|
|
+ /* 30: 604, 22 */ "Read-only file system\0"
|
|
|
+ /* 31: 626, 15 */ "Too many links\0"
|
|
|
+ /* 32: 641, 12 */ "Broken pipe\0"
|
|
|
+ /* 33: 653, 33 */ "Numerical argument out of domain\0"
|
|
|
+ /* 34: 686, 30 */ "Numerical result out of range\0"
|
|
|
+ /* 35: 716, 26 */ "Resource deadlock avoided\0"
|
|
|
+ /* 36: 742, 19 */ "File name too long\0"
|
|
|
+ /* 37: 761, 19 */ "No locks available\0"
|
|
|
+ /* 38: 780, 25 */ "Function not implemented\0"
|
|
|
+ /* 39: 805, 20 */ "Directory not empty\0"
|
|
|
+ /* 40: 825, 34 */ "Too many levels of symbolic links\0"
|
|
|
+ /* 41: 859, 1 */ "\0"
|
|
|
+ /* 42: 860, 27 */ "No message of desired type\0"
|
|
|
+ /* 43: 887, 19 */ "Identifier removed\0"
|
|
|
+ /* 44: 906, 28 */ "Channel number out of range\0"
|
|
|
+ /* 45: 934, 25 */ "Level 2 not synchronized\0"
|
|
|
+ /* 46: 959, 15 */ "Level 3 halted\0"
|
|
|
+ /* 47: 974, 14 */ "Level 3 reset\0"
|
|
|
+ /* 48: 988, 25 */ "Link number out of range\0"
|
|
|
+ /* 49: 1013, 29 */ "Protocol driver not attached\0"
|
|
|
+ /* 50: 1042, 27 */ "No CSI structure available\0"
|
|
|
+ /* 51: 1069, 15 */ "Level 2 halted\0"
|
|
|
+ /* 52: 1084, 17 */ "Invalid exchange\0"
|
|
|
+ /* 53: 1101, 27 */ "Invalid request descriptor\0"
|
|
|
+ /* 54: 1128, 14 */ "Exchange full\0"
|
|
|
+ /* 55: 1142, 9 */ "No anode\0"
|
|
|
+ /* 56: 1151, 21 */ "Invalid request code\0"
|
|
|
+ /* 57: 1172, 13 */ "Invalid slot\0"
|
|
|
+ /* 58: 1185, 1 */ "\0"
|
|
|
+ /* 59: 1186, 21 */ "Bad font file format\0"
|
|
|
+ /* 60: 1207, 20 */ "Device not a stream\0"
|
|
|
+ /* 61: 1227, 18 */ "No data available\0"
|
|
|
+ /* 62: 1245, 14 */ "Timer expired\0"
|
|
|
+ /* 63: 1259, 25 */ "Out of streams resources\0"
|
|
|
+ /* 64: 1284, 30 */ "Machine is not on the network\0"
|
|
|
+ /* 65: 1314, 22 */ "Package not installed\0"
|
|
|
+ /* 66: 1336, 17 */ "Object is remote\0"
|
|
|
+ /* 67: 1353, 22 */ "Link has been severed\0"
|
|
|
+ /* 68: 1375, 16 */ "Advertise error\0"
|
|
|
+ /* 69: 1391, 14 */ "Srmount error\0"
|
|
|
+ /* 70: 1405, 28 */ "Communication error on send\0"
|
|
|
+ /* 71: 1433, 15 */ "Protocol error\0"
|
|
|
+ /* 72: 1448, 19 */ "Multihop attempted\0"
|
|
|
+ /* 73: 1467, 19 */ "RFS specific error\0"
|
|
|
+ /* 74: 1486, 12 */ "Bad message\0"
|
|
|
+ /* 75: 1498, 38 */ "Value too large for defined data type\0"
|
|
|
+ /* 76: 1536, 27 */ "Name not unique on network\0"
|
|
|
+ /* 77: 1563, 29 */ "File descriptor in bad state\0"
|
|
|
+ /* 78: 1592, 23 */ "Remote address changed\0"
|
|
|
+ /* 79: 1615, 39 */ "Can not access a needed shared library\0"
|
|
|
+ /* 80: 1654, 37 */ "Accessing a corrupted shared library\0"
|
|
|
+ /* 81: 1691, 32 */ ".lib section in a.out corrupted\0"
|
|
|
+ /* 82: 1723, 48 */ "Attempting to link in too many shared libraries\0"
|
|
|
+ /* 83: 1771, 38 */ "Cannot exec a shared library directly\0"
|
|
|
+ /* 84: 1809, 50 */ "Invalid or incomplete multibyte or wide character\0"
|
|
|
+ /* 85: 1859, 44 */ "Interrupted system call should be restarted\0"
|
|
|
+ /* 86: 1903, 19 */ "Streams pipe error\0"
|
|
|
+ /* 87: 1922, 15 */ "Too many users\0"
|
|
|
+ /* 88: 1937, 31 */ "Socket operation on non-socket\0"
|
|
|
+ /* 89: 1968, 29 */ "Destination address required\0"
|
|
|
+ /* 90: 1997, 17 */ "Message too long\0"
|
|
|
+ /* 91: 2014, 31 */ "Protocol wrong type for socket\0"
|
|
|
+ /* 92: 2045, 23 */ "Protocol not available\0"
|
|
|
+ /* 93: 2068, 23 */ "Protocol not supported\0"
|
|
|
+ /* 94: 2091, 26 */ "Socket type not supported\0"
|
|
|
+ /* 95: 2117, 24 */ "Operation not supported\0"
|
|
|
+ /* 96: 2141, 30 */ "Protocol family not supported\0"
|
|
|
+ /* 97: 2171, 41 */ "Address family not supported by protocol\0"
|
|
|
+ /* 98: 2212, 23 */ "Address already in use\0"
|
|
|
+ /* 99: 2235, 32 */ "Cannot assign requested address\0"
|
|
|
+ /* 100: 2267, 16 */ "Network is down\0"
|
|
|
+ /* 101: 2283, 23 */ "Network is unreachable\0"
|
|
|
+ /* 102: 2306, 36 */ "Network dropped connection on reset\0"
|
|
|
+ /* 103: 2342, 33 */ "Software caused connection abort\0"
|
|
|
+ /* 104: 2375, 25 */ "Connection reset by peer\0"
|
|
|
+ /* 105: 2400, 26 */ "No buffer space available\0"
|
|
|
+ /* 106: 2426, 40 */ "Transport endpoint is already connected\0"
|
|
|
+ /* 107: 2466, 36 */ "Transport endpoint is not connected\0"
|
|
|
+ /* 108: 2502, 46 */ "Cannot send after transport endpoint shutdown\0"
|
|
|
+ /* 109: 2548, 35 */ "Too many references: cannot splice\0"
|
|
|
+ /* 110: 2583, 21 */ "Connection timed out\0"
|
|
|
+ /* 111: 2604, 19 */ "Connection refused\0"
|
|
|
+ /* 112: 2623, 13 */ "Host is down\0"
|
|
|
+ /* 113: 2636, 17 */ "No route to host\0"
|
|
|
+ /* 114: 2653, 30 */ "Operation already in progress\0"
|
|
|
+ /* 115: 2683, 26 */ "Operation now in progress\0"
|
|
|
+ /* 116: 2709, 22 */ "Stale NFS file handle\0"
|
|
|
+ /* 117: 2731, 25 */ "Structure needs cleaning\0"
|
|
|
+ /* 118: 2756, 28 */ "Not a XENIX named type file\0"
|
|
|
+ /* 119: 2784, 30 */ "No XENIX semaphores available\0"
|
|
|
+ /* 120: 2814, 21 */ "Is a named type file\0"
|
|
|
+ /* 121: 2835, 17 */ "Remote I/O error\0"
|
|
|
+ /* 122: 2852, 20 */ "Disk quota exceeded\0"
|
|
|
+ /* 123: 2872, 16 */ "No medium found\0"
|
|
|
+ /* 124: 2888, 18 */ "Wrong medium type"
|
|
|
+};
|
|
|
+
|
|
|
+#endif
|
|
|
+/**********************************************************************/
|
|
|
+#ifdef L_sys_errlist
|
|
|
+
|
|
|
+link_warning(_sys_errlist, "sys_nerr and sys_errlist are obsolete and uClibc support for them (in at least some configurations) will probably be unavailable in the near future.")
|
|
|
+
|
|
|
+int sys_nerr = _SYS_NERR;
|
|
|
+
|
|
|
+const char *const sys_errlist[] = {
|
|
|
+ _string_syserrmsgs + 0,
|
|
|
+ _string_syserrmsgs + 8,
|
|
|
+ _string_syserrmsgs + 32,
|
|
|
+ _string_syserrmsgs + 58,
|
|
|
+ _string_syserrmsgs + 74,
|
|
|
+ _string_syserrmsgs + 98,
|
|
|
+ _string_syserrmsgs + 117,
|
|
|
+ _string_syserrmsgs + 143,
|
|
|
+ _string_syserrmsgs + 166,
|
|
|
+ _string_syserrmsgs + 184,
|
|
|
+ _string_syserrmsgs + 204,
|
|
|
+ _string_syserrmsgs + 223,
|
|
|
+ _string_syserrmsgs + 256,
|
|
|
+ _string_syserrmsgs + 279,
|
|
|
+ _string_syserrmsgs + 297,
|
|
|
+ _string_syserrmsgs + 309,
|
|
|
+ _string_syserrmsgs + 331,
|
|
|
+ _string_syserrmsgs + 355,
|
|
|
+ _string_syserrmsgs + 367,
|
|
|
+ _string_syserrmsgs + 393,
|
|
|
+ _string_syserrmsgs + 408,
|
|
|
+ _string_syserrmsgs + 424,
|
|
|
+ _string_syserrmsgs + 439,
|
|
|
+ _string_syserrmsgs + 456,
|
|
|
+ _string_syserrmsgs + 486,
|
|
|
+ _string_syserrmsgs + 506,
|
|
|
+ _string_syserrmsgs + 537,
|
|
|
+ _string_syserrmsgs + 552,
|
|
|
+ _string_syserrmsgs + 567,
|
|
|
+ _string_syserrmsgs + 591,
|
|
|
+ _string_syserrmsgs + 604,
|
|
|
+ _string_syserrmsgs + 626,
|
|
|
+ _string_syserrmsgs + 641,
|
|
|
+ _string_syserrmsgs + 653,
|
|
|
+ _string_syserrmsgs + 686,
|
|
|
+ _string_syserrmsgs + 716,
|
|
|
+ _string_syserrmsgs + 742,
|
|
|
+ _string_syserrmsgs + 761,
|
|
|
+ _string_syserrmsgs + 780,
|
|
|
+ _string_syserrmsgs + 805,
|
|
|
+ _string_syserrmsgs + 825,
|
|
|
+ /* _string_syserrmsgs + 859, */
|
|
|
+ NULL, /* glibc compatiblity :-( */
|
|
|
+ _string_syserrmsgs + 860,
|
|
|
+ _string_syserrmsgs + 887,
|
|
|
+ _string_syserrmsgs + 906,
|
|
|
+ _string_syserrmsgs + 934,
|
|
|
+ _string_syserrmsgs + 959,
|
|
|
+ _string_syserrmsgs + 974,
|
|
|
+ _string_syserrmsgs + 988,
|
|
|
+ _string_syserrmsgs + 1013,
|
|
|
+ _string_syserrmsgs + 1042,
|
|
|
+ _string_syserrmsgs + 1069,
|
|
|
+ _string_syserrmsgs + 1084,
|
|
|
+ _string_syserrmsgs + 1101,
|
|
|
+ _string_syserrmsgs + 1128,
|
|
|
+ _string_syserrmsgs + 1142,
|
|
|
+ _string_syserrmsgs + 1151,
|
|
|
+ _string_syserrmsgs + 1172,
|
|
|
+ /* _string_syserrmsgs + 1185, */
|
|
|
+ NULL, /* glibc compatiblity :-( */
|
|
|
+ _string_syserrmsgs + 1186,
|
|
|
+ _string_syserrmsgs + 1207,
|
|
|
+ _string_syserrmsgs + 1227,
|
|
|
+ _string_syserrmsgs + 1245,
|
|
|
+ _string_syserrmsgs + 1259,
|
|
|
+ _string_syserrmsgs + 1284,
|
|
|
+ _string_syserrmsgs + 1314,
|
|
|
+ _string_syserrmsgs + 1336,
|
|
|
+ _string_syserrmsgs + 1353,
|
|
|
+ _string_syserrmsgs + 1375,
|
|
|
+ _string_syserrmsgs + 1391,
|
|
|
+ _string_syserrmsgs + 1405,
|
|
|
+ _string_syserrmsgs + 1433,
|
|
|
+ _string_syserrmsgs + 1448,
|
|
|
+ _string_syserrmsgs + 1467,
|
|
|
+ _string_syserrmsgs + 1486,
|
|
|
+ _string_syserrmsgs + 1498,
|
|
|
+ _string_syserrmsgs + 1536,
|
|
|
+ _string_syserrmsgs + 1563,
|
|
|
+ _string_syserrmsgs + 1592,
|
|
|
+ _string_syserrmsgs + 1615,
|
|
|
+ _string_syserrmsgs + 1654,
|
|
|
+ _string_syserrmsgs + 1691,
|
|
|
+ _string_syserrmsgs + 1723,
|
|
|
+ _string_syserrmsgs + 1771,
|
|
|
+ _string_syserrmsgs + 1809,
|
|
|
+ _string_syserrmsgs + 1859,
|
|
|
+ _string_syserrmsgs + 1903,
|
|
|
+ _string_syserrmsgs + 1922,
|
|
|
+ _string_syserrmsgs + 1937,
|
|
|
+ _string_syserrmsgs + 1968,
|
|
|
+ _string_syserrmsgs + 1997,
|
|
|
+ _string_syserrmsgs + 2014,
|
|
|
+ _string_syserrmsgs + 2045,
|
|
|
+ _string_syserrmsgs + 2068,
|
|
|
+ _string_syserrmsgs + 2091,
|
|
|
+ _string_syserrmsgs + 2117,
|
|
|
+ _string_syserrmsgs + 2141,
|
|
|
+ _string_syserrmsgs + 2171,
|
|
|
+ _string_syserrmsgs + 2212,
|
|
|
+ _string_syserrmsgs + 2235,
|
|
|
+ _string_syserrmsgs + 2267,
|
|
|
+ _string_syserrmsgs + 2283,
|
|
|
+ _string_syserrmsgs + 2306,
|
|
|
+ _string_syserrmsgs + 2342,
|
|
|
+ _string_syserrmsgs + 2375,
|
|
|
+ _string_syserrmsgs + 2400,
|
|
|
+ _string_syserrmsgs + 2426,
|
|
|
+ _string_syserrmsgs + 2466,
|
|
|
+ _string_syserrmsgs + 2502,
|
|
|
+ _string_syserrmsgs + 2548,
|
|
|
+ _string_syserrmsgs + 2583,
|
|
|
+ _string_syserrmsgs + 2604,
|
|
|
+ _string_syserrmsgs + 2623,
|
|
|
+ _string_syserrmsgs + 2636,
|
|
|
+ _string_syserrmsgs + 2653,
|
|
|
+ _string_syserrmsgs + 2683,
|
|
|
+ _string_syserrmsgs + 2709,
|
|
|
+ _string_syserrmsgs + 2731,
|
|
|
+ _string_syserrmsgs + 2756,
|
|
|
+ _string_syserrmsgs + 2784,
|
|
|
+ _string_syserrmsgs + 2814,
|
|
|
+ _string_syserrmsgs + 2835,
|
|
|
+ _string_syserrmsgs + 2852,
|
|
|
+ _string_syserrmsgs + 2872,
|
|
|
+ _string_syserrmsgs + 2888,
|
|
|
+};
|
|
|
+
|
|
|
+#endif
|
|
|
/**********************************************************************/
|
|
|
#ifdef L_wmemcpy
|
|
|
#define L_memcpy
|
|
@@ -255,7 +543,7 @@ Wchar *Wstrncat(Wchar * __restrict s1, register const Wchar * __restrict s2,
|
|
|
#ifdef L_memcmp
|
|
|
|
|
|
#ifndef L_wmemcmp
|
|
|
-weak_alias(memcmp,bcmp)
|
|
|
+weak_alias(memcmp,bcmp);
|
|
|
#endif
|
|
|
|
|
|
int Wmemcmp(const Wvoid *s1, const Wvoid *s2, size_t n)
|
|
@@ -418,7 +706,7 @@ Wvoid *Wmemchr(const Wvoid *s, Wint c, size_t n)
|
|
|
#ifdef L_strchr
|
|
|
|
|
|
#ifndef L_wcschr
|
|
|
-weak_alias(strchr,index)
|
|
|
+weak_alias(strchr,index);
|
|
|
#endif
|
|
|
|
|
|
Wchar *Wstrchr(register const Wchar *s, Wint c)
|
|
@@ -492,7 +780,7 @@ Wchar *Wstrpbrk(const Wchar *s1, const Wchar *s2)
|
|
|
#ifdef L_strrchr
|
|
|
|
|
|
#ifndef L_wcsrchr
|
|
|
-weak_alias(strrchr,rindex)
|
|
|
+weak_alias(strrchr,rindex);
|
|
|
#endif
|
|
|
|
|
|
Wchar *Wstrrchr(register const Wchar *s, Wint c)
|
|
@@ -548,7 +836,7 @@ size_t Wstrspn(const Wchar *s1, const Wchar *s2)
|
|
|
/* NOTE: This is the simple-minded O(len(s1) * len(s2)) worst-case approach. */
|
|
|
|
|
|
#ifdef L_wcsstr
|
|
|
-weak_alias(wcsstr,wcswcs)
|
|
|
+weak_alias(wcsstr,wcswcs);
|
|
|
#endif
|
|
|
|
|
|
Wchar *Wstrstr(const Wchar *s1, const Wchar *s2)
|
|
@@ -672,11 +960,6 @@ Wvoid *Wmemset(Wvoid *s, Wint c, size_t n)
|
|
|
}
|
|
|
#undef np
|
|
|
|
|
|
-#endif
|
|
|
-/**********************************************************************/
|
|
|
-#ifdef L_strerror
|
|
|
-#error implement strerror
|
|
|
-/* char *strerror(int errnum); */
|
|
|
#endif
|
|
|
/**********************************************************************/
|
|
|
#ifdef L_wcslen
|
|
@@ -888,10 +1171,92 @@ Wchar *Wstrdup(register const Wchar *s1)
|
|
|
return s;
|
|
|
}
|
|
|
|
|
|
+#endif
|
|
|
+/**********************************************************************/
|
|
|
+#ifdef L_strerror
|
|
|
+
|
|
|
+char *strerror(int errnum)
|
|
|
+{
|
|
|
+ static char buf[_SYS_ERRMSG_MAXLEN];
|
|
|
+
|
|
|
+ return (_susv3_strerror_r(errnum, buf, sizeof(buf)) == 0) ? buf : NULL;
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+/**********************************************************************/
|
|
|
+/* SUSv3 functions. */
|
|
|
+/**********************************************************************/
|
|
|
+#ifdef L__susv3_strerror_r
|
|
|
+
|
|
|
+int _susv3_strerror_r(int errnum, char *strerrbuf, size_t buflen)
|
|
|
+{
|
|
|
+ register char *s;
|
|
|
+ int i, retval;
|
|
|
+ char buf[_SYS_ERRMSG_MAXLEN];
|
|
|
+ static const char unknown[14] = {
|
|
|
+ 'U', 'n', 'k', 'n', 'o', 'w', 'n', ' ', 'e', 'r', 'r', 'o', 'r', ' '
|
|
|
+ };
|
|
|
+
|
|
|
+ retval = EINVAL;
|
|
|
+
|
|
|
+ if (((unsigned int) errnum) < _SYS_NERR) {
|
|
|
+ /* Trade time for space. This function should rarely be called
|
|
|
+ * so rather than keeping an array of pointers for the different
|
|
|
+ * messages, just run through the buffer until we find the
|
|
|
+ * correct string. */
|
|
|
+ for (s = (char *) _string_syserrmsgs, i = errnum ; i ; ++s) {
|
|
|
+ if (!*s) {
|
|
|
+ --i;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (*s) { /* Make sure we have an actual message. */
|
|
|
+ retval = 0;
|
|
|
+ goto GOT_MESG;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ s = _int10tostr(buf+sizeof(buf)-1, errnum) - sizeof(unknown);
|
|
|
+ memcpy(s, unknown, sizeof(unknown));
|
|
|
+
|
|
|
+ GOT_MESG:
|
|
|
+ if (!strerrbuf) { /* SUSv3 */
|
|
|
+ buflen = 0;
|
|
|
+ }
|
|
|
+ i = strlen(s) + 1;
|
|
|
+ if (i > buflen) {
|
|
|
+ i = buflen;
|
|
|
+ retval = ERANGE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (i) {
|
|
|
+ memcpy(strerrbuf, s, i);
|
|
|
+ strerrbuf[i-1] = 0; /* In case buf was too small. */
|
|
|
+ }
|
|
|
+
|
|
|
+ if (retval) {
|
|
|
+ __set_errno(retval);
|
|
|
+ }
|
|
|
+
|
|
|
+ return retval;
|
|
|
+}
|
|
|
+
|
|
|
#endif
|
|
|
/**********************************************************************/
|
|
|
/* GNU extension functions. */
|
|
|
/**********************************************************************/
|
|
|
+#ifdef L__glibc_strerror_r
|
|
|
+
|
|
|
+weak_alias(_glibc_strerror_r,__strerror_r);
|
|
|
+
|
|
|
+char *_glibc_strerror_r(int errnum, char *strerrbuf, size_t buflen)
|
|
|
+{
|
|
|
+ _susv3_strerror_r(errnum, strerrbuf, buflen);
|
|
|
+
|
|
|
+ return strerrbuf;
|
|
|
+}
|
|
|
+
|
|
|
+#endif
|
|
|
+/**********************************************************************/
|
|
|
#ifdef L_wmempcpy
|
|
|
#define L_mempcpy
|
|
|
#define Wmempcpy wmempcpy
|
|
@@ -903,7 +1268,7 @@ Wchar *Wstrdup(register const Wchar *s1)
|
|
|
|
|
|
#ifndef L_wmempcpy
|
|
|
/* uClibc's old string implementation did this to cater to some app. */
|
|
|
-weak_alias(mempcpy,__mempcpy)
|
|
|
+weak_alias(mempcpy,__mempcpy);
|
|
|
#endif
|
|
|
|
|
|
Wvoid *Wmempcpy(Wvoid * __restrict s1, const Wvoid * __restrict s2, size_t n)
|