3 #endif /* HAVE_CONFIG_H */
5 #ifdef CNID_BACKEND_CDB
6 #include "cnid_cdb_private.h"
8 #define LOGFILEMAX 100 /* kbytes */
9 #define CHECKTIMEMAX 30 /* minutes */
11 /* This returns the CNID corresponding to a particular file. It will
12 * also fix up the various databases if there's a problem. */
13 cnid_t cnid_cdb_lookup(struct _cnid_db *cdb, const struct stat *st, cnid_t did,
14 const char *name, size_t len)
18 DBT key, devdata, diddata;
19 char dev[CNID_DEV_LEN];
20 char ino[CNID_INO_LEN];
21 int devino = 1, didname = 1;
22 u_int32_t type_devino = (unsigned)-1;
23 u_int32_t type_didname = (unsigned)-1;
26 cnid_t id_devino, id_didname,id = 0;
29 if (!cdb || !(db = cdb->_private) || !st || !name) {
33 if ((buf = make_cnid_data(cdb->flags, st, did, name, len)) == NULL) {
34 LOG(log_error, logtype_default, "cnid_lookup: Pathname is too long");
38 memcpy(&type, buf +CNID_TYPE_OFS, sizeof(type));
41 memset(&key, 0, sizeof(key));
42 memset(&diddata, 0, sizeof(diddata));
43 memset(&devdata, 0, sizeof(devdata));
45 /* Look for a CNID for our did/name */
46 key.data = buf +CNID_DEVINO_OFS;
47 key.size = CNID_DEVINO_LEN;
49 memcpy(dev, buf + CNID_DEV_OFS, CNID_DEV_LEN);
50 memcpy(ino, buf + CNID_INO_OFS, CNID_INO_LEN);
52 if (0 != (rc = db->db_didname->get(db->db_devino, NULL, &key, &devdata, 0 )) ) {
53 if (rc != DB_NOTFOUND) {
54 LOG(log_error, logtype_default, "cnid_lookup: Unable to get CNID did 0x%x, name %s: %s",
55 did, name, db_strerror(rc));
61 memcpy(&id_devino, devdata.data, sizeof(cnid_t));
62 memcpy(&type_devino, (char *)devdata.data +CNID_TYPE_OFS, sizeof(type_devino));
63 type_devino = ntohl(type_devino);
66 buf = make_cnid_data(cdb->flags, st, did, name, len);
67 key.data = buf +CNID_DID_OFS;
68 key.size = CNID_DID_LEN + len + 1;
70 if (0 != (rc = db->db_didname->get(db->db_didname, NULL, &key, &diddata, 0 ) ) ) {
71 if (rc != DB_NOTFOUND) {
72 LOG(log_error, logtype_default, "cnid_lookup: Unable to get CNID did 0x%x, name %s: %s",
73 did, name, db_strerror(rc));
79 memcpy(&id_didname, diddata.data, sizeof(cnid_t));
80 memcpy(&type_didname, (char *)diddata.data +CNID_TYPE_OFS, sizeof(type_didname));
81 type_didname = ntohl(type_didname);
84 if (!devino && !didname) {
88 if (devino && didname && id_devino == id_didname && type_devino == type) {
96 * if it's the same dev or not the same type
99 if (!memcmp(dev, (char *)diddata.data + CNID_DEV_OFS, CNID_DEV_LEN) ||
100 type_didname != type) {
101 if (cnid_cdb_delete(cdb, id) < 0) {
112 if (type_devino != type) {
113 /* same dev:inode but not same type one is a folder the other
114 * is a file,it's an inode reused, delete the record
116 if (cnid_cdb_delete(cdb, id) < 0) {
127 /* Fix up the database. assume it was a file move and rename */
128 cnid_cdb_update(cdb, id, st, did, name, len);
131 LOG(log_debug9, logtype_default, "cnid_lookup: Looked up did %u, name %s, as %u (needed update)", ntohl(did), name, ntohl(id));
136 #endif /* CNID_BACKEND_CDB */