X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fcnid%2Fdbd%2Fcnid_dbd.c;h=1b365065cdd79194d2b8329fbef496bfa8ffdcf6;hb=f254fd618b53e97cc5382b23709d4f3de1e70b41;hp=e9d29fbbb26bbf06374f318a1282225eada1d2b8;hpb=ad220cd96d55445846d30b951a188ec5f9b849b2;p=netatalk.git diff --git a/libatalk/cnid/dbd/cnid_dbd.c b/libatalk/cnid/dbd/cnid_dbd.c index e9d29fbb..1b365065 100644 --- a/libatalk/cnid/dbd/cnid_dbd.c +++ b/libatalk/cnid/dbd/cnid_dbd.c @@ -26,12 +26,12 @@ #include #include #include +#include -#include #include #include #include -#include +#include #include #include "cnid_dbd.h" @@ -71,7 +71,9 @@ static int tsock_getfd(const char *host, const char *port) memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; +#ifdef AI_NUMERICSERV hints.ai_flags = AI_NUMERICSERV; +#endif if ((err = getaddrinfo(host, port, &hints, &servinfo)) != 0) { LOG(log_error, logtype_default, "tsock_getfd: getaddrinfo: CNID server %s:%s : %s\n", @@ -97,7 +99,7 @@ static int tsock_getfd(const char *host, const char *port) } if (setnonblock(sock, 1) != 0) { - LOG(log_error, logtype_cnid, "getfd: setnonblock: %s", strerror(err)); + LOG(log_error, logtype_cnid, "getfd: setnonblock: %s", strerror(errno)); close(sock); sock = -1; return -1; @@ -222,7 +224,7 @@ static int write_vec(int fd, struct iovec *iov, ssize_t towrite, int vecs) } /* --------------------- */ -static int init_tsock(CNID_private *db) +static int init_tsock(CNID_bdb_private *db) { int fd; int len; @@ -254,7 +256,7 @@ static int init_tsock(CNID_private *db) } /* --------------------- */ -static int send_packet(CNID_private *db, struct cnid_dbd_rqst *rqst) +static int send_packet(CNID_bdb_private *db, struct cnid_dbd_rqst *rqst) { struct iovec iov[2]; size_t towrite; @@ -310,7 +312,7 @@ static int dbd_reply_stamp(struct cnid_dbd_rply *rply) * assume send is non blocking * if no answer after sometime (at least MAX_DELAY secondes) return an error */ -static int dbd_rpc(CNID_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) +static int dbd_rpc(CNID_bdb_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) { ssize_t ret; char *nametmp; @@ -325,7 +327,7 @@ static int dbd_rpc(CNID_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd ret = readt(db->fd, rply, sizeof(struct cnid_dbd_rply), 0, ONE_DELAY); if (ret != sizeof(struct cnid_dbd_rply)) { - LOG(log_error, logtype_cnid, "dbd_rpc: Error reading header from fd (db_dir %s): %s", + LOG(log_debug, logtype_cnid, "dbd_rpc: Error reading header from fd (db_dir %s): %s", db->db_dir, ret == -1 ? strerror(errno) : "closed"); rply->name = nametmp; return -1; @@ -349,52 +351,23 @@ static int dbd_rpc(CNID_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd } /* -------------------- */ -static int transmit(CNID_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) +static int transmit(CNID_bdb_private *db, struct cnid_dbd_rqst *rqst, struct cnid_dbd_rply *rply) { time_t orig, t; int clean = 1; /* no errors so far - to prevent sleep on first try */ - if (db->changed) { - /* volume and db don't have the same timestamp - */ - return -1; - } while (1) { if (db->fd == -1) { - struct cnid_dbd_rqst rqst_stamp; - struct cnid_dbd_rply rply_stamp; - char stamp[ADEDLEN_PRIVSYN]; - LOG(log_maxdebug, logtype_cnid, "transmit: connecting to cnid_dbd ..."); if ((db->fd = init_tsock(db)) < 0) { goto transmit_fail; } - 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) < 0) - goto transmit_fail; - if (dbd_reply_stamp(&rply_stamp ) < 0) - goto transmit_fail; - if (db->notfirst) { - LOG(log_debug7, logtype_cnid, "transmit: reconnected to cnid_dbd, comparing database stamps..."); - if (memcmp(stamp, db->stamp, ADEDLEN_PRIVSYN)) { - LOG(log_error, logtype_cnid, "transmit: ... not the same db!"); - db->changed = 1; - return -1; - } - LOG(log_debug7, logtype_cnid, "transmit: ... OK."); + LOG(log_debug7, logtype_cnid, "transmit: reconnected to cnid_dbd"); } else { /* db->notfirst == 0 */ db->notfirst = 1; - if (db->client_stamp) - memcpy(db->client_stamp, stamp, ADEDLEN_PRIVSYN); - memcpy(db->stamp, stamp, ADEDLEN_PRIVSYN); } - LOG(log_debug, logtype_cnid, "transmit: attached to '%s', stamp: '%08lx'.", - db->db_dir, *(uint64_t *)stamp); + LOG(log_debug, logtype_cnid, "transmit: attached to '%s'", db->db_dir); } if (!dbd_rpc(db, rqst, rply)) { LOG(log_maxdebug, logtype_cnid, "transmit: {done}"); @@ -454,14 +427,14 @@ static struct _cnid_db *cnid_dbd_new(const char *volpath) cdb->cnid_update = cnid_dbd_update; cdb->cnid_rebuild_add = cnid_dbd_rebuild_add; cdb->cnid_close = cnid_dbd_close; - + cdb->cnid_wipe = cnid_dbd_wipe; return cdb; } /* ---------------------- */ struct _cnid_db *cnid_dbd_open(struct cnid_open_args *args) { - CNID_private *db = NULL; + CNID_bdb_private *db = NULL; struct _cnid_db *cdb = NULL; if (!args->dir) { @@ -473,7 +446,7 @@ struct _cnid_db *cnid_dbd_open(struct cnid_open_args *args) return NULL; } - if ((db = (CNID_private *)calloc(1, sizeof(CNID_private))) == NULL) { + if ((db = (CNID_bdb_private *)calloc(1, sizeof(CNID_bdb_private))) == NULL) { LOG(log_error, logtype_cnid, "cnid_open: Unable to allocate memory for database"); goto cnid_dbd_open_fail; } @@ -508,7 +481,7 @@ cnid_dbd_open_fail: /* ---------------------- */ void cnid_dbd_close(struct _cnid_db *cdb) { - CNID_private *db; + CNID_bdb_private *db; if (!cdb) { LOG(log_error, logtype_cnid, "cnid_close called with NULL argument !"); @@ -529,11 +502,37 @@ void cnid_dbd_close(struct _cnid_db *cdb) return; } +/** + * Get the db stamp + **/ +static int cnid_dbd_stamp(CNID_bdb_private *db) +{ + 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 (transmit(db, &rqst_stamp, &rply_stamp) < 0) + return -1; + if (dbd_reply_stamp(&rply_stamp ) < 0) + return -1; + + if (db->client_stamp) + memcpy(db->client_stamp, stamp, ADEDLEN_PRIVSYN); + memcpy(db->stamp, stamp, ADEDLEN_PRIVSYN); + + return 0; +} + /* ---------------------- */ cnid_t cnid_dbd_add(struct _cnid_db *cdb, const struct stat *st, cnid_t did, const char *name, size_t len, cnid_t hint) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; cnid_t id; @@ -564,8 +563,8 @@ cnid_t cnid_dbd_add(struct _cnid_db *cdb, const struct stat *st, rqst.name = name; rqst.namelen = len; - LOG(log_debug, logtype_cnid, "cnid_dbd_add: CNID: %u, name: '%s', inode: 0x%llx, type: %d (0=file, 1=dir)", - ntohl(did), name, (long long)st->st_ino, rqst.type); + LOG(log_debug, logtype_cnid, "cnid_dbd_add: CNID: %u, name: '%s', dev: 0x%llx, inode: 0x%llx, type: %s", + ntohl(did), name, (long long)rqst.dev, (long long)st->st_ino, rqst.type ? "dir" : "file"); rply.namelen = 0; if (transmit(db, &rqst, &rply) < 0) { @@ -597,7 +596,7 @@ cnid_t cnid_dbd_add(struct _cnid_db *cdb, const struct stat *st, /* ---------------------- */ cnid_t cnid_dbd_get(struct _cnid_db *cdb, cnid_t did, const char *name, size_t len) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; cnid_t id; @@ -650,7 +649,7 @@ cnid_t cnid_dbd_get(struct _cnid_db *cdb, cnid_t did, const char *name, size_t l /* ---------------------- */ char *cnid_dbd_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; char *name; @@ -704,10 +703,12 @@ char *cnid_dbd_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t le return name; } -/* ---------------------- */ +/** + * Caller passes buffer where we will store the db stamp + **/ int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len) { - CNID_private *db; + CNID_bdb_private *db; if (!cdb || !(db = cdb->_private) || len != ADEDLEN_PRIVSYN) { LOG(log_error, logtype_cnid, "cnid_getstamp: Parameter error"); @@ -716,15 +717,15 @@ int cnid_dbd_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len) } db->client_stamp = buffer; db->stamp_size = len; - memset(buffer,0, len); - return 0; + + return cnid_dbd_stamp(db); } /* ---------------------- */ cnid_t cnid_dbd_lookup(struct _cnid_db *cdb, const struct stat *st, cnid_t did, const char *name, size_t len) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; cnid_t id; @@ -785,7 +786,7 @@ cnid_t cnid_dbd_lookup(struct _cnid_db *cdb, const struct stat *st, cnid_t did, /* ---------------------- */ int cnid_dbd_find(struct _cnid_db *cdb, const char *name, size_t namelen, void *buffer, size_t buflen) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; int count; @@ -841,7 +842,7 @@ int cnid_dbd_find(struct _cnid_db *cdb, const char *name, size_t namelen, void * int cnid_dbd_update(struct _cnid_db *cdb, cnid_t id, const struct stat *st, cnid_t did, const char *name, size_t len) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; @@ -895,7 +896,7 @@ int cnid_dbd_update(struct _cnid_db *cdb, cnid_t id, const struct stat *st, cnid_t cnid_dbd_rebuild_add(struct _cnid_db *cdb, const struct stat *st, cnid_t did, const char *name, size_t len, cnid_t hint) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; cnid_t id; @@ -957,7 +958,7 @@ cnid_t cnid_dbd_rebuild_add(struct _cnid_db *cdb, const struct stat *st, /* ---------------------- */ int cnid_dbd_delete(struct _cnid_db *cdb, const cnid_t id) { - CNID_private *db; + CNID_bdb_private *db; struct cnid_dbd_rqst rqst; struct cnid_dbd_rply rply; @@ -992,6 +993,39 @@ int cnid_dbd_delete(struct _cnid_db *cdb, const cnid_t id) } } +int cnid_dbd_wipe(struct _cnid_db *cdb) +{ + CNID_bdb_private *db; + struct cnid_dbd_rqst rqst; + struct cnid_dbd_rply rply; + + if (!cdb || !(db = cdb->_private)) { + LOG(log_error, logtype_cnid, "cnid_wipe: Parameter error"); + errno = CNID_ERR_PARAM; + return -1; + } + + LOG(log_debug, logtype_cnid, "cnid_dbd_wipe"); + + RQST_RESET(&rqst); + rqst.op = CNID_DBD_OP_WIPE; + rqst.cnid = 0; + + rply.namelen = 0; + if (transmit(db, &rqst, &rply) < 0) { + errno = CNID_ERR_DB; + return -1; + } + + if (rply.result != CNID_DBD_RES_OK) { + errno = CNID_ERR_DB; + return -1; + } + LOG(log_debug, logtype_cnid, "cnid_dbd_wipe: ok"); + + return cnid_dbd_stamp(db); +} + struct _cnid_module cnid_dbd_module = { "dbd",