From 67479a700e3bd2e52980c00ac35c888589ac0a36 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 18 Oct 1998 15:16:22 +0000 Subject: Update. 1998-10-18 Ulrich Drepper * resolv/nss_dns/dns-host.c: Add missing errnop parameter to the NSS functions. * resolv/nss_dns/dns-network.c: Likewise. * grp/Makefile: Don't search for linuxhtreads in add-ons, use have-thread-library to determine whether threads are available. * pwd/Makefile: Remove wrong comment. * inet/Makefile: Define CFLAGS-gethstbyad_r.c, CFLAGS-gethstbynm_r.c, and CFLAGS-gethstbynm2_r.c to -DUSE_NSCD=1. * locale/C-messages.c: Define default strings for YESTR and NOSTR. * nss/Versions: Add __nss_hosts_lookup. * nss/getXXbyYY.c: Remove unneeded assignment. * nss/getXXbyYY_r.c: Include nscd/nscd_proto.h only if needed. Almost complete rewrite of the NSCD to make it smaller, faster, add more functionnality and make it easier to extend. * nscd/Makfile (routines): Add nscd_gethst_r. (nscd-modules): Add hstcache, gethstbyad_r, gethstbynm2_r, and cache. * nscd/cache.c: New file. * nscd/gethstbyad_r.c: New file. * nscd/gethstbynm2_r.c: New file. * nscd/hstcache.c: New file. * nscd/nscd_gethst_r.c: New file. * nscd/connections.c: Rewritten. Don't start new thread for every new connection. Use a fixed set of threads which handle all connections and also the cache cleanup. * nscd/grpcache.c: Rewritten to use generic cache handling functions in cache.c. * nscd/nscd.c: Recognize new parameter nthreads. Adjust initialization for rewrite. Remove handle_requests function. * nscd/nscd.h (NSCD_VERSION): Bump to 2. Define new data structure for the new unified cache and the host database entries. * nscd/nscd_conf.c: Rewrite parsing partly to allow adding of more databases easily. Recognize check-files and threads definitions. * nscd/nscd.conf: Add definition of enable-cache and check-files to passwd and group definitions. Add new set of definitions for hosts. * nscd/nscd_getgr_r.c: Rewrite for new protocol. * nscd/nscd_getpw_r.c: Likewise. * nscd/nscd_proto.h: Add prototype for host database functions. * nscd/nscd_stat.c: Rewrite to simplify printing of information for many databases. * nscd/dbg_log.c: Remove unnecessary variable initializations. Global variable debug_flag is renamed to dbg_level. * nscd/dbg_log.h: Declare set_logfile. --- nscd/nscd.h | 240 +++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 156 insertions(+), 84 deletions(-) (limited to 'nscd/nscd.h') diff --git a/nscd/nscd.h b/nscd/nscd.h index 4835542619..bc8150aca1 100644 --- a/nscd/nscd.h +++ b/nscd/nscd.h @@ -18,18 +18,37 @@ Boston, MA 02111-1307, USA. */ #ifndef _NSCD_H -#define _NSCD_H 1 +#define _NSCD_H 1 + +#include +#include +#include -#include -#include /* Version number of the daemon interface */ -#define NSCD_VERSION 1 +#define NSCD_VERSION 2 + +/* Path of the file where the PID of the running system is stored. */ +#define _PATH_NSCDPID "/var/run/nscd.pid" + +/* Path for the Unix domain socket. */ +#define _PATH_NSCDSOCKET "/var/run/.nscd_socket" + +/* Path for the configuration file. */ +#define _PATH_NSCDCONF "/etc/nscd.conf" + -/* How many threads do we spawn maximal ? */ -#define MAX_NUM_CONNECTIONS 16 +/* Handle databases. */ +typedef enum +{ + pwddb, + grpdb, + hstdb, + lastdb +} dbtype; -/* Services provided */ + +/* Available services. */ typedef enum { GETPWBYNAME, @@ -37,22 +56,67 @@ typedef enum GETGRBYNAME, GETGRBYGID, GETHOSTBYNAME, + GETHOSTBYNAMEv6, GETHOSTBYADDR, - SHUTDOWN, /* Shut the server down */ - GETSTAT /* Get the server statistic */ + GETHOSTBYADDRv6, + LASTDBREQ = GETHOSTBYADDRv6, + SHUTDOWN, /* Shut the server down. */ + GETSTAT, /* Get the server statistic. */ + LASTREQ, } request_type; + +/* Structure for one hash table entry. */ +struct hashentry +{ + request_type type; /* Which type of dataset. */ + size_t len; /* Length of key. */ + void *key; /* Pointer to key. */ + struct hashentry *next; /* Next entry in this hash bucket list. */ + time_t timeout; /* Time when this entry becomes invalid. */ + ssize_t total; /* Number of bytes in PACKET. */ + const void *packet; /* Records for the result. */ + void *data; /* The malloc()ed respond record. */ + int last; /* Nonzero if DATA should be free()d. */ + struct hashentry *dellist; /* Next record to be deleted. */ +}; + +/* Structure describing one database. */ +struct database +{ + pthread_rwlock_t lock; + + int enabled; + int check_file; + const char *filename; + time_t file_mtime; + size_t module; + + const struct iovec *disabled_iov; + + unsigned long int postimeout; + unsigned long int negtimeout; + + unsigned long int poshit; + unsigned long int neghit; + unsigned long int posmiss; + unsigned long int negmiss; + + struct hashentry **array; +}; + + /* Header common to all requests */ typedef struct { - /* Version number of the daemon interface */ - int version; - /* Service requested */ - request_type type; - /* key len */ - ssize_t key_len; + int version; /* Version number of the daemon interface. */ + request_type type; /* Service requested. */ + ssize_t key_len; /* Key length. */ } request_header; + +/* Structure sent in reply to password query. Note that this struct is + sent also if the service is disabled or there is no record found. */ typedef struct { int version; @@ -66,6 +130,9 @@ typedef struct ssize_t pw_shell_len; } pw_response_header; + +/* Structure sent in reply to group query. Note that this struct is + sent also if the service is disabled or there is no record found. */ typedef struct { int version; @@ -73,77 +140,82 @@ typedef struct ssize_t gr_name_len; ssize_t gr_passwd_len; gid_t gr_gid; - ssize_t gr_mem_len; + ssize_t gr_mem_cnt; } gr_response_header; -typedef struct -{ - int debug_level; - int pw_enabled; - unsigned long pw_poshit; - unsigned long pw_posmiss; - unsigned long pw_neghit; - unsigned long pw_negmiss; - unsigned long pw_size; - unsigned long pw_posttl; - unsigned long pw_negttl; - int gr_enabled; - unsigned long gr_poshit; - unsigned long gr_posmiss; - unsigned long gr_neghit; - unsigned long gr_negmiss; - unsigned long gr_size; - unsigned long gr_posttl; - unsigned long gr_negttl; -} stat_response_header; - -#define _PATH_NSCDPID "/var/run/nscd.pid" -#define _PATH_NSCDSOCKET "/var/run/.nscd_socket" -#define _PATH_NSCDCONF "/etc/nscd.conf" +/* Structure sent in reply to host query. Note that this struct is + sent also if the service is disabled or there is no record found. */ typedef struct { - char *key; - int conn; -} param_t; - -extern int do_shutdown; /* 1 if we should quit the programm. */ -extern int disabled_passwd; -extern int disabled_group; - -extern int nscd_parse_file __P ((const char *fname)); -extern int set_logfile __P ((const char *logfile)); -extern void set_pos_pwd_ttl __P ((unsigned long)); -extern void set_neg_pwd_ttl __P ((unsigned long)); -extern void set_pos_grp_ttl __P ((unsigned long)); -extern void set_neg_grp_ttl __P ((unsigned long)); -extern void set_pwd_modulo __P ((unsigned long)); -extern void set_grp_modulo __P ((unsigned long)); - -extern void init_sockets __P ((void)); -extern void close_socket __P ((int conn)); -extern void close_sockets __P ((void)); -extern void get_request __P ((int *conn, request_header *req, char **key)); -extern void pw_send_answer __P ((int conn, struct passwd *pwd)); -extern void pw_send_disabled __P ((int conn)); -extern void gr_send_answer __P ((int conn, struct group *grp)); -extern void gr_send_disabled __P ((int conn)); - -extern int cache_pwdinit __P ((void)); -extern void *cache_getpwnam __P ((void *param)); -extern void *cache_getpwuid __P ((void *param)); -extern void *cache_pw_disabled __P ((void *param)); - -extern int cache_grpinit __P ((void)); -extern void *cache_getgrnam __P ((void *param)); -extern void *cache_getgrgid __P ((void *param)); -extern void *cache_gr_disabled __P ((void *param)); - -extern int __nscd_open_socket __P ((void)); - -extern void get_pw_stat __P ((stat_response_header *resp)); -extern void get_gr_stat __P ((stat_response_header *resp)); -extern void print_stat __P ((void)); -extern void stat_send __P ((int conn, stat_response_header *resp)); - -#endif + int version; + int found; + ssize_t h_name_len; + ssize_t h_aliases_cnt; + int h_addrtype; + int h_length; + ssize_t h_addr_list_cnt; + int error; +} hst_response_header; + +/* Global variables. */ +extern const char *dbnames[lastdb]; +extern const char *serv2str[LASTREQ]; + +extern const struct iovec pwd_iov_disabled; +extern const struct iovec grp_iov_disabled; +extern const struct iovec hst_iov_disabled; + +/* Number of threads to run. */ +extern int nthreads; + + +/* Prototypes for global functions. */ + +/* nscd.c */ +extern void termination_handler (int signum); +extern int nscd_open_socket (void); + +/* connections.c */ +extern void nscd_init (const char *conffile); +extern void close_sockets (void); +extern void start_threads (void); + +/* nscd_conf.c */ +extern int nscd_parse_file (const char *fname, struct database dbs[lastdb]); + +/* nscd_stat.c */ +extern void send_stats (int fd, struct database dbs[lastdb]); +extern int receive_print_stats (void); + +/* cache.c */ +extern struct hashentry *cache_search (int type, void *key, size_t len, + struct database *table); +extern void cache_add (int type, void *key, size_t len, + const void *packet, size_t iovtotal, void *data, + int last, time_t t, struct database *table); +extern void prune_cache (struct database *table, time_t now); + +/* pwdcache.c */ +extern void addpwbyname (struct database *db, int fd, request_header *req, + void *key); +extern void addpwbyuid (struct database *db, int fd, request_header *req, + void *key); + +/* grpcache.c */ +extern void addgrbyname (struct database *db, int fd, request_header *req, + void *key); +extern void addgrbygid (struct database *db, int fd, request_header *req, + void *key); + +/* hstcache.c */ +extern void addhstbyname (struct database *db, int fd, request_header *req, + void *key); +extern void addhstbyaddr (struct database *db, int fd, request_header *req, + void *key); +extern void addhstbynamev6 (struct database *db, int fd, request_header *req, + void *key); +extern void addhstbyaddrv6 (struct database *db, int fd, request_header *req, + void *key); + +#endif /* nscd.h */ -- cgit v1.2.1