/*
- * $Id: cnid.c,v 1.13 2010-03-31 09:47:32 franklahm Exp $
- *
* Copyright (c) 2003 the Netatalk Team
* Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
*
#include <atalk/list.h>
#include <atalk/logger.h>
#include <atalk/util.h>
+#include <atalk/compat.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)
+ const char *cnidsrv, const char *cnidport, const void *obj, char *uuid)
{
struct _cnid_db *db;
cnid_module *mod = NULL;
}
}
- struct cnid_open_args args = {volpath, mask, flags, cnidsrv, cnidport};
+ struct cnid_open_args args = {volpath, mask, flags, cnidsrv, cnidport, obj, uuid};
db = mod->cnid_open(&args);
if ((mod->flags & CNID_FLAG_SETUID) && !(flags & CNID_FLAG_MEMORY)) {
}
/* ------------------- */
-static void block_signal( u_int32_t flags)
+static void block_signal(uint32_t flags)
{
if ((flags & CNID_FLAG_BLOCK)) {
- sigprocmask(SIG_BLOCK, &sigblockset, NULL);
+ 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)) {
- sigprocmask(SIG_UNBLOCK, &sigblockset, NULL);
+ 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 !");
/* --------------- */
cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- char *name, const size_t len, cnid_t hint)
+ 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);
ret = valide(cdb->cnid_add(cdb, st, did, name, len, hint));
/* --------------- */
cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
- char *name, const size_t len)
+ char *name, const size_t len)
{
-cnid_t ret;
+ cnid_t ret;
block_signal(cdb->flags);
ret = valide(cdb->cnid_lookup(cdb, st, did, name, len));
return ret;
}
+/* --------------- */
+int cnid_find(struct _cnid_db *cdb, const char *name, size_t namelen, void *buffer, size_t buflen)
+{
+ int ret;
+
+ if (cdb->cnid_find == NULL) {
+ LOG(log_error, logtype_cnid, "cnid_find not supported by CNID backend");
+ return -1;
+ }
+
+ block_signal(cdb->flags);
+ ret = cdb->cnid_find(cdb, name, namelen, buffer, buflen);
+ unblock_signal(cdb->flags);
+ return ret;
+}
+
/* --------------- */
char *cnid_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len)
{
unblock_signal(cdb->flags);
return ret;
}
+
+/* --------------- */
+int cnid_wipe(struct _cnid_db *cdb)
+{
+ int ret = 0;
+
+ block_signal(cdb->flags);
+ if (cdb->cnid_wipe)
+ ret = cdb->cnid_wipe(cdb);
+ unblock_signal(cdb->flags);
+ return ret;
+}