2 * Copyright (c) 2003 the Netatalk Team
3 * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl>
4 * Copyright (c) 2010 Frank Lahm
6 * This program is free software; you can redistribute and/or modify
7 * it under the terms of the GNU General Public License as published
8 * by the Free Software Foundation version 2 of the License or later
9 * version if explicitly stated by any of above copyright holders.
14 * This file contains all generic CNID related stuff
15 * declarations. Included:
16 * - CNID factory, which retrieves (eventually instantiates)
17 * CNID objects on demand
18 * - selection of CNID backends (default, detected by volume)
19 * - full set of CNID operations needed by server core.
22 #ifndef _ATALK_CNID__H
23 #define _ATALK_CNID__H 1
25 #include <atalk/adouble.h>
26 #include <atalk/list.h>
27 #include <atalk/uuid.h>
29 /* CNID object flags */
30 #define CNID_FLAG_PERSISTENT 0x01 /* This backend implements DID persistence */
31 #define CNID_FLAG_MANGLING 0x02 /* This backend has name mangling feature. */
32 #define CNID_FLAG_SETUID 0x04 /* Set db owner to parent folder owner. */
33 #define CNID_FLAG_BLOCK 0x08 /* block signals in update. */
34 #define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */
35 #define CNID_FLAG_LAZY_INIT 0x20 /* */
36 #define CNID_FLAG_MEMORY 0x40 /* this is a memory only db */
37 #define CNID_FLAG_INODE 0x80 /* in cnid_add the inode is authoritative */
39 #define CNID_INVALID 0
43 #define CNID_ERR_PARAM 0x80000001
44 #define CNID_ERR_PATH 0x80000002
45 #define CNID_ERR_DB 0x80000003
46 #define CNID_ERR_CLOSE 0x80000004 /* the db was not open */
47 #define CNID_ERR_MAX 0x80000005
50 * This is instance of CNID database object.
52 typedef struct _cnid_db {
53 uint32_t cnid_db_flags; /* Flags describing some CNID backend aspects. */
54 struct vol *cnid_db_vol;
55 void *cnid_db_private; /* back-end speficic data */
57 cnid_t (*cnid_add) (struct _cnid_db *cdb, const struct stat *st, cnid_t did,
58 const char *name, size_t, cnid_t hint);
59 int (*cnid_delete) (struct _cnid_db *cdb, cnid_t id);
60 cnid_t (*cnid_get) (struct _cnid_db *cdb, cnid_t did, const char *name, size_t);
61 cnid_t (*cnid_lookup) (struct _cnid_db *cdb, const struct stat *st, cnid_t did,
62 const char *name, size_t);
63 cnid_t (*cnid_nextid) (struct _cnid_db *cdb);
64 char * (*cnid_resolve) (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
65 int (*cnid_update) (struct _cnid_db *cdb, cnid_t id, const struct stat *st,
66 cnid_t did, const char *name, size_t len);
67 void (*cnid_close) (struct _cnid_db *cdb);
68 int (*cnid_getstamp) (struct _cnid_db *cdb, void *buffer, const size_t len);
69 cnid_t (*cnid_rebuild_add) (struct _cnid_db *, const struct stat *, cnid_t,
70 const char *, size_t, cnid_t);
71 int (*cnid_find) (struct _cnid_db *cdb, const char *name, size_t namelen,
72 void *buffer, size_t buflen);
73 int (*cnid_wipe) (struct _cnid_db *cdb);
77 * Consolidation of args passedn from main cnid_open to modules cnid_XXX_open, so
78 * that it's easier to add aditional args as required.
80 struct cnid_open_args {
81 uint32_t cnid_args_flags;
82 struct vol *cnid_args_vol;
86 * CNID module - represents particular CNID implementation
90 struct list_head db_list; /* CNID modules are also stored on a bidirectional list. */
91 struct _cnid_db *(*cnid_open)(struct cnid_open_args *args);
92 uint32_t flags; /* Flags describing some CNID backend aspects. */
95 typedef struct _cnid_module cnid_module;
97 /* Inititalize the CNID backends */
100 /* Registers new CNID backend module */
101 void cnid_register(struct _cnid_module *module);
103 /* This function opens a CNID database for selected volume. */
104 struct _cnid_db *cnid_open(struct vol *vol, char *type, int flags);
105 cnid_t cnid_add (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
106 const char *name, const size_t len, cnid_t hint);
107 int cnid_delete (struct _cnid_db *cdb, cnid_t id);
108 cnid_t cnid_get (struct _cnid_db *cdb, const cnid_t did, char *name,const size_t len);
109 int cnid_getstamp (struct _cnid_db *cdb, void *buffer, const size_t len);
110 cnid_t cnid_lookup (struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
111 char *name, const size_t len);
112 char *cnid_resolve (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len);
113 int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
114 const cnid_t did, char *name, const size_t len);
115 cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
116 char *name, const size_t len, cnid_t hint);
117 int cnid_find (struct _cnid_db *cdb, const char *name, size_t namelen,
118 void *buffer, size_t buflen);
119 int cnid_wipe (struct _cnid_db *cdb);
120 void cnid_close (struct _cnid_db *db);