X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=libatalk%2Fcnid%2Fcnid.c;h=fde4d70f500298b3de09f6189de46e7f2eaffe22;hp=68136f9f196594325119d762eae8ec1154f06397;hb=5eb3b5ac51c8221009041928a5a08c101d2be743;hpb=4054f4b3c85ecab060dafd46c0d3632cadbb5803 diff --git a/libatalk/cnid/cnid.c b/libatalk/cnid/cnid.c index 68136f9f..fde4d70f 100644 --- a/libatalk/cnid/cnid.c +++ b/libatalk/cnid/cnid.c @@ -29,6 +29,8 @@ #include #include #include +#include +#include /* List of all registered modules. */ static struct list_head modules = ATALK_LIST_HEAD_INIT(modules); @@ -90,8 +92,7 @@ static int cnid_dir(const char *dir, mode_t mask) } /* 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; @@ -118,7 +119,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla 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); @@ -127,7 +128,11 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla } } - 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)) { @@ -139,16 +144,15 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla } 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); @@ -161,7 +165,7 @@ struct _cnid_db *cnid_open(const char *volpath, mode_t mask, char *type, int fla } /* ------------------- */ -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); @@ -169,7 +173,7 @@ static void block_signal( u_int32_t flags) } /* ------------------- */ -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); @@ -199,14 +203,14 @@ static cnid_t valide(cnid_t id) /* 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); @@ -216,11 +220,14 @@ u_int32_t 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; } @@ -229,9 +236,9 @@ int cnid_delete(struct _cnid_db *cdb, cnid_t id) { 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; } @@ -241,9 +248,9 @@ cnid_t cnid_get(struct _cnid_db *cdb, const cnid_t did, char *name,const size_t { 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; } @@ -262,9 +269,9 @@ time_t t; 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; } @@ -274,9 +281,9 @@ cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did { 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; } @@ -290,9 +297,9 @@ int cnid_find(struct _cnid_db *cdb, const char *name, size_t namelen, void *buff 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; } @@ -301,9 +308,9 @@ char *cnid_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len) { 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; @@ -317,9 +324,9 @@ int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st, { 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; } @@ -329,8 +336,20 @@ cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st, const cnid_ { 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; }