]>
Commit | Line | Data |
---|---|---|
0ecb606c | 1 | /* Copyright (c) 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006 |
a95a08b4 | 2 | Free Software Foundation, Inc. |
d67281a7 | 3 | This file is part of the GNU C Library. |
a1c542bf | 4 | Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998. |
d67281a7 UD |
5 | |
6 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
7 | modify it under the terms of the GNU Lesser General Public |
8 | License as published by the Free Software Foundation; either | |
9 | version 2.1 of the License, or (at your option) any later version. | |
d67281a7 UD |
10 | |
11 | The GNU C Library is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 14 | Lesser General Public License for more details. |
d67281a7 | 15 | |
41bdb6e2 AJ |
16 | You should have received a copy of the GNU Lesser General Public |
17 | License along with the GNU C Library; if not, write to the Free | |
18 | Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA | |
19 | 02111-1307 USA. */ | |
d67281a7 UD |
20 | |
21 | #ifndef _NSCD_H | |
67479a70 UD |
22 | #define _NSCD_H 1 |
23 | ||
24 | #include <pthread.h> | |
a95a08b4 | 25 | #include <stdbool.h> |
67479a70 UD |
26 | #include <time.h> |
27 | #include <sys/uio.h> | |
d67281a7 | 28 | |
4f6bfa80 RM |
29 | /* The declarations for the request and response types are in the file |
30 | "nscd-client.h", which should contain everything needed by client | |
31 | functions. */ | |
32 | #include "nscd-client.h" | |
67479a70 | 33 | |
d67281a7 | 34 | |
67479a70 UD |
35 | /* Handle databases. */ |
36 | typedef enum | |
37 | { | |
38 | pwddb, | |
39 | grpdb, | |
40 | hstdb, | |
41 | lastdb | |
42 | } dbtype; | |
d67281a7 | 43 | |
67479a70 | 44 | |
a95a08b4 UD |
45 | /* Default limit on the number of times a value gets reloaded without |
46 | being used in the meantime. NSCD does not throw a value out as | |
47 | soon as it times out. It tries to reload the value from the | |
48 | server. Only if the value has not been used for so many rounds it | |
49 | is removed. */ | |
50 | #define DEFAULT_RELOAD_LIMIT 5 | |
51 | ||
52 | ||
4401d759 UD |
53 | /* Time before restarting the process in paranoia mode. */ |
54 | #define RESTART_INTERVAL (60 * 60) | |
55 | ||
56 | ||
a95a08b4 UD |
57 | /* Structure describing dynamic part of one database. */ |
58 | struct database_dyn | |
67479a70 UD |
59 | { |
60 | pthread_rwlock_t lock; | |
0ecb606c | 61 | pthread_mutex_t prunelock; |
67479a70 UD |
62 | |
63 | int enabled; | |
64 | int check_file; | |
a95a08b4 | 65 | int persistent; |
c207f23b | 66 | int shared; |
0ecb606c JJ |
67 | int propagate; |
68 | const char filename[12]; | |
a95a08b4 | 69 | const char *db_filename; |
67479a70 | 70 | time_t file_mtime; |
a95a08b4 | 71 | size_t suggested_module; |
0ecb606c | 72 | size_t max_db_size; |
67479a70 | 73 | |
a95a08b4 UD |
74 | unsigned long int postimeout; /* In seconds. */ |
75 | unsigned long int negtimeout; /* In seconds. */ | |
67479a70 | 76 | |
a95a08b4 UD |
77 | int wr_fd; /* Writable file descriptor. */ |
78 | int ro_fd; /* Unwritable file descriptor. */ | |
67479a70 | 79 | |
a95a08b4 | 80 | const struct iovec *disabled_iov; |
67479a70 | 81 | |
a95a08b4 UD |
82 | struct database_pers_head *head; |
83 | char *data; | |
84 | size_t memsize; | |
85 | pthread_mutex_t memlock; | |
86 | bool mmap_used; | |
87 | bool last_alloc_failed; | |
88 | }; | |
c86e6aec | 89 | |
c86e6aec | 90 | |
a95a08b4 | 91 | /* Paths of the file for the persistent storage. */ |
457962e5 UD |
92 | #define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd" |
93 | #define _PATH_NSCD_GROUP_DB "/var/db/nscd/group" | |
94 | #define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts" | |
95 | ||
96 | /* Path used when not using persistent storage. */ | |
97 | #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX" | |
67479a70 | 98 | |
0ecb606c JJ |
99 | /* Maximum alignment requirement we will encounter. */ |
100 | #define BLOCK_ALIGN_LOG 3 | |
101 | #define BLOCK_ALIGN (1 << BLOCK_ALIGN_LOG) | |
102 | #define BLOCK_ALIGN_M1 (BLOCK_ALIGN - 1) | |
103 | ||
104 | /* Default value for the maximum size of the database files. */ | |
105 | #define DEFAULT_MAX_DB_SIZE (32 * 1024 * 1024) | |
106 | ||
107 | /* Number of bytes of data we initially reserve for each hash table bucket. */ | |
108 | #define DEFAULT_DATASIZE_PER_BUCKET 1024 | |
109 | ||
67479a70 | 110 | |
67479a70 | 111 | /* Global variables. */ |
a95a08b4 | 112 | extern struct database_dyn dbs[lastdb]; |
67479a70 UD |
113 | extern const char *dbnames[lastdb]; |
114 | extern const char *serv2str[LASTREQ]; | |
115 | ||
116 | extern const struct iovec pwd_iov_disabled; | |
117 | extern const struct iovec grp_iov_disabled; | |
118 | extern const struct iovec hst_iov_disabled; | |
119 | ||
a95a08b4 | 120 | |
27e82856 | 121 | /* Initial number of threads to run. */ |
67479a70 | 122 | extern int nthreads; |
27e82856 UD |
123 | /* Maximum number of threads to use. */ |
124 | extern int max_nthreads; | |
67479a70 | 125 | |
a12ce44f | 126 | /* User name to run server processes as. */ |
adcf0e4a UD |
127 | extern const char *server_user; |
128 | ||
a12ce44f UD |
129 | /* Name and UID of user who is allowed to request statistics. */ |
130 | extern const char *stat_user; | |
131 | extern uid_t stat_uid; | |
132 | ||
c86e6aec UD |
133 | /* Time the server was started. */ |
134 | extern time_t start_time; | |
135 | ||
a16e3585 UD |
136 | /* Number of times clients had to wait. */ |
137 | extern unsigned long int client_queued; | |
138 | ||
a95a08b4 UD |
139 | /* Maximum needed alignment. */ |
140 | extern const size_t block_align; | |
141 | ||
142 | /* Number of times a value is reloaded without being used. UINT_MAX | |
143 | means unlimited. */ | |
144 | extern unsigned int reload_count; | |
145 | ||
3418007e UD |
146 | /* Pagesize minus one. */ |
147 | extern uintptr_t pagesize_m1; | |
148 | ||
4401d759 UD |
149 | /* Nonzero if paranoia mode is enabled. */ |
150 | extern int paranoia; | |
151 | /* Time after which the process restarts. */ | |
152 | extern time_t restart_time; | |
153 | /* How much time between restarts. */ | |
154 | extern time_t restart_interval; | |
155 | /* Old current working directory. */ | |
156 | extern const char *oldcwd; | |
157 | /* Old user and group ID. */ | |
158 | extern uid_t old_uid; | |
159 | extern gid_t old_gid; | |
160 | ||
161 | ||
67479a70 UD |
162 | /* Prototypes for global functions. */ |
163 | ||
164 | /* nscd.c */ | |
59553897 | 165 | extern void termination_handler (int signum) __attribute__ ((__noreturn__)); |
67479a70 UD |
166 | extern int nscd_open_socket (void); |
167 | ||
168 | /* connections.c */ | |
a12ce44f | 169 | extern void nscd_init (void); |
67479a70 | 170 | extern void close_sockets (void); |
8f11d6f9 | 171 | extern void start_threads (void) __attribute__ ((__noreturn__)); |
67479a70 UD |
172 | |
173 | /* nscd_conf.c */ | |
a95a08b4 UD |
174 | extern int nscd_parse_file (const char *fname, |
175 | struct database_dyn dbs[lastdb]); | |
67479a70 UD |
176 | |
177 | /* nscd_stat.c */ | |
a95a08b4 | 178 | extern void send_stats (int fd, struct database_dyn dbs[lastdb]); |
59553897 | 179 | extern int receive_print_stats (void) __attribute__ ((__noreturn__)); |
67479a70 UD |
180 | |
181 | /* cache.c */ | |
a95a08b4 UD |
182 | extern struct datahead *cache_search (request_type, void *key, size_t len, |
183 | struct database_dyn *table, | |
184 | uid_t owner); | |
185 | extern int cache_add (int type, const void *key, size_t len, | |
186 | struct datahead *packet, bool first, | |
187 | struct database_dyn *table, uid_t owner); | |
0ecb606c | 188 | extern void prune_cache (struct database_dyn *table, time_t now, int fd); |
67479a70 UD |
189 | |
190 | /* pwdcache.c */ | |
a95a08b4 | 191 | extern void addpwbyname (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 192 | void *key, uid_t uid); |
a95a08b4 | 193 | extern void addpwbyuid (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 194 | void *key, uid_t uid); |
a95a08b4 UD |
195 | extern void readdpwbyname (struct database_dyn *db, struct hashentry *he, |
196 | struct datahead *dh); | |
197 | extern void readdpwbyuid (struct database_dyn *db, struct hashentry *he, | |
198 | struct datahead *dh); | |
67479a70 UD |
199 | |
200 | /* grpcache.c */ | |
a95a08b4 | 201 | extern void addgrbyname (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 202 | void *key, uid_t uid); |
a95a08b4 | 203 | extern void addgrbygid (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 204 | void *key, uid_t uid); |
a95a08b4 UD |
205 | extern void readdgrbyname (struct database_dyn *db, struct hashentry *he, |
206 | struct datahead *dh); | |
207 | extern void readdgrbygid (struct database_dyn *db, struct hashentry *he, | |
208 | struct datahead *dh); | |
67479a70 UD |
209 | |
210 | /* hstcache.c */ | |
a95a08b4 | 211 | extern void addhstbyname (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 212 | void *key, uid_t uid); |
a95a08b4 | 213 | extern void addhstbyaddr (struct database_dyn *db, int fd, request_header *req, |
a1c542bf | 214 | void *key, uid_t uid); |
a95a08b4 UD |
215 | extern void addhstbynamev6 (struct database_dyn *db, int fd, |
216 | request_header *req, void *key, uid_t uid); | |
217 | extern void addhstbyaddrv6 (struct database_dyn *db, int fd, | |
218 | request_header *req, void *key, uid_t uid); | |
219 | extern void readdhstbyname (struct database_dyn *db, struct hashentry *he, | |
220 | struct datahead *dh); | |
221 | extern void readdhstbyaddr (struct database_dyn *db, struct hashentry *he, | |
222 | struct datahead *dh); | |
223 | extern void readdhstbynamev6 (struct database_dyn *db, struct hashentry *he, | |
224 | struct datahead *dh); | |
225 | extern void readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he, | |
226 | struct datahead *dh); | |
227 | ||
d19687d6 UD |
228 | /* aicache.c */ |
229 | extern void addhstai (struct database_dyn *db, int fd, request_header *req, | |
230 | void *key, uid_t uid); | |
231 | extern void readdhstai (struct database_dyn *db, struct hashentry *he, | |
232 | struct datahead *dh); | |
a95a08b4 | 233 | |
26235c7c UD |
234 | |
235 | /* initgrcache.c */ | |
236 | extern void addinitgroups (struct database_dyn *db, int fd, | |
237 | request_header *req, void *key, uid_t uid); | |
238 | extern void readdinitgroups (struct database_dyn *db, struct hashentry *he, | |
239 | struct datahead *dh); | |
240 | ||
a95a08b4 UD |
241 | /* mem.c */ |
242 | extern void *mempool_alloc (struct database_dyn *db, size_t len); | |
243 | extern void gc (struct database_dyn *db); | |
4f6bfa80 | 244 | |
081fc592 UD |
245 | |
246 | /* nscd_setup_thread.c */ | |
247 | extern void setup_thread (struct database_dyn *db); | |
248 | ||
0ecb606c JJ |
249 | |
250 | /* Special version of TEMP_FAILURE_RETRY for functions returning error | |
251 | values. */ | |
252 | #define TEMP_FAILURE_RETRY_VAL(expression) \ | |
253 | (__extension__ \ | |
254 | ({ long int __result; \ | |
255 | do __result = (long int) (expression); \ | |
256 | while (__result == EINTR); \ | |
257 | __result; })) | |
258 | ||
67479a70 | 259 | #endif /* nscd.h */ |