diff options
Diffstat (limited to 'nscd/nscd.h')
-rw-r--r-- | nscd/nscd.h | 240 |
1 files changed, 156 insertions, 84 deletions
diff --git a/nscd/nscd.h b/nscd/nscd.h index 4835542..bc8150a 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 <pthread.h> +#include <time.h> +#include <sys/uio.h> -#include <grp.h> -#include <pwd.h> /* 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 */ |