X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=blobdiff_plain;f=include%2Fatalk%2Fcnid.h;h=4fefcd0439a0b902ef6548fdc9f3143629e77429;hp=29e428793aead488bf348a309e2aecbbd9ed83bf;hb=5eb3b5ac51c8221009041928a5a08c101d2be743;hpb=74dcc04843e362161d552d0f671dab900626b570 diff --git a/include/atalk/cnid.h b/include/atalk/cnid.h index 29e42879..4fefcd04 100644 --- a/include/atalk/cnid.h +++ b/include/atalk/cnid.h @@ -1,49 +1,122 @@ -/* - * interface for database access to cnids. i do it this way to abstract - * things a bit in case we want to change the underlying implementation. +/* + * Copyright (c) 2003 the Netatalk Team + * Copyright (c) 2003 Rafal Lewczuk + * Copyright (c) 2010 Frank Lahm + * + * This program is free software; you can redistribute and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation version 2 of the License or later + * version if explicitly stated by any of above copyright holders. + * */ -#ifndef _ATALK_CNID_H -#define _ATALK_CNID_H 1 +/* + * This file contains all generic CNID related stuff + * declarations. Included: + * - CNID factory, which retrieves (eventually instantiates) + * CNID objects on demand + * - selection of CNID backends (default, detected by volume) + * - full set of CNID operations needed by server core. + */ + +#ifndef _ATALK_CNID__H +#define _ATALK_CNID__H 1 + +#include +#include +#include -#include -#include -#include -#include +/* CNID object flags */ +#define CNID_FLAG_PERSISTENT 0x01 /* This backend implements DID persistence */ +#define CNID_FLAG_MANGLING 0x02 /* This backend has name mangling feature. */ +#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_FLAG_MEMORY 0x40 /* this is a memory only db */ +#define CNID_FLAG_INODE 0x80 /* in cnid_add the inode is authoritative */ -#include +#define CNID_INVALID 0 +/* first valid ID */ +#define CNID_START 17 #define CNID_ERR_PARAM 0x80000001 #define CNID_ERR_PATH 0x80000002 #define CNID_ERR_DB 0x80000003 -#define CNID_ERR_MAX 0x80000004 +#define CNID_ERR_CLOSE 0x80000004 /* the db was not open */ +#define CNID_ERR_MAX 0x80000005 -typedef u_int32_t cnid_t; +/* + * This is instance of CNID database object. + */ +typedef struct _cnid_db { + uint32_t cnid_db_flags; /* Flags describing some CNID backend aspects. */ + struct vol *cnid_db_vol; + void *cnid_db_private; /* back-end speficic data */ -/* cnid_open.c */ -extern void *cnid_open __P((const char *)); + cnid_t (*cnid_add) (struct _cnid_db *cdb, const struct stat *st, cnid_t did, + const char *name, size_t, cnid_t hint); + int (*cnid_delete) (struct _cnid_db *cdb, cnid_t id); + cnid_t (*cnid_get) (struct _cnid_db *cdb, cnid_t did, const char *name, size_t); + cnid_t (*cnid_lookup) (struct _cnid_db *cdb, const struct stat *st, cnid_t did, + const char *name, size_t); + cnid_t (*cnid_nextid) (struct _cnid_db *cdb); + char * (*cnid_resolve) (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len); + int (*cnid_update) (struct _cnid_db *cdb, cnid_t id, const struct stat *st, + cnid_t did, const char *name, size_t len); + void (*cnid_close) (struct _cnid_db *cdb); + int (*cnid_getstamp) (struct _cnid_db *cdb, void *buffer, const size_t len); + cnid_t (*cnid_rebuild_add) (struct _cnid_db *, const struct stat *, cnid_t, + const char *, size_t, cnid_t); + int (*cnid_find) (struct _cnid_db *cdb, const char *name, size_t namelen, + void *buffer, size_t buflen); + int (*cnid_wipe) (struct _cnid_db *cdb); +} cnid_db; -/* cnid_close.c */ -extern void cnid_close __P((void *)); +/* + * Consolidation of args passedn from main cnid_open to modules cnid_XXX_open, so + * that it's easier to add aditional args as required. + */ +struct cnid_open_args { + uint32_t cnid_args_flags; + struct vol *cnid_args_vol; +}; -/* cnid_add.c */ -extern cnid_t cnid_add __P((void *, const struct stat *, const cnid_t, - const char *, const int, cnid_t)); +/* + * CNID module - represents particular CNID implementation + */ +struct _cnid_module { + char *name; + struct list_head db_list; /* CNID modules are also stored on a bidirectional list. */ + struct _cnid_db *(*cnid_open)(struct cnid_open_args *args); + uint32_t flags; /* Flags describing some CNID backend aspects. */ -/* cnid_get.c */ -extern cnid_t cnid_get __P((void *, const cnid_t, const char *, const int)); -extern char *cnid_resolve __P((void *, cnid_t *)); -extern cnid_t cnid_lookup __P((void *, const struct stat *, const cnid_t, - const char *, const int)); +}; +typedef struct _cnid_module cnid_module; -/* cnid_update.c */ -extern int cnid_update __P((void *, const cnid_t, const struct stat *, - const cnid_t, const char *, int)); +/* Inititalize the CNID backends */ +void cnid_init(); -/* cnid_delete.c */ -extern int cnid_delete __P((void *, const cnid_t)); +/* Registers new CNID backend module */ +void cnid_register(struct _cnid_module *module); -/* cnid_nextid.c */ -extern cnid_t cnid_nextid __P((void *)); +/* This function opens a CNID database for selected volume. */ +struct _cnid_db *cnid_open(struct vol *vol, char *type, int 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); +int cnid_delete (struct _cnid_db *cdb, cnid_t id); +cnid_t cnid_get (struct _cnid_db *cdb, const cnid_t did, char *name,const size_t len); +int cnid_getstamp (struct _cnid_db *cdb, void *buffer, const size_t len); +cnid_t cnid_lookup (struct _cnid_db *cdb, const struct stat *st, const cnid_t did, + char *name, const size_t len); +char *cnid_resolve (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len); +int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st, + const cnid_t did, char *name, const size_t len); +cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did, + char *name, const size_t len, cnid_t hint); +int cnid_find (struct _cnid_db *cdb, const char *name, size_t namelen, + void *buffer, size_t buflen); +int cnid_wipe (struct _cnid_db *cdb); +void cnid_close (struct _cnid_db *db); -#endif /* include/atalk/cnid.h */ +#endif