]> arthur.barton.de Git - netatalk.git/blobdiff - include/atalk/cnid.h
Support for using $u username variable in AFP volume definitions
[netatalk.git] / include / atalk / cnid.h
index 57aa1c7de5979a3bb36c502aceca45ccc19f2a25..4fefcd0439a0b902ef6548fdc9f3143629e77429 100644 (file)
@@ -1,19 +1,44 @@
-/* 
- * 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 <rlewczuk@pronet.pl>
+ * 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 <sys/cdefs.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <string.h>
+#include <atalk/adouble.h>
+#include <atalk/list.h>
+#include <atalk/uuid.h>
 
-#include <netatalk/endian.h>
+/* 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 */
 
 #define CNID_INVALID   0
+/* first valid ID */
+#define CNID_START     17
 
 #define CNID_ERR_PARAM 0x80000001
 #define CNID_ERR_PATH  0x80000002
 #define CNID_ERR_CLOSE 0x80000004   /* the db was not open */
 #define CNID_ERR_MAX   0x80000005
 
-typedef u_int32_t cnid_t;
-
-/* cnid_open.c */
-extern void *cnid_open __P((const char *, mode_t));
-
-/* cnid_close.c */
-extern void cnid_close __P((void *));
-
-/* cnid_add.c */
-extern cnid_t cnid_add __P((void *, const struct stat *, const cnid_t,
-                           const char *, const int, cnid_t));
-
-/* 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 *, void *, u_int32_t )); 
-extern cnid_t cnid_lookup __P((void *, const struct stat *, const cnid_t,
-                              const char *, const int));
-
-/* cnid_update.c */
-extern int cnid_update __P((void *, const cnid_t, const struct stat *,
-                           const cnid_t, const char *, int));
-
-/* cnid_delete.c */
-extern int cnid_delete __P((void *, const cnid_t));
-
-/* cnid_nextid.c */
-extern cnid_t cnid_nextid __P((void *));
-
-/* cnid_mangle_* */
-extern int cnid_mangle_add __P((void *, char *, char *));
-extern char *cnid_mangle_get __P((void *, char *));
-
-extern int cnid_lock   __P((void *));
-extern int cnid_unlock __P((void *));
+/*
+ * 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_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;
+
+/*
+ * 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;
+};
 
-#endif /* include/atalk/cnid.h */
+/*
+ * 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. */
+
+};
+typedef struct _cnid_module cnid_module;
+
+/* Inititalize the CNID backends */
+void cnid_init();
+
+/* Registers new CNID backend module */
+void cnid_register(struct _cnid_module *module);
+
+/* 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