39d58e2f49
ported software: * If the macro B_USE_POSITIVE_POSIX_ERRORS is defined the POSIX error code constants (ENOMEM, EINTR,...) will have positive values. * Introduced the macros B_TO_{POSITIVE,NEGATIVE}_ERROR() which do convert a given error code to a positive/negative value. * Added static library libposix_error_mapper.a that overrides all POSIX functions (save the ones I forgot to add :-)) directly meddling with error codes (having them as parameter or returning them) dealing with the positive<->negative error code conversions. The functions have hidden visibility, so they affect only the shared object they are linked into. * So ideally all one has to do is to build a ported software with -DB_USE_POSITIVE_POSIX_ERRORS and -lposix_error_mapper and be good with respect to error code problems. * Potential issues: - When mixing ported and Haiku native code, i.e. using Haiku native code in a ported software or using a ported library in a Haiku native application care must be taken to convert error codes where the two interface. That's what the B_TO_{POSITIVE,NEGATIVE}_ERROR() macros are supposed to be used for. - A ported static library can obviously not be linked directly against -lposix_error_mapper. The shared object linking a against the ported static library has to do that. The previous point applies when that causes mixing with Haiku native code. - When dependent ported libraries are used probably all of them should use the error mapping. Comments welcome. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@29653 a95241bf-73f2-0310-859d-f6bbb57e9c96
47 lines
820 B
C
47 lines
820 B
C
/*
|
|
** Copyright 2003-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
|
|
** Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
/* Provides user space storage for "errno", located in TLS
|
|
*/
|
|
|
|
#include <errno.h>
|
|
|
|
#include "support/TLS.h"
|
|
#include "tls.h"
|
|
|
|
|
|
int *
|
|
_errnop(void)
|
|
{
|
|
return (int *)tls_address(TLS_ERRNO_SLOT);
|
|
}
|
|
|
|
|
|
// This is part of the Linuxbase binary specification
|
|
// and is referenced by some code in libgcc.a.
|
|
// ToDo: maybe we even want to include this always
|
|
#ifdef __linux__
|
|
extern int *(*__errno_location)(void) __attribute__ ((weak, alias("_errnop")));
|
|
#endif
|
|
|
|
|
|
// #pragma mark -
|
|
|
|
|
|
int
|
|
_to_positive_error(int error)
|
|
{
|
|
if (error < 0)
|
|
return error == B_NO_MEMORY ? B_POSIX_ENOMEM : -error;
|
|
return error;
|
|
}
|
|
|
|
|
|
int
|
|
_to_negative_error(int error)
|
|
{
|
|
return error > 0 ? -error : error;
|
|
}
|