302ea1b7f1ebe04a235511195413e410ecd37ea6
[kopensolaris-gnu/glibc.git] / sysdeps / unix / sysv / solaris2 / kopensolaris-gnu / nss_common.h
1 /* Copyright (C) 2008 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #ifndef _NSS_COMMON_H
21 #define _NSS_COMMON_H
22
23 #include <sys/types.h>
24 #include <stdint.h>
25 #include <bits/libc-lock.h>
26
27 typedef enum
28   {
29         NSS_SUCCESS = 0,
30         NSS_NOTFOUND = 1,
31         NSS_UNAVAIL = 2,
32         NSS_TRYAGAIN = 3,
33         NSS_NISSERVDNS_TRYAGAIN = 4,
34         NSS_TRYLOCAL = 5,
35         NSS_ERROR = 6,
36         NSS_ALTRETRY = 7,
37         NSS_ALTRESET = 8,
38         NSS_NSCD_PRIV = 9
39   } nss_status_t;
40
41 struct nss_backend;
42
43 typedef nss_status_t (*nss_backend_op_t) (struct nss_backend *, void *);
44
45 typedef struct nss_backend
46   {
47         nss_backend_op_t *ops;
48         int n_ops;
49   } nss_backend_t;
50
51 typedef int nss_dbop_t;
52
53 #define NSS_DBOP_DESTRUCTOR     0
54 #define NSS_DBOP_ENDENT         1
55 #define NSS_DBOP_SETENT         2
56 #define NSS_DBOP_GETENT         3
57 #define NSS_DBOP_next_iter      (NSS_DBOP_GETENT + 1)
58 #define NSS_DBOP_next_noiter    (NSS_DBOP_DESTRUCTOR + 1)
59 #define NSS_DBOP_next_ipv6_iter (NSS_DBOP_GETENT + 3)
60
61 #define NSS_LOOKUP_DBOP(instp, n) \
62         (((n) >= 0 && (n) < (instp)->n_ops) ? (instp)->ops[n] : 0)
63
64 #define NSS_INVOKE_DBOP(instp, n, argp) \
65         (((n) >= 0 && (n) < (instp)->n_ops && (instp)->ops[n] != 0) \
66         ? (*(instp)->ops[n])(instp, argp) : NSS_UNAVAIL)
67
68 typedef nss_backend_t * (*nss_backend_constr_t) (const char *db_name,
69         const char *src_name, const char *cfg_args);
70
71 typedef struct nss_backend_finder
72   {
73         nss_backend_constr_t (*lookup) (void *lkp_priv, const char *,
74                 const char *, void **del_privp);
75         void (*delete) (void *del_priv, nss_backend_constr_t);
76         struct nss_backend_finder *next;
77         void *lookup_priv;
78   } nss_backend_finder_t;
79
80 extern nss_backend_finder_t *nss_default_finders;
81
82 enum nss_dbp_flags
83   {
84         NSS_USE_DEFAULT_CONFIG  = 0x1
85   };
86
87 typedef struct nss_db_params
88   {
89         const char *name;
90         const char *config_name;
91         const char *default_config;
92         unsigned max_active_per_src;
93         unsigned max_dormant_per_src;
94         enum nss_dbp_flags flags;
95         nss_backend_finder_t *finders;
96         void *private;
97         void (*cleanup) (struct nss_db_params *);
98   } nss_db_params_t;
99
100 typedef void (*nss_db_initf_t) (nss_db_params_t *);
101
102 typedef struct nss_dbd {
103         uint32_t o_name;
104         uint32_t o_config_name;
105         uint32_t o_default_config;
106         uint32_t flags;
107   } nss_dbd_t;
108
109 struct nss_db_state;
110 struct nss_getent_context;
111
112 typedef struct nss_db_root
113   {
114         struct nss_db_state *s;
115         __libc_lock_define (, lock);
116   } nss_db_root_t;
117
118 #define NSS_DB_ROOT_INIT                { 0, DEFAULTMUTEX }
119 #define DEFINE_NSS_DB_ROOT(name)        nss_db_root_t name = NSS_DB_ROOT_INIT
120
121 typedef struct
122   {
123         struct nss_getent_context *ctx;
124         __libc_lock_define (, lock);
125   } nss_getent_t;
126
127 #define NSS_GETENT_INIT                 { 0, DEFAULTMUTEX }
128 #define DEFINE_NSS_GETENT(name)         nss_getent_t name = NSS_GETENT_INIT
129
130 typedef enum
131   {
132         NSS_CONFIG_GET,
133         NSS_CONFIG_PUT,
134         NSS_CONFIG_ADD,
135         NSS_CONFIG_DELETE,
136         NSS_CONFIG_LIST
137   } nss_config_op_t;
138
139 typedef struct nss_config
140   {
141         char *name;
142         nss_config_op_t cop;
143         void *lock;
144         void *buffer;
145         size_t length;
146   } nss_config_t;
147
148 __BEGIN_DECLS
149
150 extern nss_status_t nss_config (nss_config_t **, int);
151
152 extern nss_status_t nss_search (nss_db_root_t *, nss_db_initf_t,
153         int search_fnum, void *search_args);
154 extern nss_status_t nss_getent (nss_db_root_t *, nss_db_initf_t,
155         nss_getent_t *, void *getent_args);
156 extern void nss_setent (nss_db_root_t *, nss_db_initf_t, nss_getent_t *);
157 extern void nss_endent (nss_db_root_t *, nss_db_initf_t, nss_getent_t *);
158 extern void nss_delete (nss_db_root_t *);
159
160 extern nss_status_t nss_pack (void *, size_t, nss_db_root_t *,
161         nss_db_initf_t, int, void *);
162 extern nss_status_t nss_pack_ent (void *, size_t, nss_db_root_t *,
163         nss_db_initf_t, nss_getent_t *);
164 extern nss_status_t nss_unpack (void *, size_t, nss_db_root_t *,
165         nss_db_initf_t, int, void *);
166 extern nss_status_t nss_unpack_ent (void *, size_t, nss_db_root_t *,
167         nss_db_initf_t, nss_getent_t *, void *);
168
169 extern nss_status_t _nsc_search (nss_db_root_t *, nss_db_initf_t,
170         int search_fnum, void *search_args);
171 extern nss_status_t _nsc_getent_u (nss_db_root_t *, nss_db_initf_t,
172          nss_getent_t *, void *getent_args);
173 extern nss_status_t _nsc_setent_u (nss_db_root_t *, nss_db_initf_t,
174         nss_getent_t *);
175 extern nss_status_t _nsc_endent_u(nss_db_root_t *, nss_db_initf_t,
176             nss_getent_t *);
177
178 __END_DECLS
179
180 #endif /* _NSS_COMMON_H */