netatalk  4.6.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
cnid.h
Go to the documentation of this file.
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 * 2024/07/05: Rafal Lewczuk gave permission to change the license
12 * to a later verion of the GNU GPL in
13 * https://github.com/Netatalk/netatalk/issues/1193
14 *
15 */
16
26
27#ifndef _ATALK_CNID__H
28#define _ATALK_CNID__H 1
29
30#include <errno.h>
31#include <stdbool.h>
32#include <stdint.h>
33
34#include <atalk/adouble.h>
35#include <atalk/list.h>
36#include <atalk/uuid.h>
37
38/* CNID object flags */
39#define CNID_FLAG_PERSISTENT 0x01
40#define CNID_FLAG_MANGLING 0x02
41#define CNID_FLAG_SETUID 0x04
42#define CNID_FLAG_BLOCK 0x08
43#define CNID_FLAG_NODEV 0x10
44#define CNID_FLAG_LAZY_INIT 0x20
45#define CNID_FLAG_INODE 0x80
46
47#define CNID_INVALID 0
48#define CNID_START 17
49
50#define CNID_ERR_PARAM 0x80000001
51#define CNID_ERR_PATH 0x80000002
52#define CNID_ERR_DB 0x80000003
53#define CNID_ERR_CLOSE 0x80000004
54#define CNID_ERR_MAX 0x80000005
55#define CNID_ERR_RESET 0x80000006
56#define CNID_ERR_BUSY 0x80000007
57#define CNID_ERR_CORRUPT 0x80000008
58#define CNID_ERR_NOTFOUND 0x80000009
59
60/* CNID_ERR_* exceed INT_MAX; compare against errno through this unsigned view */
61#define CNID_ERRNO() ((unsigned int) errno)
62
69#define CNID_ERRNO_IS_BACKEND_FAILURE() \
70 (CNID_ERRNO() == CNID_ERR_BUSY \
71 || CNID_ERRNO() == CNID_ERR_CORRUPT \
72 || CNID_ERRNO() == CNID_ERR_DB)
73
74/* cnid_find() requires a result buffer large enough to hold at least one
75 * full DBD-backend batch (CNID_FIND_MIN_RESULTS = 100 CNIDs in network
76 * byte order). The cnid_find() wrapper enforces this minimum centrally
77 * so every CNID backend behaves identically. */
78#define CNID_FIND_MIN_RESULTS 100
79#define CNID_FIND_MIN_BUFLEN (CNID_FIND_MIN_RESULTS * sizeof(uint32_t))
80
84typedef struct _cnid_db {
85 /* Flags describing some CNID backend aspects. */
86 uint32_t cnid_db_flags;
88 /* back-end speficic data */
90
91 cnid_t (*cnid_add)(struct _cnid_db *cdb, const struct stat *st, cnid_t did,
92 const char *name, size_t, cnid_t hint);
93 int (*cnid_delete)(struct _cnid_db *cdb, cnid_t id);
94 cnid_t (*cnid_get)(struct _cnid_db *cdb, cnid_t did, const char *name,
95 size_t);
96 cnid_t (*cnid_lookup)(struct _cnid_db *cdb, const struct stat *st,
97 cnid_t did, const char *name, size_t);
98 cnid_t (*cnid_nextid)(struct _cnid_db *cdb);
99 char *(*cnid_resolve)(struct _cnid_db *cdb, cnid_t *id, void *buffer,
100 size_t len);
101 int (*cnid_update)(struct _cnid_db *cdb, cnid_t id, const struct stat *st,
102 cnid_t did, const char *name, size_t len);
103 void (*cnid_close)(struct _cnid_db *cdb);
104 int (*cnid_getstamp)(struct _cnid_db *cdb, void *buffer, const size_t len);
105 cnid_t (*cnid_rebuild_add)(struct _cnid_db *, const struct stat *, cnid_t,
106 const char *, size_t, cnid_t);
107 int (*cnid_find)(struct _cnid_db *cdb, const char *name, size_t namelen,
108 cnid_t scope_did,
109 void *buffer, size_t buflen, bool *more_available);
110 int (*cnid_wipe)(struct _cnid_db *cdb);
112
113/*
114 * Consolidation of args passed from main cnid_open to modules cnid_XXX_open, so
115 * that it's easier to add aditional args as required.
116 */
120};
121
122/*
123 * CNID module - represents particular CNID implementation
124 */
126 char *name;
127 /* CNID modules are also stored on a bidirectional list. */
129 struct _cnid_db *(*cnid_open)(struct cnid_open_args *args);
130 /* Flags describing some CNID backend aspects. */
131 uint32_t flags;
132};
133
135
136/* Inititalize the CNID backends */
137void cnid_init(void);
138
139/* Registers new CNID backend module */
140void cnid_register(struct _cnid_module *module);
141
142/* This function opens a CNID database for selected volume. */
143struct _cnid_db *cnid_open(struct vol *vol, char *type, int flags);
144cnid_t cnid_add(struct _cnid_db *cdb, const struct stat *st, const cnid_t did,
145 const char *name, const size_t len, cnid_t hint);
146int cnid_delete(struct _cnid_db *cdb, cnid_t id);
147cnid_t cnid_get(struct _cnid_db *cdb, const cnid_t did, char *name,
148 const size_t len);
149int cnid_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len);
150cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st,
151 const cnid_t did, char *name, const size_t len);
152char *cnid_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer,
153 size_t len);
154int cnid_update(struct _cnid_db *cdb, const cnid_t id,
155 const struct stat *st, const cnid_t did, char *name,
156 const size_t len);
157cnid_t cnid_rebuild_add(struct _cnid_db *cdb, const struct stat *st,
158 const cnid_t did, char *name, const size_t len,
159 cnid_t hint);
160int cnid_find(struct _cnid_db *cdb, const char *name, size_t namelen,
161 void *buffer, size_t buflen, bool *more_available);
162int cnid_find_scoped(struct _cnid_db *cdb, const char *name,
163 size_t namelen, cnid_t scope_did,
164 void *buffer, size_t buflen,
165 bool *more_available);
166int cnid_wipe(struct _cnid_db *cdb);
167void cnid_close(struct _cnid_db *db);
168
169#endif
Part of Netatalk's AppleDouble implementatation.
uint32_t cnid_t
Definition adouble.h:157
int cnid_find(struct _cnid_db *cdb, const char *name, size_t namelen, void *buffer, size_t buflen, bool *more_available)
Search the CNID database for entries whose name contains a substring.
Definition cnid/cnid.c:369
struct _cnid_db cnid_db
int cnid_find_scoped(struct _cnid_db *cdb, const char *name, size_t namelen, cnid_t scope_did, void *buffer, size_t buflen, bool *more_available)
cnid_find() restricted to the subtree of a directory
Definition cnid/cnid.c:395
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)
Definition cnid/cnid.c:459
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)
Definition cnid/cnid.c:261
cnid_t cnid_lookup(struct _cnid_db *cdb, const struct stat *st, const cnid_t did, char *name, const size_t len)
Definition cnid/cnid.c:331
cnid_t cnid_get(struct _cnid_db *cdb, const cnid_t did, char *name, const size_t len)
Definition cnid/cnid.c:293
void cnid_init(void)
Definition cnid_init.c:47
void cnid_register(struct _cnid_module *module)
Definition cnid/cnid.c:48
int cnid_wipe(struct _cnid_db *cdb)
Definition cnid/cnid.c:484
struct _cnid_module cnid_module
Definition cnid.h:134
int cnid_delete(struct _cnid_db *cdb, cnid_t id)
Definition cnid/cnid.c:281
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)
Definition cnid/cnid.c:471
void cnid_close(struct _cnid_db *db)
Definition cnid/cnid.c:244
int cnid_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len)
Definition cnid/cnid.c:305
struct _cnid_db * cnid_open(struct vol *vol, char *type, int flags)
Definition cnid/cnid.c:105
char * cnid_resolve(struct _cnid_db *cdb, cnid_t *id, void *buffer, size_t len)
Definition cnid/cnid.c:438
Simple doubly linked list implementation.
cnid_t did
Definition nad_cp.c:92
char buffer[MAXPATHLEN+2]
Definition netacnv.c:35
Definition cnid.h:84
void(*) cnid_close(struct _cnid_db *cdb)
Definition cnid.h:103
int(*) cnid_update(struct _cnid_db *cdb, cnid_t id, const struct stat *st, cnid_t did, const char *name, size_t len)
Definition cnid.h:101
cnid_t(*) cnid_rebuild_add(struct _cnid_db *, const struct stat *, cnid_t, const char *, size_t, cnid_t)
Definition cnid.h:105
cnid_t(*) cnid_lookup(struct _cnid_db *cdb, const struct stat *st, cnid_t did, const char *name, size_t)
Definition cnid.h:96
uint32_t cnid_db_flags
Definition cnid.h:86
struct vol * cnid_db_vol
Definition cnid.h:87
int(*) cnid_find(struct _cnid_db *cdb, const char *name, size_t namelen, cnid_t scope_did, void *buffer, size_t buflen, bool *more_available)
Definition cnid.h:107
cnid_t(*) cnid_add(struct _cnid_db *cdb, const struct stat *st, cnid_t did, const char *name, size_t, cnid_t hint)
Definition cnid.h:91
int(*) cnid_delete(struct _cnid_db *cdb, cnid_t id)
Definition cnid.h:93
int(*) cnid_getstamp(struct _cnid_db *cdb, void *buffer, const size_t len)
Definition cnid.h:104
cnid_t(*) cnid_nextid(struct _cnid_db *cdb)
Definition cnid.h:98
cnid_t(*) cnid_get(struct _cnid_db *cdb, cnid_t did, const char *name, size_t)
Definition cnid.h:94
int(*) cnid_wipe(struct _cnid_db *cdb)
Definition cnid.h:110
void * cnid_db_private
Definition cnid.h:89
Definition cnid.h:125
struct list_head db_list
Definition cnid.h:128
uint32_t flags
Definition cnid.h:131
char * name
Definition cnid.h:126
Definition cnid.h:117
uint32_t cnid_args_flags
Definition cnid.h:118
struct vol * cnid_args_vol
Definition cnid.h:119
Definition include/atalk/list.h:18
Definition include/atalk/volume.h:33