12 fe = emalloc(128*sizeof(Entry));
13 for(i=0; i<128-1; i++)
14 fe[i].name = (char*)&fe[i+1];
20 memset(e, 0, sizeof *e);
32 _removedb(Db *db, char *name)
36 memset(&k, 0, sizeof k);
38 e = (Entry*)avldelete(db->avl, &k);
44 _insertdb(Db *db, Entry *e)
50 o = (Entry*)avlinsert(db->avl, ne);
56 entrycmp(Avl *a, Avl *b)
62 return strcmp(ea->name, eb->name);
76 else if((fd = open(file, ORDWR)) < 0)
77 sysfatal("opendb %s: %r", file);
78 db = emalloc(sizeof(Db));
79 db->avl = avlcreate(entrycmp);
85 for(; s=Brdstr(&b, '\n', 1); free(s)){
87 nf = tokenize(s, f, nelem(f));
89 sysfatal("bad database entry '%s'", t);
91 if(strcmp(f[2], "REMOVED") == 0)
94 memset(&e, 0, sizeof e);
96 e.d.name = atom(f[1]);
97 if(strcmp(e.d.name, "-")==0)
99 e.d.mode = strtoul(f[2], 0, 8);
100 e.d.uid = atom(f[3]);
101 e.d.gid = atom(f[4]);
102 e.d.mtime = strtoul(f[5], 0, 10);
103 e.d.length = strtoll(f[6], 0, 10);
112 _finddb(Db *db, char *name, Dir *d, int domark)
116 memset(&k, 0, sizeof k);
119 e = (Entry*)avllookup(db->avl, &k, 0);
122 memset(d, 0, sizeof *d);
126 d->mtime = e->d.mtime;
128 d->length = e->d.length;
135 finddb(Db *db, char *name, Dir *d)
137 return _finddb(db, name, d, 0);
141 markdb(Db *db, char *name, Dir *d)
143 return _finddb(db, name, d, 1);
147 removedb(Db *db, char *name)
149 if(db->fd>=0 && fprint(db->fd, "%q xxx REMOVED xxx xxx 0 0\n", name) < 0)
150 sysfatal("appending to db: %r");
155 insertdb(Db *db, char *name, Dir *d)
160 memset(&e, 0, sizeof e);
162 e.d.name = atom(d->name);
163 e.d.uid = atom(d->uid);
164 e.d.gid = atom(d->gid);
165 e.d.mtime = d->mtime;
167 e.d.length = d->length;
168 e.d.mark = d->muid!=0;
171 if(strcmp(name, dname) == 0)
173 if(db->fd>=0 && fprint(db->fd, "%q %q %luo %q %q %lud %lld\n", name, dname, d->mode, d->uid, d->gid, d->mtime, d->length) < 0)
174 sysfatal("appending to db: %r");