Define MAXKEYLEN.
[kopensolaris-gnu/glibc.git] / nscd / nscd-client.h
index 7cdeba5..3c9688f 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (c) 1998, 1999, 2000, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
 
 #ifndef _NSCD_CLIENT_H
 #define _NSCD_CLIENT_H 1
 
+#include <stdbool.h>
+#include <stdint.h>
+#include <sys/types.h>
 #include <atomic.h>
 #include <nscd-types.h>
+#include <sys/uio.h>
+
 
 /* Version number of the daemon interface */
 #define NSCD_VERSION 2
@@ -38,6 +44,9 @@
 /* Path for the configuration file.  */
 #define _PATH_NSCDCONF  "/etc/nscd.conf"
 
+/* Maximu allowed length for the key.  */
+#define MAXKEYLEN 1024
+
 
 /* Available services.  */
 typedef enum
@@ -50,13 +59,17 @@ typedef enum
   GETHOSTBYNAMEv6,
   GETHOSTBYADDR,
   GETHOSTBYADDRv6,
-  LASTDBREQ = GETHOSTBYADDRv6,
   SHUTDOWN,            /* Shut the server down.  */
   GETSTAT,             /* Get the server statistic.  */
   INVALIDATE,           /* Invalidate one special cache.  */
   GETFDPW,
   GETFDGR,
   GETFDHST,
+  GETAI,
+  INITGROUPS,
+  GETSERVBYNAME,
+  GETSERVBYPORT,
+  GETFDSERV,
   LASTREQ
 } request_type;
 
@@ -114,11 +127,58 @@ typedef struct
 } hst_response_header;
 
 
+/* Structure sent in reply to addrinfo query.  Note that this struct is
+   sent also if the service is disabled or there is no record found.  */
+typedef struct
+{
+  int32_t version;
+  int32_t found;
+  nscd_ssize_t naddrs;
+  nscd_ssize_t addrslen;
+  nscd_ssize_t canonlen;
+  int32_t error;
+} ai_response_header;
+
+/* Structure filled in by __nscd_getai.  */
+struct nscd_ai_result
+{
+  int naddrs;
+  char *canon;
+  uint8_t *family;
+  char *addrs;
+};
+
+/* Structure sent in reply to initgroups query.  Note that this struct is
+   sent also if the service is disabled or there is no record found.  */
+typedef struct
+{
+  int32_t version;
+  int32_t found;
+  nscd_ssize_t ngrps;
+} initgr_response_header;
+
+
+/* Structure sent in reply to services query.  Note that this struct is
+   sent also if the service is disabled or there is no record found.  */
+typedef struct
+{
+  int32_t version;
+  int32_t found;
+  nscd_ssize_t s_name_len;
+  nscd_ssize_t s_proto_len;
+  nscd_ssize_t s_aliases_cnt;
+  int32_t s_port;
+} serv_response_header;
+
+
 /* Type for offsets in data part of database.  */
 typedef uint32_t ref_t;
 /* Value for invalid/no reference.  */
 #define ENDREF UINT32_MAX
 
+/* Timestamp type.  */
+typedef uint64_t nscd_time_t;
+
 /* Alignment requirement of the beginning of the data region.  */
 #define ALIGN 16
 
