37 #if defined(LIBC_SCCS) && !defined(lint)
38 static char sccsid[] =
"@(#)rec_open.c 8.10 (Berkeley) 9/1/94";
41 #include <sys/types.h>
52 #include "../include/db.h"
56 __rec_open(fname, flags, mode, openinfo, dflags)
58 int flags, mode, dflags;
69 if (fname != NULL && (rfd = open(fname, flags, mode)) < 0)
75 if (openinfo->flags & ~(R_FIXEDLEN | R_NOKEY | R_SNAPSHOT))
78 btopeninfo.cachesize = openinfo->cachesize;
79 btopeninfo.maxkeypage = 0;
80 btopeninfo.minkeypage = 0;
81 btopeninfo.psize = openinfo->psize;
82 btopeninfo.compare = NULL;
83 btopeninfo.prefix = NULL;
84 btopeninfo.lorder = openinfo->lorder;
85 dbp = __bt_open(openinfo->bfname,
86 O_RDWR, S_IRUSR | S_IWUSR, &btopeninfo, dflags);
88 dbp = __bt_open(NULL, O_RDWR, S_IRUSR | S_IWUSR, NULL, dflags);
100 if (openinfo->flags & R_FIXEDLEN) {
102 t->bt_reclen = openinfo->reclen;
103 if (t->bt_reclen == 0)
106 t->bt_bval = openinfo->bval;
112 F_SET(t, R_EOF | R_INMEM);
123 if (lseek(rfd, (off_t)0, SEEK_CUR) == -1 && errno == ESPIPE) {
124 switch (flags & O_ACCMODE) {
131 slow:
if ((t->bt_rfp = fdopen(rfd,
"r")) == NULL)
135 F_ISSET(t, R_FIXLEN) ? __rec_fpipe : __rec_vpipe;
137 switch (flags & O_ACCMODE) {
161 #ifdef MMAP_NOT_AVAILABLE
169 t->bt_msize = sb.st_size;
170 if ((t->bt_smap = mmap(NULL, t->bt_msize,
171 PROT_READ, MAP_PRIVATE, rfd,
172 (off_t)0)) == MAP_FAILED
174 t->bt_cmap = t->bt_smap;
175 t->bt_emap = t->bt_smap + sb.st_size;
176 t->bt_irec = F_ISSET(t, R_FIXLEN) ?
177 __rec_fmap : __rec_vmap;
178 F_SET(t, R_MEMMAPPED);
187 dbp->close = __rec_close;
188 dbp->del = __rec_delete;
190 dbp->get = __rec_get;
191 dbp->put = __rec_put;
192 dbp->seq = __rec_seq;
193 dbp->sync = __rec_sync;
196 if ((h = mpool_get(t->bt_mp, P_ROOT, 0)) == NULL)
198 if ((h->flags & P_TYPE) == P_BLEAF) {
201 mpool_put(t->bt_mp, h, MPOOL_DIRTY);
203 mpool_put(t->bt_mp, h, 0);
205 if (openinfo && openinfo->flags & R_SNAPSHOT &&
206 !F_ISSET(t, R_EOF | R_INMEM) &&
207 t->bt_irec(t, MAX_REC_NUMBER) == RET_ERROR)
211 einval: errno = EINVAL;
212 err: sverrno = errno;
214 (void)__bt_close(dbp);
230 if (t->bt_pinned != NULL) {
231 mpool_put(t->bt_mp, t->bt_pinned, 0);
236 if (F_ISSET(t, R_INMEM)) {