From 190da1cd0c221438c563b5b605ff811e9075e210 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Wed, 23 Aug 2006 23:20:30 +0000 Subject: sync with psm: update errno handling to be the same on all arches --- libc/sysdeps/linux/common/bits/errno.h | 52 +++++++++++++++------------ libc/sysdeps/linux/common/bits/syscalls.h | 4 +-- libc/sysdeps/linux/common/bits/uClibc_errno.h | 46 ++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 26 deletions(-) create mode 100644 libc/sysdeps/linux/common/bits/uClibc_errno.h (limited to 'libc/sysdeps/linux/common') diff --git a/libc/sysdeps/linux/common/bits/errno.h b/libc/sysdeps/linux/common/bits/errno.h index 45a0ec0d1..78e8c6972 100644 --- a/libc/sysdeps/linux/common/bits/errno.h +++ b/libc/sysdeps/linux/common/bits/errno.h @@ -1,5 +1,5 @@ /* Error constants. Linux specific version. - Copyright (C) 1996, 1997, 1998, 1999, 2002 Free Software Foundation, Inc. + Copyright (C) 1996, 1997, 1998, 1999, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -19,35 +19,41 @@ #ifdef _ERRNO_H -#include +# undef EDOM +# undef EILSEQ +# undef ERANGE +# include -#ifndef ENOTSUP +/* Linux has no ENOTSUP error code. */ # define ENOTSUP EOPNOTSUPP -#endif -#ifndef ECANCELED -# define ECANCELED 125 -#endif - -#ifndef __ASSEMBLER__ +/* Older Linux versions also had no ECANCELED error code. */ +# ifndef ECANCELED +# define ECANCELED 125 +# endif -/* We now need a declaration of the `errno' variable. */ -extern int errno; +/* Support for error codes to support robust mutexes was added later, too. */ +# ifndef EOWNERDEAD +# define EOWNERDEAD 130 +# define ENOTRECOVERABLE 131 +# endif +# ifndef __ASSEMBLER__ /* Function to get address of global `errno' variable. */ extern int *__errno_location (void) __THROW __attribute__ ((__const__)); -# if defined _LIBC && ( defined IS_IN_libc || defined NOT_IN_libc ) -libc_hidden_proto(__errno_location) -/* We wouldn't need a special macro anymore but it is history. */ -# define __set_errno(val) ((errno) = (val)) -# endif /* _LIBC */ - -# ifdef __UCLIBC_HAS_THREADS__ +# ifdef __UCLIBC_HAS_THREADS__ /* When using threads, errno is a per-thread value. */ -# define errno (*__errno_location ()) -# endif - -#endif /* !__ASSEMBLER__ */ - +# define errno (*__errno_location ()) +# endif +# endif /* !__ASSEMBLER__ */ #endif /* _ERRNO_H */ + +#if !defined _ERRNO_H && defined __need_Emath +/* This is ugly but the kernel header is not clean enough. We must + define only the values EDOM, EILSEQ and ERANGE in case __need_Emath is + defined. */ +# define EDOM 33 /* Math argument out of domain of function. */ +# define EILSEQ 84 /* Illegal byte sequence. */ +# define ERANGE 34 /* Math result not representable. */ +#endif /* !_ERRNO_H && __need_Emath */ diff --git a/libc/sysdeps/linux/common/bits/syscalls.h b/libc/sysdeps/linux/common/bits/syscalls.h index e891af8e5..4895c4fa0 100644 --- a/libc/sysdeps/linux/common/bits/syscalls.h +++ b/libc/sysdeps/linux/common/bits/syscalls.h @@ -5,6 +5,4 @@ * forbidden. Don't do it. It is bad for you. */ - -#error You have not provided architecture specific _syscall[0-5] macros - +#error You have not provided architecture specific _syscall[0-6] macros diff --git a/libc/sysdeps/linux/common/bits/uClibc_errno.h b/libc/sysdeps/linux/common/bits/uClibc_errno.h new file mode 100644 index 000000000..9da9f8155 --- /dev/null +++ b/libc/sysdeps/linux/common/bits/uClibc_errno.h @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2000-2006 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ +#ifndef _BITS_UCLIBC_ERRNO_H +#define _BITS_UCLIBC_ERRNO_H 1 + +#ifdef IS_IN_rtld +# undef errno +# define errno _dl_errno +extern int _dl_errno; // attribute_hidden; +#elif defined __UCLIBC_HAS_THREADS__ +# include +# if USE___THREAD +# undef errno +# ifndef NOT_IN_libc +# define errno __libc_errno +# else +# define errno errno +# endif +extern __thread int errno __attribute_tls_model_ie; +# endif /* USE___THREAD */ +#endif /* IS_IN_rtld */ + +#define __set_errno(val) (errno = (val)) + +#ifndef __ASSEMBLER__ +extern int *__errno_location (void) __THROW __attribute__ ((__const__)) +# ifdef IS_IN_rtld + attribute_hidden +# endif +; +#include +#if USE___THREAD +libc_hidden_proto(__errno_location) +#endif + +/* We now need a declaration of the `errno' variable. */ +# ifndef __UCLIBC_HAS_THREADS__ +/*extern int errno;*/ +libc_hidden_proto(errno) +# endif +#endif /* !__ASSEMBLER__ */ + +#endif -- cgit v1.2.3