Blame nscd/nscd.h

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