@@ -126,12 +186,13 @@ typedef uint32_t ref_t;
 /* Head of record in data part of database.  */
 struct datahead
 {
-  size_t allocsize;    /* Allocated Bytes.  */
-  size_t recsize;      /* Size of the record.  */
-  time_t timeout;      /* Time when this entry becomes invalid.  */
-  bool notfound;       /* Nonzero if data for key has not been found.  */
-  uint8_t nreloads;    /* Reloads without use.  */
-  bool usable;         /* False if the entry must be ignored.  */
+  nscd_ssize_t allocsize;      /* Allocated Bytes.  */
+  nscd_ssize_t recsize;                /* Size of the record.  */
+  nscd_time_t timeout;         /* Time when this entry becomes invalid.  */
+  uint8_t notfound;            /* Nonzero if data has not been found.  */
+  uint8_t nreloads;            /* Reloads without use.  */
+  uint8_t usable;              /* False if the entry must be ignored.  */
+  uint64_t :40;                        /* Alignment.  */
 
   /* We need to have the following element aligned for the response
      header data types and their use in the 'struct dataset' types
@@ -141,8 +202,11 @@ struct datahead
     pw_response_header pwdata;
     gr_response_header grdata;
     hst_response_header hstdata;
-    ssize_t align1;
-    time_t align2;
+    ai_response_header aidata;
+    initgr_response_header initgrdata;
+    serv_response_header servdata;
+    nscd_ssize_t align1;
+    nscd_time_t align2;
   } data[0];
 };
 
@@ -152,9 +216,9 @@ struct hashentry
 {
   request_type type:8;         /* Which type of dataset.  */
   bool first;                  /* True if this was the original key.  */
-  size_t len;                  /* Length of key.  */
+  nscd_ssize_t len;            /* Length of key.  */
   ref_t key;                   /* Pointer to key.  */
-  uid_t owner;                 /* If secure table, this is the owner.  */
+  int32_t owner;               /* If secure table, this is the owner.  */
   ref_t next;                  /* Next entry in this hash bucket list.  */
   ref_t packet;                        /* Records for the result.  */
   union
@@ -177,30 +241,30 @@ struct hashentry
 /* Header of persistent database file.  */
 struct database_pers_head
 {
-  int version;
-  int header_size;
-  volatile int gc_cycle;
-  volatile int nscd_certainly_running;
-  volatile time_t timestamp;
+  int32_t version;
+  int32_t header_size;
+  volatile int32_t gc_cycle;
+  volatile int32_t nscd_certainly_running;
+  volatile nscd_time_t timestamp;
 
-  size_t module;
-  size_t data_size;
+  nscd_ssize_t module;
+  nscd_ssize_t data_size;
 
-  size_t first_free;           /* Offset of first free byte in data area.  */
+  nscd_ssize_t first_free;     /* Offset of first free byte in data area.  */
 
-  size_t nentries;
-  size_t maxnentries;
-  size_t maxnsearched;
+  nscd_ssize_t nentries;
+  nscd_ssize_t maxnentries;
+  nscd_ssize_t maxnsearched;
 
-  uintmax_t poshit;
-  uintmax_t neghit;
-  uintmax_t posmiss;
-  uintmax_t negmiss;
+  uint64_t poshit;
+  uint64_t neghit;
+  uint64_t posmiss;
+  uint64_t negmiss;
 
-  uintmax_t rdlockdelayed;
-  uintmax_t wrlockdelayed;
+  uint64_t rdlockdelayed;
+  uint64_t wrlockdelayed;
 
-  uintmax_t addfailed;
+  uint64_t addfailed;
 
   ref_t array[0];
 };
@@ -212,7 +276,8 @@ struct mapped_database
   const struct database_pers_head *head;
   const char *data;
   size_t mapsize;
-  int counter;         /* > 0 indicates it isusable.  */
+  int counter;         /* > 0 indicates it is usable.  */
+  size_t datasize;
 };
 #define NO_MAPPING ((struct mapped_database *) -1l)
 
@@ -221,7 +286,7 @@ struct locked_map_ptr
   int lock;
   struct mapped_database *mapped;
 };
-#define libc_locked_map_ptr(name) static struct locked_map_ptr name
+#define libc_locked_map_ptr(class, name) class struct locked_map_ptr name
 
 
 /* Open socket connection to nscd server.  */
@@ -232,21 +297,25 @@ extern int __nscd_open_socket (const char *key, size_t keylen,
 /* Get reference of mapping.  */
 extern struct mapped_database *__nscd_get_map_ref (request_type type,
                                                   const char *name,
-                                                  struct locked_map_ptr *mapptr,
-                                                  volatile int *gc_cyclep);
+                                                  volatile struct locked_map_ptr *mapptr,
+                                                  int *gc_cyclep);
 
 /* Unmap database.  */
 extern void __nscd_unmap (struct mapped_database *mapped);
 
 /* Drop reference of mapping.  */
 static inline int __nscd_drop_map_ref (struct mapped_database *map,
-                                      int gc_cycle)
+                                      int *gc_cycle)
 {
   if (map != NO_MAPPING)
     {
-      if (__builtin_expect (map->head->gc_cycle != gc_cycle, 0))
-       /* We might have read inconsistent data.  */
-       return -1;
+      int now_cycle = map->head->gc_cycle;
+      if (__builtin_expect (now_cycle != *gc_cycle, 0))
+       {
+         /* We might have read inconsistent data.  */
+         *gc_cycle = now_cycle;
+         return -1;
+       }
 
       if (atomic_decrement_val (&map->counter) == 0)
        __nscd_unmap (map);
@@ -257,9 +326,20 @@ static inline int __nscd_drop_map_ref (struct mapped_database *map,
 
 
 /* Search the mapped database.  */
-extern const struct datahead * __nscd_cache_search (request_type type,
-                                                   const char *key,
-                                                   size_t keylen,
-                                                   const struct mapped_database *mapped);
+extern struct datahead *__nscd_cache_search (request_type type,
+                                            const char *key,
+                                            size_t keylen,
+                                            const struct mapped_database *mapped);
+
+/* Wrappers around read, readv and write that only read/write less than LEN
+   bytes on error or EOF.  */
+extern ssize_t __readall (int fd, void *buf, size_t len)
+  attribute_hidden;
+extern ssize_t __readvall (int fd, const struct iovec *iov, int iovcnt)
+  attribute_hidden;
+extern ssize_t writeall (int fd, const void *buf, size_t len)
+  attribute_hidden;
+extern ssize_t sendfileall (int tofd, int fromfd, off_t off, size_t len)
+  attribute_hidden;
 
 #endif /* nscd.h */