#include "db_config.h"
#include "db_int.h"
int
__os_io(dbenv, op, fhp, pgno, pgsize, relative, io_len, buf, niop)
DB_ENV *dbenv;
int op;
DB_FH *fhp;
db_pgno_t pgno;
u_int32_t pgsize, relative, io_len;
u_int8_t *buf;
size_t *niop;
{
int ret;
MUTEX_LOCK(dbenv, fhp->mtx_fh);
if ((ret = __os_seek(dbenv, fhp, pgno, pgsize, relative)) != 0)
goto err;
switch (op) {
case DB_IO_READ:
ret = __os_read(dbenv, fhp, buf, io_len, niop);
break;
case DB_IO_WRITE:
ret = __os_write(dbenv, fhp, buf, io_len, niop);
break;
default:
ret = EINVAL;
break;
}
err: MUTEX_UNLOCK(dbenv, fhp->mtx_fh);
return (ret);
}
int
__os_read(dbenv, fhp, addr, len, nrp)
DB_ENV *dbenv;
DB_FH *fhp;
void *addr;
size_t len;
size_t *nrp;
{
FileInfo pInfo;
int ret;
ret = 0;
if ((*nrp = (size_t)IFILE_Read(fhp->ifp, addr, len)) != len) {
IFILE_GetInfo(fhp->ifp, &pInfo);
if (pInfo.dwSize != 0) {
ret = __os_get_syserr();
__db_syserr(dbenv, ret, "IFILE_Read: %#lx, %lu",
P_TO_ULONG(addr), (u_long)len);
ret = __os_posix_err(ret);
}
}
return (ret);
}
int
__os_write(dbenv, fhp, addr, len, nwp)
DB_ENV *dbenv;
DB_FH *fhp;
void *addr;
size_t len;
size_t *nwp;
{
#ifdef HAVE_FILESYSTEM_NOTZERO
if (__os_fs_notzero()) {
int ret;
if ((ret = __os_zerofill(dbenv, fhp)) != 0)
return (ret);
}
#endif
return (__os_physwrite(dbenv, fhp, addr, len, nwp));
}
int
__os_physwrite(dbenv, fhp, addr, len, nwp)
DB_ENV *dbenv;
DB_FH *fhp;
void *addr;
size_t len;
size_t *nwp;
{
int ret;
PANIC_CHECK(dbenv);
ret = 0;
if ((*nwp = (size_t)IFILE_Write(fhp->ifp, addr, len)) != len) {
ret = __os_get_syserr();
__db_syserr(dbenv, ret, "IFILE_Write: %#lx, %lu",
P_TO_ULONG(addr), (u_long)len);
ret = __os_posix_err(ret);
}
return (ret);
}