s/qmail  3.3.23
Next generation secure email transport
cdbmss.c
Go to the documentation of this file.
1 #include "readwrite.h"
2 #include "seek.h"
3 #include "alloc.h"
4 #include "cdbmss.h"
5 
6 int cdbmss_start(struct cdbmss *c, int fd)
7 {
8  cdbmake_init(&c->cdbm);
9  c->fd = fd;
10  c->pos = sizeof(c->cdbm.final);
11  substdio_fdbuf(&c->ss,write,fd,c->ssbuf,sizeof(c->ssbuf));
12  return seek_set(fd,(seek_pos) c->pos);
13 }
14 
15 int cdbmss_add(struct cdbmss *c,unsigned char *key,unsigned int keylen,unsigned char *data,unsigned int datalen)
16 {
17  uint32 h;
18  int i;
19 
20  cdbmake_pack(c->packbuf,(uint32) keylen);
21  cdbmake_pack(c->packbuf + 4,(uint32) datalen);
22  if (substdio_put(&c->ss,c->packbuf,8) == -1) return -1;
23  if (substdio_put(&c->ss,key,keylen) == -1) return -1;
24  if (substdio_put(&c->ss,data,datalen) == -1) return -1;
25 
27  for (i = 0;i < keylen;++i)
28  h = cdbmake_hashadd(h,(unsigned int) key[i]);
29 
30  if (!cdbmake_add(&c->cdbm,h,c->pos,alloc)) return -1;
31 
32  c->pos += 8 + keylen + datalen; /* XXX: overflow? */
33  return 0;
34 }
35 
36 int cdbmss_finish(struct cdbmss *c)
37 {
38  int i;
39  uint32 len;
40  uint32 u;
41 
42  if (!cdbmake_split(&c->cdbm,alloc)) return -1;
43 
44  for (i = 0;i < 256;++i) {
45  len = cdbmake_throw(&c->cdbm,c->pos,i);
46  for (u = 0;u < len;++u) {
47  cdbmake_pack(c->packbuf,c->cdbm.hash[u].h);
48  cdbmake_pack(c->packbuf + 4,c->cdbm.hash[u].p);
49  if (substdio_put(&c->ss,c->packbuf,8) == -1) return -1;
50  c->pos += 8; /* XXX: overflow? */
51  }
52  }
53 
54  if (substdio_flush(&c->ss) == -1) return -1;
55  if (seek_begin(c->fd) == -1) return -1;
56  return substdio_putflush(&c->ss,c->cdbm.final,sizeof(c->cdbm.final));
57 }
int cdbmss_start(struct cdbmss *c, int fd)
Definition: cdbmss.c:6
char * alloc(unsigned int n)
Definition: alloc.c:16
void cdbmake_pack(unsigned char *, uint32)
Definition: cdbmake_pack.c:3
int fd
Definition: idedit.c:16
int seek_set()
int cdbmake_add(struct cdbmake *, uint32, uint32, char *(*alloc)())
Definition: cdbmake_add.c:12
int cdbmss_finish(struct cdbmss *c)
Definition: cdbmss.c:36
char ssbuf[1024]
Definition: cdbmss.h:8
stralloc key
Definition: fastforward.c:119
int cdbmss_add(struct cdbmss *c, unsigned char *key, unsigned int keylen, unsigned char *data, unsigned int datalen)
Definition: cdbmss.c:15
struct cdbmake_hp * hash
Definition: cdbmake.h:22
struct cdbmake cdbm
Definition: cdbmss.h:9
unsigned len
Definition: matchup.c:36
unsigned i
Definition: matchup.c:36
substdio ss
Definition: cdbmss.h:10
int substdio_putflush()
void substdio_fdbuf(register substdio *s, register int(*op)(), register int fd, register char *buf, register int len)
Definition: substdio.c:3
void cdbmake_init(struct cdbmake *)
Definition: cdbmake_add.c:4
char final[2048]
Definition: cdbmake.h:17
#define seek_begin(fd)
Definition: seek.h:13
uint32 cdbmake_hashadd(uint32, unsigned int)
Definition: cdbmake_hash.c:3
#define CDBMAKE_HASHSTART
Definition: cdbmake.h:27
uint32 h
Definition: cdbmake.h:8
unsigned long seek_pos
Definition: seek.h:4
int substdio_put()
uint32 pos
Definition: cdbmss.h:12
stralloc data
Definition: fastforward.c:121
void h(char *home, int uid, int gid, int mode)
Definition: install.c:15
char packbuf[8]
Definition: cdbmss.h:11
int cdbmake_split(struct cdbmake *, char *(*alloc)())
Definition: cdbmake_add.c:31
uint32 p
Definition: cdbmake.h:8
uint32 cdbmake_throw(struct cdbmake *, uint32, int)
Definition: cdbmake_add.c:79
int substdio_flush()
unsigned u
Definition: matchup.c:36
Definition: cdbmss.h:7
int fd
Definition: cdbmss.h:13