]> arthur.barton.de Git - netatalk.git/blob - libatalk/cnid/tdb/cnid_tdb_update.c
Olaf Hering at suse.de warning fixes.
[netatalk.git] / libatalk / cnid / tdb / cnid_tdb_update.c
1 /*
2  * $Id: cnid_tdb_update.c,v 1.1.2.1.2.1 2005-01-30 20:56:23 didg Exp $
3  */
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif
8
9 #ifdef CNID_BACKEND_TDB
10
11 #include "cnid_tdb.h"
12 #include <atalk/logger.h>
13
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 */ )
17 {
18     struct _cnid_tdb_private *db;
19     TDB_DATA key, data, altdata;
20
21     if (!cdb || !(db = cdb->_private) || !id || !st || !name || (db->flags & TDBFLAG_DB_RO)) {
22         return -1;
23     }
24
25     memset(&key, 0, sizeof(key));
26     memset(&altdata, 0, sizeof(altdata));
27
28
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);
34     if (!data.dptr)
35         return 0;
36
37     key.dptr = data.dptr;
38     key.dsize = TDB_DEVINO_LEN;
39     tdb_delete(db->tdb_devino, key); 
40
41     key.dptr = (char *)data.dptr + TDB_DEVINO_LEN;
42     key.dsize = data.dsize - TDB_DEVINO_LEN;
43     tdb_delete(db->tdb_didname, key); 
44
45     free(data.dptr);
46     /* Make a new entry. */
47     data.dptr = make_tdb_data(st, did, name, len);
48     data.dsize = TDB_HEADER_LEN + len + 1;
49
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)) {
54         goto update_err;
55     }
56
57     /* Put in a new dev/ino mapping. */
58     key.dptr = data.dptr;
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)) {
63         goto update_err;
64     }
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)) {
69         goto update_err;
70     }
71
72     return 0;
73 update_err:
74     LOG(log_error, logtype_default, "cnid_update: Unable to update CNID %u",
75         ntohl(id));
76     return -1;
77
78 }
79
80 #endif