]> arthur.barton.de Git - netatalk.git/commitdiff
more tdb fixes
authordidg <didg>
Fri, 20 Nov 2009 19:25:05 +0000 (19:25 +0000)
committerdidg <didg>
Fri, 20 Nov 2009 19:25:05 +0000 (19:25 +0000)
libatalk/cnid/tdb/cnid_tdb_delete.c
libatalk/cnid/tdb/cnid_tdb_lookup.c
libatalk/cnid/tdb/cnid_tdb_update.c

index 355445a856fbc403da993a807ae6b6e5e0da1e9e..aa801e584ac29c43a16be416e2a881771fb52d2b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_tdb_delete.c,v 1.3 2009-11-20 17:37:14 didg Exp $
+ * $Id: cnid_tdb_delete.c,v 1.4 2009-11-20 19:25:05 didg Exp $
  *
  * Copyright (c) 1999. Adrian Sun (asun@zoology.washington.edu)
  * All Rights Reserved. See COPYRIGHT.
@@ -41,7 +41,7 @@ int cnid_tdb_delete(struct _cnid_db *cdb, const cnid_t id)
     tdb_delete(db->tdb_devino, key); 
 
     key.dptr = (char *)data.dptr +CNID_DID_OFS;
-    key.dsize = data.dsize -CNID_DID_OFS;;
+    key.dsize = data.dsize -CNID_DID_OFS;
     tdb_delete(db->tdb_didname, key); 
 
     free(data.dptr);
index f666016a3765c9a2d51a04fab8abb65a402826e1..c693341450ff3e9705a9826ac03c7b7889376f30 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_tdb_lookup.c,v 1.4 2009-11-20 17:37:14 didg Exp $
+ * $Id: cnid_tdb_lookup.c,v 1.5 2009-11-20 19:25:05 didg Exp $
  */
 
 #ifdef HAVE_CONFIG_H
@@ -41,7 +41,7 @@ cnid_t cnid_tdb_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t
          devino = 0;
     }
     /* did/name now */
-    key.dptr = buf + +CNID_DID_OFS;
+    key.dptr = buf + CNID_DID_OFS;
     key.dsize = CNID_DID_LEN + len + 1;
     diddata = tdb_fetch(db->tdb_didname, key);
     if (!diddata.dptr) {
index 2c3c87cd84be16025ec1bfa853d3d962102c180b..44873ac998276fce2867da944f9ae6e2c708ec69 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: cnid_tdb_update.c,v 1.4 2009-11-20 17:37:14 didg Exp $
+ * $Id: cnid_tdb_update.c,v 1.5 2009-11-20 19:25:05 didg Exp $
  */
 
 #ifdef HAVE_CONFIG_H
@@ -26,23 +26,55 @@ int cnid_tdb_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st
     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;
-    }
+    /* 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;
-    tdb_delete(db->tdb_devino, key); 
+    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);
+        }
+    }
 
+    /* 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;
-    tdb_delete(db->tdb_didname, key); 
+    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(cdb->flags, st, did, name, len);
     data.dsize = CNID_HEADER_LEN + len + 1;