#include <atalk/list.h>
#include <atalk/logger.h>
#include <atalk/util.h>
+#include <atalk/compat.h>
+#include <atalk/volume.h>
/* List of all registered modules. */
static struct list_head modules = ATALK_LIST_HEAD_INIT(modules);
}
/* Opens CNID database using particular back-end */
-struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int flags,
- const char *cnidsrv, const char *cnidport)
+struct _cnid_db *cnid_open(struct vol *vol, char *type, int flags)
{
struct _cnid_db *db;
cnid_module *mod = NULL;
LOG(log_error, logtype_afpd, "seteuid failed %s", strerror(errno));
return NULL;
}
- if (cnid_dir(volpath, mask) < 0) {
+ if (cnid_dir(vol->v_path, vol->v_umask) < 0) {
if ( setegid(gid) < 0 || seteuid(uid) < 0) {
LOG(log_error, logtype_afpd, "can't seteuid back %s", strerror(errno));
exit(EXITERR_SYS);
}
}
- struct cnid_open_args args = {volpath, mask, flags, cnidsrv, cnidport};
+ struct cnid_open_args args = {
+ .cnid_args_flags = flags,
+ .cnid_args_vol = vol
+ };
+
db = mod->cnid_open(&args);
if ((mod->flags & CNID_FLAG_SETUID) && !(flags & CNID_FLAG_MEMORY)) {
}
if (NULL == db) {
- LOG(log_error, logtype_afpd, "Cannot open CNID db at [%s].", volpath);
+ LOG(log_error, logtype_afpd, "Cannot open CNID db at [%s].", vol->v_path);
return NULL;
}
- /* FIXME should module know about it ? */
- if ((flags & CNID_FLAG_NODEV)) {
- db->flags |= CNID_FLAG_NODEV;
- }
- db->flags |= mod->flags;
- if ((db->flags & CNID_FLAG_BLOCK)) {
+ db->cnid_db_flags |= mod->flags;
+ if (flags & CNID_FLAG_NODEV)
+ db->cnid_db_flags |= CNID_FLAG_NODEV;
+
+ if (db->cnid_db_flags & CNID_FLAG_BLOCK) {
sigemptyset(&sigblockset);
sigaddset(&sigblockset, SIGTERM);
sigaddset(&sigblockset, SIGHUP);
}
/* ------------------- */
-static void block_signal( u_int32_t flags)
+static void block_signal(uint32_t flags)
{
if ((flags & CNID_FLAG_BLOCK)) {
pthread_sigmask(SIG_BLOCK, &sigblockset, NULL);
}
/* ------------------- */
-static void unblock_signal(u_int32_t flags)
+static void unblock_signal(uint32_t flags)
{
if ((flags & CNID_FLAG_BLOCK)) {
pthread_sigmask(SIG_UNBLOCK, &sigblockset, NULL);
/* Closes CNID database. Currently it's just a wrapper around db->cnid_close(). */
void cnid_close(struct _cnid_db *db)
{
-u_int32_t flags;
+ uint32_t flags;
if (NULL == db) {
LOG(log_error, logtype_afpd, "Error: cnid_close called with NULL argument !");
return;
}
/* cnid_close free db */
- flags = db->flags;
+ flags = db->cnid_db_flags;
block_signal(flags);
db->cnid_close(db);
unblock_signal(flags);
cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
const char *name, const size_t len, cnid_t hint)
{
-cnid_t ret;
+ cnid_t ret;
+
+ if (len == 0)
+ return CNID_INVALID;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = valide(cdb->cnid_add(cdb, st, did, name, len, hint));
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
{
int ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_delete(cdb, id);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
{
cnid_t ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = valide(cdb->cnid_get(cdb, did, name, len));
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
memcpy(buffer, &t, sizeof(time_t));
return 0;
}
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_getstamp(cdb, buffer, len);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
{
cnid_t ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = valide(cdb->cnid_lookup(cdb, st, did, name, len));
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
return -1;
}
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_find(cdb, name, namelen, buffer, buflen);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
{
char *ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_resolve(cdb, id, buffer, len);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
if (ret && !strcmp(ret, "..")) {
LOG(log_error, logtype_afpd, "cnid_resolve: name is '..', corrupted db? ");
ret = NULL;
{
int ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_update(cdb, id, st, did, name, len);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}
{
cnid_t ret;
- block_signal(cdb->flags);
+ block_signal(cdb->cnid_db_flags);
ret = cdb->cnid_rebuild_add(cdb, st, did, name, len, hint);
- unblock_signal(cdb->flags);
+ unblock_signal(cdb->cnid_db_flags);
+ return ret;
+}
+
+/* --------------- */
+int cnid_wipe(struct _cnid_db *cdb)
+{
+ int ret = 0;
+
+ block_signal(cdb->cnid_db_flags);
+ if (cdb->cnid_wipe)
+ ret = cdb->cnid_wipe(cdb);
+ unblock_signal(cdb->cnid_db_flags);
return ret;
}