1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 1999-2009 Oracle. All rights reserved.
*
* $Id$
*/
#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);
}
|