1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #ifndef _NSCD_H
22: #define _NSCD_H 1
23:
24: #include <pthread.h>
25: #include <stdbool.h>
26: #include <time.h>
27: #include <sys/uio.h>
28:
29:
30:
31:
32: #include "nscd-client.h"
33:
34:
35:
36: typedef enum
37: {
38: pwddb,
39: grpdb,
40: hstdb,
41: servdb,
42: lastdb
43: } dbtype;
44:
45:
46:
47:
48:
49:
50:
51: #define DEFAULT_RELOAD_LIMIT 5
52:
53:
54:
55: #define RESTART_INTERVAL (60 * 60)
56:
57:
58:
59: struct database_dyn
60: {
61: pthread_rwlock_t lock;
62: pthread_mutex_t prunelock;
63:
64: int enabled;
65: int check_file;
66: int persistent;
67: int shared;
68: int propagate;
69: int reset_res;
70: const char filename[16];
71: const char *db_filename;
72: time_t file_mtime;
73: size_t suggested_module;
74: size_t max_db_size;
75:
76: unsigned long int postimeout;
77: unsigned long int negtimeout;
78:
79: int wr_fd;
80: int ro_fd;
81:
82: const struct iovec *disabled_iov;
83:
84: struct database_pers_head *head;
85: char *data;
86: size_t memsize;
87: pthread_mutex_t memlock;
88: bool mmap_used;
89: bool last_alloc_failed;
90: };
91:
92:
93:
94: #define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd"
95: #define _PATH_NSCD_GROUP_DB "/var/db/nscd/group"
96: #define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts"
97: #define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services"
98:
99:
100: #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX"
101:
102:
103: #define BLOCK_ALIGN_LOG 3
104: #define BLOCK_ALIGN (1 << BLOCK_ALIGN_LOG)
105: #define BLOCK_ALIGN_M1 (BLOCK_ALIGN - 1)
106:
107:
108: #define DEFAULT_MAX_DB_SIZE (32 * 1024 * 1024)
109:
110:
111: #define DEFAULT_DATASIZE_PER_BUCKET 1024
112:
113:
114:
115: extern struct database_dyn dbs[lastdb];
116: extern const char *const dbnames[lastdb];
117: extern const char *const serv2str[LASTREQ];
118:
119: extern const struct iovec pwd_iov_disabled;
120: extern const struct iovec grp_iov_disabled;
121: extern const struct iovec hst_iov_disabled;
122: extern const struct iovec serv_iov_disabled;
123:
124:
125:
126: extern int nthreads;
127:
128: extern int max_nthreads;
129:
130:
131: extern const char *server_user;
132:
133:
134: extern const char *stat_user;
135: extern uid_t stat_uid;
136:
137:
138: extern time_t start_time;
139:
140:
141: extern unsigned long int client_queued;
142:
143:
144: extern const size_t block_align;
145:
146:
147:
148: extern unsigned int reload_count;
149:
150:
151: extern uintptr_t pagesize_m1;
152:
153:
154: extern int paranoia;
155:
156: extern time_t restart_time;
157:
158: extern time_t restart_interval;
159:
160: extern const char *oldcwd;
161:
162: extern uid_t old_uid;
163: extern gid_t old_gid;
164:
165:
166:
167:
168:
169: extern void termination_handler (int signum) __attribute__ ((__noreturn__));
170: extern int nscd_open_socket (void);
171:
172:
173: extern void nscd_init (void);
174: extern void close_sockets (void);
175: extern void start_threads (void) __attribute__ ((__noreturn__));
176:
177:
178: extern int nscd_parse_file (const char *fname,
179: struct database_dyn dbs[lastdb]);
180:
181:
182: extern void send_stats (int fd, struct database_dyn dbs[lastdb]);
183: extern int receive_print_stats (void) __attribute__ ((__noreturn__));
184:
185:
186: extern struct datahead *cache_search (request_type, void *key, size_t len,
187: struct database_dyn *table,
188: uid_t owner);
189: extern int cache_add (int type, const void *key, size_t len,
190: struct datahead *packet, bool first,
191: struct database_dyn *table, uid_t owner);
192: extern void prune_cache (struct database_dyn *table, time_t now, int fd);
193:
194:
195: extern void addpwbyname (struct database_dyn *db, int fd, request_header *req,
196: void *key, uid_t uid);
197: extern void addpwbyuid (struct database_dyn *db, int fd, request_header *req,
198: void *key, uid_t uid);
199: extern void readdpwbyname (struct database_dyn *db, struct hashentry *he,
200: struct datahead *dh);
201: extern void readdpwbyuid (struct database_dyn *db, struct hashentry *he,
202: struct datahead *dh);
203:
204:
205: extern void addgrbyname (struct database_dyn *db, int fd, request_header *req,
206: void *key, uid_t uid);
207: extern void addgrbygid (struct database_dyn *db, int fd, request_header *req,
208: void *key, uid_t uid);
209: extern void readdgrbyname (struct database_dyn *db, struct hashentry *he,
210: struct datahead *dh);
211: extern void readdgrbygid (struct database_dyn *db, struct hashentry *he,
212: struct datahead *dh);
213:
214:
215: extern void addhstbyname (struct database_dyn *db, int fd, request_header *req,
216: void *key, uid_t uid);
217: extern void addhstbyaddr (struct database_dyn *db, int fd, request_header *req,
218: void *key, uid_t uid);
219: extern void addhstbynamev6 (struct database_dyn *db, int fd,
220: request_header *req, void *key, uid_t uid);
221: extern void addhstbyaddrv6 (struct database_dyn *db, int fd,
222: request_header *req, void *key, uid_t uid);
223: extern void readdhstbyname (struct database_dyn *db, struct hashentry *he,
224: struct datahead *dh);
225: extern void readdhstbyaddr (struct database_dyn *db, struct hashentry *he,
226: struct datahead *dh);
227: extern void readdhstbynamev6 (struct database_dyn *db, struct hashentry *he,
228: struct datahead *dh);
229: extern void readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he,
230: struct datahead *dh);
231:
232:
233: extern void addhstai (struct database_dyn *db, int fd, request_header *req,
234: void *key, uid_t uid);
235: extern void readdhstai (struct database_dyn *db, struct hashentry *he,
236: struct datahead *dh);
237:
238:
239:
240: extern void addinitgroups (struct database_dyn *db, int fd,
241: request_header *req, void *key, uid_t uid);
242: extern void readdinitgroups (struct database_dyn *db, struct hashentry *he,
243: struct datahead *dh);
244:
245:
246: extern void addservbyname (struct database_dyn *db, int fd,
247: request_header *req, void *key, uid_t uid);
248: extern void readdservbyname (struct database_dyn *db, struct hashentry *he,
249: struct datahead *dh);
250: extern void addservbyport (struct database_dyn *db, int fd,
251: request_header *req, void *key, uid_t uid);
252: extern void readdservbyport (struct database_dyn *db, struct hashentry *he,
253: struct datahead *dh);
254:
255:
256: extern void *mempool_alloc (struct database_dyn *db, size_t len);
257: extern void gc (struct database_dyn *db);
258:
259:
260:
261: extern void setup_thread (struct database_dyn *db);
262:
263:
264:
265:
266: #define TEMP_FAILURE_RETRY_VAL(expression) \
267: (__extension__ \
268: ({ long int __result; \
269: do __result = (long int) (expression); \
270: while (__result == EINTR); \
271: __result; }))
272:
273: #endif