Import BSDDB 4.7.25 (as of svn r89086)
This commit is contained in:
129
os/os_errno.c
Normal file
129
os/os_errno.c
Normal file
@@ -0,0 +1,129 @@
|
||||
/*-
|
||||
* See the file LICENSE for redistribution information.
|
||||
*
|
||||
* Copyright (c) 1999,2008 Oracle. All rights reserved.
|
||||
*
|
||||
* $Id: os_errno.c 63573 2008-05-23 21:43:21Z trent.nelson $
|
||||
*/
|
||||
|
||||
#include "db_config.h"
|
||||
|
||||
#include "db_int.h"
|
||||
|
||||
/*
|
||||
* __os_get_errno_ret_zero --
|
||||
* Return the last system error, including an error of zero.
|
||||
*
|
||||
* PUBLIC: int __os_get_errno_ret_zero __P((void));
|
||||
*/
|
||||
int
|
||||
__os_get_errno_ret_zero()
|
||||
{
|
||||
/* This routine must be able to return the same value repeatedly. */
|
||||
return (errno);
|
||||
}
|
||||
|
||||
/*
|
||||
* We've seen cases where system calls failed but errno was never set. For
|
||||
* that reason, __os_get_errno() and __os_get_syserr set errno to EAGAIN if
|
||||
* it's not already set, to work around the problem. For obvious reasons,
|
||||
* we can only call this function if we know an error has occurred, that
|
||||
* is, we can't test the return for a non-zero value after the get call.
|
||||
*
|
||||
* __os_get_errno --
|
||||
* Return the last ANSI C "errno" value or EAGAIN if the last error
|
||||
* is zero.
|
||||
*
|
||||
* PUBLIC: int __os_get_errno __P((void));
|
||||
*/
|
||||
int
|
||||
__os_get_errno()
|
||||
{
|
||||
/* This routine must be able to return the same value repeatedly. */
|
||||
return (__os_get_syserr());
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* __os_get_neterr --
|
||||
* Return the last network-related error or EAGAIN if the last
|
||||
* error is zero.
|
||||
*
|
||||
* PUBLIC: int __os_get_neterr __P((void));
|
||||
*/
|
||||
int
|
||||
__os_get_neterr()
|
||||
{
|
||||
/* This routine must be able to return the same value repeatedly. */
|
||||
return (__os_get_syserr());
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* __os_get_syserr --
|
||||
* Return the last system error or EAGAIN if the last error is zero.
|
||||
*
|
||||
* PUBLIC: int __os_get_syserr __P((void));
|
||||
*/
|
||||
int
|
||||
__os_get_syserr()
|
||||
{
|
||||
/* This routine must be able to return the same value repeatedly. */
|
||||
if (errno == 0)
|
||||
__os_set_errno(EAGAIN);
|
||||
return (errno);
|
||||
}
|
||||
|
||||
/*
|
||||
* __os_set_errno --
|
||||
* Set the value of errno.
|
||||
*
|
||||
* PUBLIC: void __os_set_errno __P((int));
|
||||
*/
|
||||
void
|
||||
__os_set_errno(evalue)
|
||||
int evalue;
|
||||
{
|
||||
/*
|
||||
* This routine is called by the compatibility interfaces (DB 1.85,
|
||||
* dbm and hsearch). Force values > 0, that is, not one of DB 2.X
|
||||
* and later's public error returns. If something bad has happened,
|
||||
* default to EFAULT -- a nasty return. Otherwise, default to EINVAL.
|
||||
* As the compatibility APIs aren't included on Windows, the Windows
|
||||
* version of this routine doesn't need this behavior.
|
||||
*/
|
||||
errno =
|
||||
evalue >= 0 ? evalue : (evalue == DB_RUNRECOVERY ? EFAULT : EINVAL);
|
||||
}
|
||||
|
||||
/*
|
||||
* __os_strerror --
|
||||
* Return a string associated with the system error.
|
||||
*
|
||||
* PUBLIC: char *__os_strerror __P((int, char *, size_t));
|
||||
*/
|
||||
char *
|
||||
__os_strerror(error, buf, len)
|
||||
int error;
|
||||
char *buf;
|
||||
size_t len;
|
||||
{
|
||||
/* No translation is needed in the POSIX layer. */
|
||||
(void)strncpy(buf, strerror(error), len - 1);
|
||||
buf[len - 1] = '\0';
|
||||
|
||||
return (buf);
|
||||
}
|
||||
|
||||
/*
|
||||
* __os_posix_err
|
||||
* Convert a system error to a POSIX error.
|
||||
*
|
||||
* PUBLIC: int __os_posix_err __P((int));
|
||||
*/
|
||||
int
|
||||
__os_posix_err(error)
|
||||
int error;
|
||||
{
|
||||
return (error);
|
||||
}
|
||||
Reference in New Issue
Block a user