From e2844155068a0ed0baa048197b92cdebe9aec4e0 Mon Sep 17 00:00:00 2001 From: Alan Cox Date: Thu, 21 May 2015 23:07:52 +0100 Subject: [PATCH] error: fixed up low space version --- Library/libs/error.c | 90 ++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/Library/libs/error.c b/Library/libs/error.c index c9723e98..7cdc5303 100644 --- a/Library/libs/error.c +++ b/Library/libs/error.c @@ -1,52 +1,52 @@ -/* Copyright (C) 1996 Robert de Bath - * 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 -#include -#include -#include -#include -#include - +/* Copyright (C) 1996 Robert de Bath + * 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 +#include +#include +#include +#include +#include + static uint8_t *__sys_errlist; static uint16_t *__sys_errptr; static int __sys_nerr; static char retbuf[80]; - -static void _load_errlist(void) -{ - struct stat st; - int fd = open(_PATH_LIBERR, O_RDONLY); - 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 + 2; - 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 "); + +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; } -- 2.34.1