| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- /* Copyright (c) 1998-2026 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
- #ifndef _NSCD_H
- #define _NSCD_H 1
- #include <pthread.h>
- #include <stdbool.h>
- #include <time.h>
- #include <sys/uio.h>
- /* The declarations for the request and response types are in the file
- "nscd-client.h", which should contain everything needed by client
- functions. */
- #include "nscd-client.h"
- /* Handle databases. */
- typedef enum
- {
- pwddb,
- grpdb,
- hstdb,
- servdb,
- netgrdb,
- lastdb
- } dbtype;
- /* Default limit on the number of times a value gets reloaded without
- being used in the meantime. NSCD does not throw a value out as
- soon as it times out. It tries to reload the value from the
- server. Only if the value has not been used for so many rounds it
- is removed. */
- #define DEFAULT_RELOAD_LIMIT 5
- /* Time before restarting the process in paranoia mode. */
- #define RESTART_INTERVAL (60 * 60)
- /* Stack size for worker threads. */
- #define NSCD_THREAD_STACKSIZE 1024 * 1024 * (sizeof (void *) / 4)
- /* Maximum size of stack frames we allow the thread to use. We use
- 80% of the thread stack size. */
- #define MAX_STACK_USE ((8 * NSCD_THREAD_STACKSIZE) / 10)
- /* Records the file registered per database that when changed
- or modified requires invalidating the database. */
- struct traced_file
- {
- /* Tracks the last modified time of the traced file. */
- __time64_t mtime;
- /* Support multiple registered files per database. */
- struct traced_file *next;
- int call_res_init;
- /* Requires Inotify support to do anything useful. */
- #define TRACED_FILE 0
- #define TRACED_DIR 1
- int inotify_descr[2];
- # ifndef PATH_MAX
- # define PATH_MAX 1024
- # endif
- /* The parent directory is used to scan for creation/deletion. */
- char dname[PATH_MAX];
- /* Just the name of the file with no directory component. */
- char *sfname;
- /* The full-path name of the registered file. */
- char fname[];
- };
- /* Initialize a `struct traced_file`. As input we need the name
- of the file, and if invalidation requires calling res_init.
- If CRINIT is 1 then res_init will be called after invalidation
- or if the traced file is changed in any way, otherwise it will
- not. */
- static inline void
- init_traced_file(struct traced_file *file, const char *fname, int crinit)
- {
- char *dname;
- file->mtime = 0;
- file->inotify_descr[TRACED_FILE] = -1;
- file->inotify_descr[TRACED_DIR] = -1;
- strcpy (file->fname, fname);
- /* Compute the parent directory name and store a copy. The copy makes
- it much faster to add/remove watches while nscd is running instead
- of computing this over and over again in a temp buffer. */
- file->dname[0] = '\0';
- dname = strrchr (fname, '/');
- if (dname != NULL)
- {
- size_t len = (size_t)(dname - fname);
- if (len > sizeof (file->dname))
- abort ();
- memcpy (file->dname, file->fname, len);
- file->dname[len] = '\0';
- }
- /* The basename is the name just after the last forward slash. */
- file->sfname = &dname[1];
- file->call_res_init = crinit;
- }
- #define define_traced_file(id, filename) \
- static union \
- { \
- struct traced_file file; \
- char buf[sizeof (struct traced_file) + sizeof (filename)]; \
- } id##_traced_file;
- /* Structure describing dynamic part of one database. */
- struct database_dyn
- {
- pthread_rwlock_t lock;
- pthread_cond_t prune_cond;
- pthread_mutex_t prune_lock;
- pthread_mutex_t prune_run_lock;
- time_t wakeup_time;
- int enabled;
- int check_file;
- int clear_cache;
- int persistent;
- int shared;
- int propagate;
- struct traced_file *traced_files;
- const char *db_filename;
- size_t suggested_module;
- size_t max_db_size;
- unsigned long int postimeout; /* In seconds. */
- unsigned long int negtimeout; /* In seconds. */
- int wr_fd; /* Writable file descriptor. */
- int ro_fd; /* Unwritable file descriptor. */
- const struct iovec *disabled_iov;
- struct database_pers_head *head;
- char *data;
- size_t memsize;
- pthread_mutex_t memlock;
- bool mmap_used;
- bool last_alloc_failed;
- };
- /* Paths of the file for the persistent storage. */
- #define _PATH_NSCD_PASSWD_DB "/var/db/nscd/passwd"
- #define _PATH_NSCD_GROUP_DB "/var/db/nscd/group"
- #define _PATH_NSCD_HOSTS_DB "/var/db/nscd/hosts"
- #define _PATH_NSCD_SERVICES_DB "/var/db/nscd/services"
- #define _PATH_NSCD_NETGROUP_DB "/var/db/nscd/netgroup"
- /* Path used when not using persistent storage. */
- #define _PATH_NSCD_XYZ_DB_TMP "/var/run/nscd/dbXXXXXX"
- /* Maximum alignment requirement we will encounter. */
- #define BLOCK_ALIGN_LOG 3
- #define BLOCK_ALIGN (1 << BLOCK_ALIGN_LOG)
- #define BLOCK_ALIGN_M1 (BLOCK_ALIGN - 1)
- /* Default value for the maximum size of the database files. */
- #define DEFAULT_MAX_DB_SIZE (32 * 1024 * 1024)
- /* Number of bytes of data we initially reserve for each hash table bucket. */
- #define DEFAULT_DATASIZE_PER_BUCKET 1024
- /* Default module of hash table. */
- #define DEFAULT_SUGGESTED_MODULE 211
- /* Number of seconds between two cache pruning runs if we do not have
- better information when it is really needed. */
- #define CACHE_PRUNE_INTERVAL 15
- /* Global variables. */
- extern struct database_dyn dbs[lastdb] attribute_hidden;
- extern const char *const dbnames[lastdb];
- extern const char *const serv2str[LASTREQ];
- extern const struct iovec pwd_iov_disabled;
- extern const struct iovec grp_iov_disabled;
- extern const struct iovec hst_iov_disabled;
- extern const struct iovec serv_iov_disabled;
- extern const struct iovec netgroup_iov_disabled;
- /* Initial number of threads to run. */
- extern int nthreads;
- /* Maximum number of threads to use. */
- extern int max_nthreads;
- /* Inotify descriptor. */
- extern int inotify_fd;
- /* User name to run server processes as. */
- extern const char *server_user;
- /* Name and UID of user who is allowed to request statistics. */
- extern const char *stat_user;
- extern uid_t stat_uid;
- /* Time the server was started. */
- extern time_t start_time;
- /* Number of times clients had to wait. */
- extern unsigned long int client_queued;
- /* Maximum needed alignment. */
- extern const size_t block_align;
- /* Number of times a value is reloaded without being used. UINT_MAX
- means unlimited. */
- extern unsigned int reload_count;
- /* Pagesize minus one. */
- extern uintptr_t pagesize_m1;
- /* Nonzero if paranoia mode is enabled. */
- extern int paranoia;
- /* Time after which the process restarts. */
- extern time_t restart_time;
- /* How much time between restarts. */
- extern time_t restart_interval;
- /* Old current working directory. */
- extern const char *oldcwd;
- /* Old user and group ID. */
- extern uid_t old_uid;
- extern gid_t old_gid;
- /* Prototypes for global functions. */
- /* Wrapper functions with error checking for standard functions. */
- #include <programs/xmalloc.h>
- /* nscd.c */
- extern void termination_handler (int signum) __attribute__ ((__noreturn__));
- extern int nscd_open_socket (void);
- void notify_parent (int child_ret);
- void do_exit (int child_ret, int errnum, const char *format, ...);
- /* connections.c */
- extern void nscd_init (void);
- extern void register_traced_file (size_t dbidx, struct traced_file *finfo);
- #ifdef HAVE_INOTIFY
- extern void install_watches (struct traced_file *finfo);
- #endif
- extern void close_sockets (void);
- extern void start_threads (void) __attribute__ ((__noreturn__));
- /* nscd_conf.c */
- extern int nscd_parse_file (const char *fname,
- struct database_dyn dbs[lastdb]);
- /* nscd_stat.c */
- extern void send_stats (int fd, struct database_dyn dbs[lastdb]);
- extern int receive_print_stats (void) __attribute__ ((__noreturn__));
- /* cache.c */
- extern struct datahead *cache_search (request_type, const void *key,
- size_t len, struct database_dyn *table,
- uid_t owner);
- extern int cache_add (int type, const void *key, size_t len,
- struct datahead *packet, bool first,
- struct database_dyn *table, uid_t owner,
- bool prune_wakeup);
- extern time_t prune_cache (struct database_dyn *table, time_t now, int fd);
- /* pwdcache.c */
- extern void addpwbyname (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern void addpwbyuid (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern time_t readdpwbyname (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern time_t readdpwbyuid (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* grpcache.c */
- extern void addgrbyname (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern void addgrbygid (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern time_t readdgrbyname (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern time_t readdgrbygid (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* hstcache.c */
- extern void addhstbyname (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern void addhstbyaddr (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern void addhstbynamev6 (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern void addhstbyaddrv6 (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern time_t readdhstbyname (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern time_t readdhstbyaddr (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern time_t readdhstbynamev6 (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern time_t readdhstbyaddrv6 (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* aicache.c */
- extern void addhstai (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern time_t readdhstai (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* initgrcache.c */
- extern void addinitgroups (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern time_t readdinitgroups (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* servicecache.c */
- extern void addservbyname (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern time_t readdservbyname (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern void addservbyport (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern time_t readdservbyport (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* netgroupcache.c */
- extern void addinnetgr (struct database_dyn *db, int fd, request_header *req,
- void *key, uid_t uid);
- extern time_t readdinnetgr (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- extern void addgetnetgrent (struct database_dyn *db, int fd,
- request_header *req, void *key, uid_t uid);
- extern time_t readdgetnetgrent (struct database_dyn *db, struct hashentry *he,
- struct datahead *dh);
- /* mem.c */
- extern void *mempool_alloc (struct database_dyn *db, size_t len,
- int data_alloc);
- extern void gc (struct database_dyn *db);
- /* nscd_setup_thread.c */
- extern int setup_thread (struct database_dyn *db);
- /* cachedumper.c */
- extern void nscd_print_cache (const char *name);
- /* Special version of TEMP_FAILURE_RETRY for functions returning error
- values. */
- #define TEMP_FAILURE_RETRY_VAL(expression) \
- (__extension__ \
- ({ long int __result; \
- do __result = (long int) (expression); \
- while (__result == EINTR); \
- __result; }))
- #endif /* nscd.h */
|