-/* Copyright (C) 1996 Robert de Bath <robert@debath.thenet.co.uk>\r
- * This file is part of the Linux-8086 C library and is distributed\r
- * under the GNU Library General Public License.\r
- *\r
- * Rewritten by Alan Cox to use a binary file format and save a lot of space\r
- */ \r
-#include <unistd.h>\r
-#include <string.h>\r
-#include <stdlib.h>\r
-#include <paths.h>\r
-#include <errno.h>\r
-#include <fcntl.h>\r
-\r
+/* Copyright (C) 1996 Robert de Bath <robert@debath.thenet.co.uk>
+ * This file is part of the Linux-8086 C library and is distributed
+ * under the GNU Library General Public License.
+ *
+ * Rewritten by Alan Cox to use a binary file format and save a lot of space
+ */
+
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <paths.h>
+#include <errno.h>
+#include <fcntl.h>
+
static uint8_t *__sys_errlist;
static uint16_t *__sys_errptr;
static int __sys_nerr;
static char retbuf[80];
-\r
-static void _load_errlist(void)\r
-{\r
- struct stat st;\r
- int fd = open(_PATH_LIBERR, O_RDONLY);\r
- if (fd < 0)\r
- return;\r
- if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode))\r
- goto bad;\r
- __sys_errlist = sbrk((st.st_size + 3)&~3);\r
- if (__sys_errlist == (void *) -1)\r
- goto bad;\r
- if (read(fd,__sys_errlist, st.st_size) == st.st_size) {\r
- __sys_nerr = *__sys_errlist;\r
- __sys_errptr = (uint16_t *)__sys_errlist + 2;\r
- close(fd);\r
- return;\r
- }\r
-bad:\r
- close(fd);\r
- __sys_errlist = NULL;\r
- return;\r
-}\r
- \r
-char *strerror(int err) \r
-{\r
-\r
- if (!__sys_errlist)\r
- _load_errlist();\r
- if (__sys_errlist && err >= 0 && err < __sys_nerr)\r
- return __sys_errlist[__sys_errptr[err]];\r
- strcpy(retbuf, "Unknown error ");\r
+
+static void _load_errlist(void)
+{
+ struct stat st;
+ int fd = open(_PATH_LIBERR, O_RDONLY|O_CLOEXEC);
+ if (fd < 0)
+ return;
+ if (fstat(fd, &st) < 0 || !S_ISREG(st.st_mode))
+ goto bad;
+ __sys_errlist = sbrk((st.st_size + 3)&~3);
+ if (__sys_errlist == (void *) -1)
+ goto bad;
+ if (read(fd,__sys_errlist, st.st_size) == st.st_size) {
+ __sys_nerr = *__sys_errlist;
+ __sys_errptr = (uint16_t *)__sys_errlist + 1;
+ close(fd);
+ return;
+ }
+bad:
+ close(fd);
+ __sys_errlist = NULL;
+ return;
+}
+
+char *strerror(int err)
+{
+ if (!__sys_errlist)
+ _load_errlist();
+ if (__sys_errlist && err >= 0 && err < __sys_nerr)
+ return __sys_errlist + __sys_errptr[err];
+ strcpy(retbuf, "Unknown error ");
strcpy(retbuf + 14, _itoa(err));
return retbuf;
}