s/qmail  3.3.23
Next generation secure email transport
cdb_seek.c
Go to the documentation of this file.
1 #include <sys/types.h>
2 #include <errno.h>
3 extern int errno;
4 #include "cdb.h"
5 
6 #ifndef SEEK_SET
7 #define SEEK_SET 0
8 #endif
9 
10 int cdb_bread(int fd,char *buf,int len)
11 {
12  int r;
13  while (len > 0) {
14  do
15  r = read(fd,buf,len);
16  while ((r == -1) && (errno == EINTR));
17  if (r == -1) return -1;
18  if (r == 0) { errno = EIO; return -1; }
19  buf += r;
20  len -= r;
21  }
22  return 0;
23 }
24 
25 static int match(int fd,char *key,unsigned int len)
26 {
27  char buf[32];
28  int n;
29  int i;
30 
31  while (len > 0) {
32  n = sizeof(buf);
33  if (n > len) n = len;
34  if (cdb_bread(fd,buf,n) == -1) return -1;
35  for (i = 0;i < n;++i) if (buf[i] != key[i]) return 0;
36  key += n;
37  len -= n;
38  }
39  return 1;
40 }
41 
42 int cdb_seek(int fd,char *key,unsigned int len,uint32 *dlen)
43 {
44  char packbuf[8];
45  uint32 pos;
46  uint32 h;
47  uint32 lenhash;
48  uint32 h2;
49  uint32 loop;
50  uint32 poskd;
51 
52  h = cdb_hash(key,len);
53 
54  pos = 8 * (h & 255);
55  if (lseek(fd,(off_t) pos,SEEK_SET) == -1) return -1;
56 
57  if (cdb_bread(fd,packbuf,8) == -1) return -1;
58 
59  pos = cdb_unpack(packbuf);
60  lenhash = cdb_unpack(packbuf + 4);
61 
62  if (!lenhash) return 0;
63  h2 = (h >> 8) % lenhash;
64 
65  for (loop = 0;loop < lenhash;++loop) {
66  if (lseek(fd,(off_t) (pos + 8 * h2),SEEK_SET) == -1) return -1;
67  if (cdb_bread(fd,packbuf,8) == -1) return -1;
68  poskd = cdb_unpack(packbuf + 4);
69  if (!poskd) return 0;
70  if (cdb_unpack(packbuf) == h) {
71  if (lseek(fd,(off_t) poskd,SEEK_SET) == -1) return -1;
72  if (cdb_bread(fd,packbuf,8) == -1) return -1;
73  if (cdb_unpack(packbuf) == len)
74  switch(match(fd,key,len)) {
75  case -1:
76  return -1;
77  case 1:
78  *dlen = cdb_unpack(packbuf + 4);
79  return 1;
80  }
81  }
82  if (++h2 == lenhash) h2 = 0;
83  }
84  return 0;
85 }
int fd
Definition: idedit.c:16
uint32 cdb_unpack(unsigned char *buf)
Definition: cdb_unpack.c:3
stralloc key
Definition: fastforward.c:119
unsigned len
Definition: matchup.c:36
unsigned i
Definition: matchup.c:36
int cdb_seek(int fd, char *key, unsigned int len, uint32 *dlen)
Definition: cdb_seek.c:42
int cdb_bread(int fd, char *buf, int len)
Definition: cdb_seek.c:10
int errno
uint32 dlen
Definition: fastforward.c:120
unsigned n
Definition: matchup.c:36
#define SEEK_SET
Definition: cdb_seek.c:7
void h(char *home, int uid, int gid, int mode)
Definition: install.c:15
unsigned char * buf
Definition: dns.c:41
int match
Definition: matchup.c:181
uint32 cdb_hash(char *, unsigned int)
Definition: cdb_hash.c:11