00001
00002
00003
00004
00005
00006
00007
00008 #include "config.h"
00009
00010 #ifndef lint
00011 static const char revid[] = "$Id: os__rw_8c-source.html,v 1.1 2008/06/08 10:21:29 sebdiaz Exp $";
00012 #endif
00013
00014 #ifndef NO_SYSTEM_INCLUDES
00015 #include <sys/types.h>
00016
00017 #include <string.h>
00018 #include <unistd.h>
00019 #endif
00020
00021 #include "db_int.h"
00022 #include "os_jump.h"
00023
00024
00025
00026
00027
00028
00029
00030 int
00031 CDB___os_io(dbenv, db_iop, op, niop)
00032 DB_ENV *dbenv;
00033 DB_IO *db_iop;
00034 int op;
00035 size_t *niop;
00036 {
00037 int ret;
00038
00039 #if defined(HAVE_PREAD) && defined(HAVE_PWRITE)
00040 switch (op) {
00041 case DB_IO_READ:
00042 if (CDB___db_jump.j_read != NULL)
00043 goto slow;
00044 *niop = pread(db_iop->fhp->fd, db_iop->buf,
00045 db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
00046 break;
00047 case DB_IO_WRITE:
00048 if (CDB___db_jump.j_write != NULL)
00049 goto slow;
00050 *niop = pwrite(db_iop->fhp->fd, db_iop->buf,
00051 db_iop->bytes, (off_t)db_iop->pgno * db_iop->pagesize);
00052 break;
00053 }
00054 if (*niop == (size_t)db_iop->bytes)
00055 return (0);
00056 slow:
00057 #endif
00058 MUTEX_THREAD_LOCK(db_iop->mutexp);
00059
00060 if ((ret = CDB___os_seek(dbenv, db_iop->fhp,
00061 db_iop->pagesize, db_iop->pgno, 0, 0, DB_OS_SEEK_SET)) != 0)
00062 goto err;
00063 switch (op) {
00064 case DB_IO_READ:
00065 ret = CDB___os_read(dbenv,
00066 db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
00067 break;
00068 case DB_IO_WRITE:
00069 ret = CDB___os_write(dbenv,
00070 db_iop->fhp, db_iop->buf, db_iop->bytes, niop);
00071 break;
00072 }
00073
00074 err: MUTEX_THREAD_UNLOCK(db_iop->mutexp);
00075
00076 return (ret);
00077
00078 }
00079
00080
00081
00082
00083
00084
00085
00086 int
00087 CDB___os_read(dbenv, fhp, addr, len, nrp)
00088 DB_ENV *dbenv;
00089 DB_FH *fhp;
00090 void *addr;
00091 size_t len;
00092 size_t *nrp;
00093 {
00094 size_t offset;
00095 ssize_t nr;
00096 int ret;
00097 u_int8_t *taddr;
00098
00099 for (taddr = addr,
00100 offset = 0; offset < len; taddr += nr, offset += nr) {
00101 if ((nr = CDB___db_jump.j_read != NULL ?
00102 CDB___db_jump.j_read(fhp->fd, taddr, len - offset) :
00103 read(fhp->fd, taddr, len - offset)) < 0) {
00104 ret = CDB___os_get_errno();
00105 CDB___db_err(dbenv, "read: 0x%x, %lu: %s", taddr,
00106 (u_long)len-offset, strerror(ret));
00107 return (ret);
00108 }
00109 if (nr == 0)
00110 break;
00111 }
00112 *nrp = taddr - (u_int8_t *)addr;
00113 return (0);
00114 }
00115
00116
00117
00118
00119
00120
00121
00122 int
00123 CDB___os_write(dbenv, fhp, addr, len, nwp)
00124 DB_ENV *dbenv;
00125 DB_FH *fhp;
00126 void *addr;
00127 size_t len;
00128 size_t *nwp;
00129 {
00130 size_t offset;
00131 ssize_t nw;
00132 int ret;
00133 u_int8_t *taddr;
00134
00135 for (taddr = addr,
00136 offset = 0; offset < len; taddr += nw, offset += nw)
00137 if ((nw = CDB___db_jump.j_write != NULL ?
00138 CDB___db_jump.j_write(fhp->fd, taddr, len - offset) :
00139 write(fhp->fd, taddr, len - offset)) < 0){
00140 ret = CDB___os_get_errno();
00141 CDB___db_err(dbenv, "write: 0x%x, %lu: %s", taddr,
00142 (u_long)len-offset, strerror(ret));
00143 return (ret);
00144 }
00145 *nwp = len;
00146 return (0);
00147 }