/*
- * $Id: cnid.h,v 1.11 2005-05-03 14:55:12 didg Exp $
+ * $Id: cnid.h,v 1.12 2005-09-07 15:23:21 didg Exp $
*
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
#define CNID_FLAG_SETUID 0x04 /* Set db owner to parent folder owner. */
#define CNID_FLAG_BLOCK 0x08 /* block signals in update. */
#define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */
+#define CNID_FLAG_LAZY_INIT 0x20 /* */
#define CNID_INVALID 0
/*
* $Log: cnid.h,v $
- * Revision 1.11 2005-05-03 14:55:12 didg
+ * Revision 1.12 2005-09-07 15:23:21 didg
+ *
+ * lazy init dbd database, help with pre tiger OS and a lot of volumes.
+ *
+ * Revision 1.11 2005/05/03 14:55:12 didg
*
* remove gcc warning
*
/*
- * $Id: cnid_dbd.c,v 1.3 2005-05-03 14:55:13 didg Exp $
+ * $Id: cnid_dbd.c,v 1.4 2005-09-07 15:23:22 didg Exp $
*
* Copyright (C) Joerg Lenneis 2003
* All Rights Reserved. See COPYING.
while (1) {
if (db->fd == -1) {
+ struct cnid_dbd_rqst rqst_stamp;
+ struct cnid_dbd_rply rply_stamp;
+ char stamp[ADEDLEN_PRIVSYN];
+
if ((db->fd = init_tsock(db)) < 0) {
time(&t);
if (t - orig > MAX_DELAY)
return -1;
continue;
}
+ dbd_initstamp(&rqst_stamp);
+ memset(stamp, 0, ADEDLEN_PRIVSYN);
+ rply_stamp.name = stamp;
+ rply_stamp.namelen = ADEDLEN_PRIVSYN;
+
+ if (dbd_rpc(db, &rqst_stamp, &rply_stamp, silent) < 0)
+ goto transmit_fail;
+ if (dbd_reply_stamp(&rply_stamp ) < 0)
+ goto transmit_fail;
+
if (db->notfirst) {
- struct cnid_dbd_rqst rqst_stamp;
- struct cnid_dbd_rply rply_stamp;
- char stamp[ADEDLEN_PRIVSYN];
-
- dbd_initstamp(&rqst_stamp);
- memset(stamp, 0, ADEDLEN_PRIVSYN);
- rply_stamp.name = stamp;
- rply_stamp.namelen = ADEDLEN_PRIVSYN;
-
- if (dbd_rpc(db, &rqst_stamp, &rply_stamp, silent) < 0)
- goto transmit_fail;
- if (dbd_reply_stamp(&rply_stamp ) < 0)
- goto transmit_fail;
if (memcmp(stamp, db->stamp, ADEDLEN_PRIVSYN)) {
LOG(log_error, logtype_cnid, "transmit: not the same db!");
db->changed = 1;
return -1;
}
}
-
+ else {
+ db->notfirst = 1;
+ if (db->client_stamp) {
+ memcpy(db->client_stamp, stamp, ADEDLEN_PRIVSYN);
+ }
+ memcpy(db->stamp, stamp, ADEDLEN_PRIVSYN);
+ }
}
- if (!dbd_rpc(db, rqst, rply, silent))
+ if (!dbd_rpc(db, rqst, rply, silent)) {
return 0;
-
+ }
transmit_fail:
silent = 0; /* From now on dbd_rpc and subroutines called from there
will log messages if something goes wrong again */
return NULL;
}
- cdb->flags = CNID_FLAG_PERSISTENT;
+ cdb->flags = CNID_FLAG_PERSISTENT | CNID_FLAG_LAZY_INIT;
cdb->cnid_add = cnid_dbd_add;
cdb->cnid_delete = cnid_dbd_delete;
return name;
}
-/* --------------------- */
-static int dbd_getstamp(CNID_private *db, void *buffer, const size_t len)
-{
- struct cnid_dbd_rqst rqst;
- struct cnid_dbd_rply rply;
-
- memset(buffer, 0, len);
- dbd_initstamp(&rqst);
-
- rply.name = buffer;
- rply.namelen = len;
-
- if (transmit(db, &rqst, &rply) < 0) {
- errno = CNID_ERR_DB;
- return -1;
- }
- return dbd_reply_stamp(&rply);
-}
-
/* ---------------------- */
int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len)
{
CNID_private *db;
- int ret;
if (!cdb || !(db = cdb->_private) || len != ADEDLEN_PRIVSYN) {
LOG(log_error, logtype_cnid, "cnid_getstamp: Parameter error");
errno = CNID_ERR_PARAM;
return -1;
}
- ret = dbd_getstamp(db, buffer, len);
- if (!ret) {
- db->notfirst = 1;
- memcpy(db->stamp, buffer, len);
- }
- return ret;
+ db->client_stamp = buffer;
+ db->stamp_size = len;
+ memset(buffer,0, len);
+ return 0;
}
/* ---------------------- */