2 * $Id: cnid_tdb_update.c,v 1.1.2.1.2.1 2005-01-30 20:56:23 didg Exp $
9 #ifdef CNID_BACKEND_TDB
12 #include <atalk/logger.h>
14 int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
15 const cnid_t did, char *name, const int len
16 /*, const char *info, const int infolen */ )
18 struct _cnid_tdb_private *db;
19 TDB_DATA key, data, altdata;
21 if (!cdb || !(db = cdb->_private) || !id || !st || !name || (db->flags & TDBFLAG_DB_RO)) {
25 memset(&key, 0, sizeof(key));
26 memset(&altdata, 0, sizeof(altdata));
29 /* Get the old info. */
30 key.dptr = (char *)&id;
31 key.dsize = sizeof(id);
32 memset(&data, 0, sizeof(data));
33 data = tdb_fetch(db->tdb_cnid, key);
38 key.dsize = TDB_DEVINO_LEN;
39 tdb_delete(db->tdb_devino, key);
41 key.dptr = (char *)data.dptr + TDB_DEVINO_LEN;
42 key.dsize = data.dsize - TDB_DEVINO_LEN;
43 tdb_delete(db->tdb_didname, key);
46 /* Make a new entry. */
47 data.dptr = make_tdb_data(st, did, name, len);
48 data.dsize = TDB_HEADER_LEN + len + 1;
50 /* Update the old CNID with the new info. */
51 key.dptr = (char *) &id;
52 key.dsize = sizeof(id);
53 if (tdb_store(db->tdb_cnid, key, data, TDB_REPLACE)) {
57 /* Put in a new dev/ino mapping. */
59 key.dsize = TDB_DEVINO_LEN;
60 altdata.dptr = (char *) &id;
61 altdata.dsize = sizeof(id);
62 if (tdb_store(db->tdb_devino, key, altdata, TDB_REPLACE)) {
65 /* put in a new did/name mapping. */
66 key.dptr = (char *) data.dptr + TDB_DEVINO_LEN;
67 key.dsize = data.dsize - TDB_DEVINO_LEN;
68 if (tdb_store(db->tdb_didname, key, altdata, TDB_REPLACE)) {
74 LOG(log_error, logtype_default, "cnid_update: Unable to update CNID %u",