1/* 2 * Copyright (c) 2003 the Netatalk Team 3 * Copyright (c) 2003 Rafal Lewczuk <rlewczuk@pronet.pl> 4 * Copyright (c) 2010 Frank Lahm 5 * 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. 10 * 11 */ 12 13/* 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. 20 */ 21 22#ifndef _ATALK_CNID__H 23#define _ATALK_CNID__H 1 24 25#include <atalk/adouble.h> 26#include <atalk/list.h> 27 28/* CNID object flags */ 29#define CNID_FLAG_PERSISTENT 0x01 /* This backend implements DID persistence */ 30#define CNID_FLAG_MANGLING 0x02 /* This backend has name mangling feature. */ 31#define CNID_FLAG_SETUID 0x04 /* Set db owner to parent folder owner. */ 32#define CNID_FLAG_BLOCK 0x08 /* block signals in update. */ 33#define CNID_FLAG_NODEV 0x10 /* don't use device number only inode */ 34#define CNID_FLAG_LAZY_INIT 0x20 /* */ 35#define CNID_FLAG_MEMORY 0x40 /* this is a memory only db */ 36#define CNID_FLAG_INODE 0x80 /* in cnid_add the inode is authoritative */ 37 38#define CNID_INVALID 0 39/* first valid ID */ 40#define CNID_START 17 41 42#define CNID_ERR_PARAM 0x80000001 43#define CNID_ERR_PATH 0x80000002 44#define CNID_ERR_DB 0x80000003 45#define CNID_ERR_CLOSE 0x80000004 /* the db was not open */ 46#define CNID_ERR_MAX 0x80000005 47 48/* 49 * This is instance of CNID database object. 50 */ 51struct _cnid_db { 52 uint32_t flags; /* Flags describing some CNID backend aspects. */ 53 char *volpath; /* Volume path this particular CNID db refers to. */ 54 void *_private; /* back-end speficic data */ 55 56 cnid_t (*cnid_add) (struct _cnid_db *cdb, const struct stat *st, cnid_t did, 57 const char *name, size_t, cnid_t hint); 58 int (*cnid_delete) (struct _cnid_db *cdb, cnid_t id); 59 cnid_t (*cnid_get) (struct _cnid_db *cdb, cnid_t did, const char *name, size_t); 60 cnid_t (*cnid_lookup) (struct _cnid_db *cdb, const struct stat *st, cnid_t did, 61 const char *name, size_t); 62 cnid_t (*cnid_nextid) (struct _cnid_db *cdb); 63 char * (*cnid_resolve) (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len); 64 int (*cnid_update) (struct _cnid_db *cdb, cnid_t id, const struct stat *st, 65 cnid_t did, const char *name, size_t len); 66 void (*cnid_close) (struct _cnid_db *cdb); 67 int (*cnid_getstamp) (struct _cnid_db *cdb, void *buffer, const size_t len); 68 cnid_t (*cnid_rebuild_add) (struct _cnid_db *, const struct stat *, cnid_t, 69 const char *, size_t, cnid_t); 70 int (*cnid_find) (struct _cnid_db *cdb, const char *name, size_t namelen, 71 void *buffer, size_t buflen); 72 int (*cnid_wipe) (struct _cnid_db *cdb); 73}; 74typedef struct _cnid_db cnid_db; 75 76/* 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. 79 */ 80struct cnid_open_args { 81 const char *dir; 82 mode_t mask; 83 uint32_t flags; 84 const char *cnidserver; /* for dbd */ 85 const char *cnidport; /* for dbd */ 86}; 87 88/* 89 * CNID module - represents particular CNID implementation 90 */ 91struct _cnid_module { 92 char *name; 93 struct list_head db_list; /* CNID modules are also stored on a bidirectional list. */ 94 struct _cnid_db *(*cnid_open)(struct cnid_open_args *args); 95 uint32_t flags; /* Flags describing some CNID backend aspects. */ 96 97}; 98typedef struct _cnid_module cnid_module; 99 100/* Inititalize the CNID backends */ 101void cnid_init(); 102 103/* Registers new CNID backend module */ 104void cnid_register(struct _cnid_module *module); 105 106/* This function opens a CNID database for selected volume. */ 107struct _cnid_db *cnid_open(const char *volpath, 108 mode_t mask, 109 char *type, 110 int flags, 111 const char *cnidsrv, 112 const char *cnidport); 113cnid_t cnid_add (struct _cnid_db *cdb, const struct stat *st, const cnid_t did, 114 const char *name, const size_t len, cnid_t hint); 115int cnid_delete (struct _cnid_db *cdb, cnid_t id); 116cnid_t cnid_get (struct _cnid_db *cdb, const cnid_t did, char *name,const size_t len); 117int cnid_getstamp (struct _cnid_db *cdb, void *buffer, const size_t len); 118cnid_t cnid_lookup (struct _cnid_db *cdb, const struct stat *st, const cnid_t did, 119 char *name, const size_t len); 120char *cnid_resolve (struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len); 121int cnid_update (struct _cnid_db *cdb, const cnid_t id, const struct stat *st, 122 const cnid_t did, char *name, const size_t len); 123cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did, 124 char *name, const size_t len, cnid_t hint); 125int cnid_find (struct _cnid_db *cdb, const char *name, size_t namelen, 126 void *buffer, size_t buflen); 127int cnid_wipe (struct _cnid_db *cdb); 128void cnid_close (struct _cnid_db *db); 129 130#endif 131