-/*
- * $Id: cnid_tdb_update.c,v 1.2 2005-04-28 20:50:02 bfernhomberg Exp $
- */
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "cnid_tdb.h"
#include <atalk/logger.h>
-int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
- const cnid_t did, char *name, const int len
- /*, const char *info, const int infolen */ )
+int cnid_tdb_update(struct _cnid_db *cdb, cnid_t id, const struct stat *st,
+ cnid_t did, const char *name, size_t len)
{
struct _cnid_tdb_private *db;
TDB_DATA key, data, altdata;
- if (!cdb || !(db = cdb->_private) || !id || !st || !name || (db->flags & TDBFLAG_DB_RO)) {
+ if (!cdb || !(db = cdb->_private) || !id || !st || !name || (db->flags & CNIDFLAG_DB_RO)) {
return -1;
}
memset(&altdata, 0, sizeof(altdata));
- /* Get the old info. */
- key.dptr = (char *)&id;
- key.dsize = sizeof(id);
- memset(&data, 0, sizeof(data));
- data = tdb_fetch(db->tdb_cnid, key);
- if (!data.dptr)
- return 0;
-
- key.dptr = data.dptr;
- key.dsize = TDB_DEVINO_LEN;
- tdb_delete(db->tdb_devino, key);
+ /* Get the old info. search by dev/ino */
+ data.dptr = make_tdb_data(cdb->flags, st, did, name, len);
+ data.dsize = CNID_HEADER_LEN + len + 1;
+ key.dptr = data.dptr +CNID_DEVINO_OFS;
+ key.dsize = CNID_DEVINO_LEN;
+ altdata = tdb_fetch(db->tdb_devino, key);
+ if (altdata.dptr) {
+ tdb_delete(db->tdb_devino, key);
+
+ key.dptr = altdata.dptr;
+ key.dsize = sizeof(id);
+
+ data = tdb_fetch(db->tdb_cnid, key);
+ tdb_delete(db->tdb_cnid, key);
+ free(altdata.dptr);
+
+ if (data.dptr) {
+ key.dptr = (char *)data.dptr +CNID_DID_OFS;
+ key.dsize = data.dsize - CNID_DID_OFS;
+ tdb_delete(db->tdb_didname, key);
+
+ free(data.dptr);
+ }
+ }
- key.dptr = (char *)data.dptr + TDB_DEVINO_LEN;
- key.dsize = data.dsize - TDB_DEVINO_LEN;
- tdb_delete(db->tdb_didname, key);
+ /* search by did/name */
+ data.dptr = make_tdb_data(cdb->flags, st, did, name, len);
+ data.dsize = CNID_HEADER_LEN + len + 1;
+ key.dptr = (char *)data.dptr +CNID_DID_OFS;
+ key.dsize = data.dsize - CNID_DID_OFS;
+ altdata = tdb_fetch(db->tdb_didname, key);
+ if (altdata.dptr) {
+ tdb_delete(db->tdb_didname, key);
+
+ key.dptr = altdata.dptr;
+ key.dsize = sizeof(id);
+ data = tdb_fetch(db->tdb_cnid, key);
+ tdb_delete(db->tdb_cnid, key);
+ free(altdata.dptr);
+
+ if (data.dptr) {
+ key.dptr = data.dptr +CNID_DEVINO_OFS;
+ key.dsize = CNID_DEVINO_LEN;
+ tdb_delete(db->tdb_devino, key);
+ free(data.dptr);
+ }
+ }
+
- free(data.dptr);
/* Make a new entry. */
- data.dptr = make_tdb_data(st, did, name, len);
- data.dsize = TDB_HEADER_LEN + len + 1;
+ data.dptr = make_tdb_data(cdb->flags, st, did, name, len);
+ data.dsize = CNID_HEADER_LEN + len + 1;
+ memcpy(data.dptr, &id, sizeof(id));
/* Update the old CNID with the new info. */
key.dptr = (char *) &id;
}
/* Put in a new dev/ino mapping. */
- key.dptr = data.dptr;
- key.dsize = TDB_DEVINO_LEN;
+ key.dptr = data.dptr +CNID_DEVINO_OFS;
+ key.dsize = CNID_DEVINO_LEN;
altdata.dptr = (char *) &id;
altdata.dsize = sizeof(id);
if (tdb_store(db->tdb_devino, key, altdata, TDB_REPLACE)) {
goto update_err;
}
/* put in a new did/name mapping. */
- key.dptr = (char *) data.dptr + TDB_DEVINO_LEN;
- key.dsize = data.dsize - TDB_DEVINO_LEN;
+ key.dptr = (char *) data.dptr +CNID_DID_OFS;
+ key.dsize = data.dsize -CNID_DID_OFS;
+
if (tdb_store(db->tdb_didname, key, altdata, TDB_REPLACE)) {
goto update_err;
}
return 0;
update_err:
- LOG(log_error, logtype_default, "cnid_update: Unable to update CNID %u",
- ntohl(id));
+ LOG(log_error, logtype_default, "cnid_update: Unable to update CNID %u", ntohl(id));
return -1;
}