resetting manifest requested domain to floor
[platform/upstream/db4.git] / os_brew / os_rw.c
1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 1997-2009 Oracle.  All rights reserved.
5  *
6  * $Id$
7  */
8
9 #include "db_config.h"
10
11 #include "db_int.h"
12
13 /*
14  * __os_io --
15  *      Do an I/O.
16  */
17 int
18 __os_io(env, op, fhp, pgno, pgsize, relative, io_len, buf, niop)
19         ENV *env;
20         int op;
21         DB_FH *fhp;
22         db_pgno_t pgno;
23         u_int32_t pgsize, relative, io_len;
24         u_int8_t *buf;
25         size_t *niop;
26 {
27         int ret;
28
29         MUTEX_LOCK(env, fhp->mtx_fh);
30
31         if ((ret = __os_seek(env, fhp, pgno, pgsize, relative)) != 0)
32                 goto err;
33         switch (op) {
34         case DB_IO_READ:
35                 ret = __os_read(env, fhp, buf, io_len, niop);
36                 break;
37         case DB_IO_WRITE:
38                 ret = __os_write(env, fhp, buf, io_len, niop);
39                 break;
40         default:
41                 ret = EINVAL;
42                 break;
43         }
44
45 err:    MUTEX_UNLOCK(env, fhp->mtx_fh);
46
47         return (ret);
48
49 }
50
51 /*
52  * __os_read --
53  *      Read from a file handle.
54  */
55 int
56 __os_read(env, fhp, addr, len, nrp)
57         ENV *env;
58         DB_FH *fhp;
59         void *addr;
60         size_t len;
61         size_t *nrp;
62 {
63         FileInfo pInfo;
64         int ret;
65         size_t offset, nr;
66         char *taddr;
67
68         ret = 0;
69
70 #if defined(HAVE_STATISTICS)
71         ++fhp->read_count;
72 #endif
73
74         for (taddr = addr, offset = 0, nr = 0;
75             offset < len; taddr += nr, offset += (u_int32_t)nr) {
76                 LAST_PANIC_CHECK_BEFORE_IO(env);
77                 nr = (size_t)IFILE_Read(fhp->ifp, addr, len);
78                 /* an error occured, or we reached the end of the file */
79                 if (nr == 0)
80                         break;
81         }
82         if (nr == 0) {
83                 IFILE_GetInfo(fhp->ifp, &pInfo);
84                 if (pInfo.dwSize != 0) {/* not an empty file */
85         /*
86          * If we have not reached the end of the file,
87          * we got an error in IFILE_Read
88          */
89                         if (IFILE_Seek(
90                             fhp->ifp, _SEEK_CURRENT, 0) != pInfo.dwSize) {
91                                 ret = __os_get_syserr();
92                                 __db_syserr(env, ret, "IFILE_Read: %#lx, %lu",
93                                     P_TO_ULONG(addr), (u_long)len);
94                                 ret = __os_posix_err(ret);
95                         }
96                 }
97         }
98         *nrp = (size_t)(taddr - (u_int8_t *)addr);
99         return (ret);
100 }
101
102 /*
103  * __os_write --
104  *      Write to a file handle.
105  */
106 int
107 __os_write(env, fhp, addr, len, nwp)
108         ENV *env;
109         DB_FH *fhp;
110         void *addr;
111         size_t len;
112         size_t *nwp;
113 {
114
115 #ifdef HAVE_FILESYSTEM_NOTZERO
116         /* Zero-fill as necessary. */
117         if (__os_fs_notzero()) {
118                 int ret;
119                 if ((ret = __db_zero_fill(env, fhp)) != 0)
120                         return (ret);
121         }
122 #endif
123         return (__os_physwrite(env, fhp, addr, len, nwp));
124 }
125
126 /*
127  * __os_physwrite --
128  *      Physical write to a file handle.
129  */
130 int
131 __os_physwrite(env, fhp, addr, len, nwp)
132         ENV *env;
133         DB_FH *fhp;
134         void *addr;
135         size_t len;
136         size_t *nwp;
137 {
138         int ret;
139
140         ret = 0;
141
142 #if defined(HAVE_STATISTICS)
143         ++fhp->write_count;
144 #endif
145
146         LAST_PANIC_CHECK_BEFORE_IO(env);
147         if ((*nwp = (size_t)IFILE_Write(fhp->ifp, addr, len)) != len) {
148                 ret = __os_get_syserr();
149                 __db_syserr(env, ret, "IFILE_Write: %#lx, %lu",
150                     P_TO_ULONG(addr), (u_long)len);
151                 ret = __os_posix_err(ret);
152         }
153         return (ret);
154 }