OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [gnu-src/] [newlib-1.18.0/] [newlib-1.18.0-or32-1.0rc2/] [newlib/] [libc/] [sys/] [linux/] [net/] [nscd/] [nscd-client.h] - Diff between revs 207 and 520

Only display areas with differences | Details | Blame | View Log

Rev 207 Rev 520
/* Copyright (c) 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
/* Copyright (c) 1998, 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   This file is part of the GNU C Library.
   Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
   Contributed by Thorsten Kukuk <kukuk@suse.de>, 1998.
 
 
   The GNU C Library is free software; you can redistribute it and/or
   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
   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,
   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.
   Lesser General Public License for more details.
 
 
   You should have received a copy of the GNU Lesser General Public
   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, write to the Free
   License along with the GNU C Library; if not, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */
   02111-1307 USA.  */
 
 
/* This file defines everything that client code should need to
/* This file defines everything that client code should need to
   know to talk to the nscd daemon.  */
   know to talk to the nscd daemon.  */
 
 
#ifndef _NSCD_CLIENT_H
#ifndef _NSCD_CLIENT_H
#define _NSCD_CLIENT_H  1
#define _NSCD_CLIENT_H  1
 
 
#include <stdbool.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/types.h>
#include <machine/atomic.h>
#include <machine/atomic.h>
#include <nscd-types.h>
#include <nscd-types.h>
 
 
 
 
/* Version number of the daemon interface */
/* Version number of the daemon interface */
#define NSCD_VERSION 2
#define NSCD_VERSION 2
 
 
/* Path of the file where the PID of the running system is stored.  */
/* Path of the file where the PID of the running system is stored.  */
#define _PATH_NSCDPID    "/var/run/nscd/nscd.pid"
#define _PATH_NSCDPID    "/var/run/nscd/nscd.pid"
 
 
/* Path for the Unix domain socket.  */
/* Path for the Unix domain socket.  */
#define _PATH_NSCDSOCKET "/var/run/nscd/socket"
#define _PATH_NSCDSOCKET "/var/run/nscd/socket"
 
 
/* Path for the configuration file.  */
/* Path for the configuration file.  */
#define _PATH_NSCDCONF   "/etc/nscd.conf"
#define _PATH_NSCDCONF   "/etc/nscd.conf"
 
 
 
 
/* Available services.  */
/* Available services.  */
typedef enum
typedef enum
{
{
  GETPWBYNAME,
  GETPWBYNAME,
  GETPWBYUID,
  GETPWBYUID,
  GETGRBYNAME,
  GETGRBYNAME,
  GETGRBYGID,
  GETGRBYGID,
  GETHOSTBYNAME,
  GETHOSTBYNAME,
  GETHOSTBYNAMEv6,
  GETHOSTBYNAMEv6,
  GETHOSTBYADDR,
  GETHOSTBYADDR,
  GETHOSTBYADDRv6,
  GETHOSTBYADDRv6,
  LASTDBREQ = GETHOSTBYADDRv6,
  LASTDBREQ = GETHOSTBYADDRv6,
  SHUTDOWN,             /* Shut the server down.  */
  SHUTDOWN,             /* Shut the server down.  */
  GETSTAT,              /* Get the server statistic.  */
  GETSTAT,              /* Get the server statistic.  */
  INVALIDATE,           /* Invalidate one special cache.  */
  INVALIDATE,           /* Invalidate one special cache.  */
  GETFDPW,
  GETFDPW,
  GETFDGR,
  GETFDGR,
  GETFDHST,
  GETFDHST,
  GETAI,
  GETAI,
  INITGROUPS,
  INITGROUPS,
  LASTREQ
  LASTREQ
} request_type;
} request_type;
 
 
 
 
/* Header common to all requests */
/* Header common to all requests */
typedef struct
typedef struct
{
{
  int32_t version;      /* Version number of the daemon interface.  */
  int32_t version;      /* Version number of the daemon interface.  */
  request_type type;    /* Service requested.  */
  request_type type;    /* Service requested.  */
  int32_t key_len;      /* Key length.  */
  int32_t key_len;      /* Key length.  */
} request_header;
} request_header;
 
 
 
 
/* Structure sent in reply to password query.  Note that this struct is
/* 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.  */
   sent also if the service is disabled or there is no record found.  */
typedef struct
typedef struct
{
{
  int32_t version;
  int32_t version;
  int32_t found;
  int32_t found;
  nscd_ssize_t pw_name_len;
  nscd_ssize_t pw_name_len;
  nscd_ssize_t pw_passwd_len;
  nscd_ssize_t pw_passwd_len;
  uid_t pw_uid;
  uid_t pw_uid;
  gid_t pw_gid;
  gid_t pw_gid;
  nscd_ssize_t pw_gecos_len;
  nscd_ssize_t pw_gecos_len;
  nscd_ssize_t pw_dir_len;
  nscd_ssize_t pw_dir_len;
  nscd_ssize_t pw_shell_len;
  nscd_ssize_t pw_shell_len;
} pw_response_header;
} pw_response_header;
 
 
 
 
/* Structure sent in reply to group query.  Note that this struct is
/* 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.  */
   sent also if the service is disabled or there is no record found.  */
typedef struct
typedef struct
{
{
  int32_t version;
  int32_t version;
  int32_t found;
  int32_t found;
  nscd_ssize_t gr_name_len;
  nscd_ssize_t gr_name_len;
  nscd_ssize_t gr_passwd_len;
  nscd_ssize_t gr_passwd_len;
  gid_t gr_gid;
  gid_t gr_gid;
  nscd_ssize_t gr_mem_cnt;
  nscd_ssize_t gr_mem_cnt;
} gr_response_header;
} gr_response_header;
 
 
 
 
/* Structure sent in reply to host query.  Note that this struct is
/* 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.  */
   sent also if the service is disabled or there is no record found.  */
typedef struct
typedef struct
{
{
  int32_t version;
  int32_t version;
  int32_t found;
  int32_t found;
  nscd_ssize_t h_name_len;
  nscd_ssize_t h_name_len;
  nscd_ssize_t h_aliases_cnt;
  nscd_ssize_t h_aliases_cnt;
  int32_t h_addrtype;
  int32_t h_addrtype;
  int32_t h_length;
  int32_t h_length;
  nscd_ssize_t h_addr_list_cnt;
  nscd_ssize_t h_addr_list_cnt;
  int32_t error;
  int32_t error;
} hst_response_header;
} hst_response_header;
 
 
 
 
/* Structure sent in reply to addrinfo query.  Note that this struct is
/* 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.  */
   sent also if the service is disabled or there is no record found.  */
typedef struct
typedef struct
{
{
  int32_t version;
  int32_t version;
  int32_t found;
  int32_t found;
  nscd_ssize_t naddrs;
  nscd_ssize_t naddrs;
  nscd_ssize_t addrslen;
  nscd_ssize_t addrslen;
  nscd_ssize_t canonlen;
  nscd_ssize_t canonlen;
  int32_t error;
  int32_t error;
} ai_response_header;
} ai_response_header;
 
 
/* Structure filled in by __nscd_getai.  */
/* Structure filled in by __nscd_getai.  */
struct nscd_ai_result
struct nscd_ai_result
{
{
  int naddrs;
  int naddrs;
  char *canon;
  char *canon;
  uint8_t *family;
  uint8_t *family;
  char *addrs;
  char *addrs;
};
};
 
 
/* Structure sent in reply to initgroups query.  Note that this struct is
/* 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.  */
   sent also if the service is disabled or there is no record found.  */
typedef struct
typedef struct
{
{
  int32_t version;
  int32_t version;
  int32_t found;
  int32_t found;
  nscd_ssize_t ngrps;
  nscd_ssize_t ngrps;
} initgr_response_header;
} initgr_response_header;
 
 
 
 
/* Type for offsets in data part of database.  */
/* Type for offsets in data part of database.  */
typedef uint32_t ref_t;
typedef uint32_t ref_t;
/* Value for invalid/no reference.  */
/* Value for invalid/no reference.  */
#define ENDREF  UINT32_MAX
#define ENDREF  UINT32_MAX
 
 
/* Timestamp type.  */
/* Timestamp type.  */
typedef uint64_t nscd_time_t;
typedef uint64_t nscd_time_t;
 
 
/* Alignment requirement of the beginning of the data region.  */
/* Alignment requirement of the beginning of the data region.  */
#define ALIGN 16
#define ALIGN 16
 
 
 
 
/* Head of record in data part of database.  */
/* Head of record in data part of database.  */
struct datahead
struct datahead
{
{
  nscd_ssize_t allocsize;       /* Allocated Bytes.  */
  nscd_ssize_t allocsize;       /* Allocated Bytes.  */
  nscd_ssize_t recsize;         /* Size of the record.  */
  nscd_ssize_t recsize;         /* Size of the record.  */
  nscd_time_t timeout;          /* Time when this entry becomes invalid.  */
  nscd_time_t timeout;          /* Time when this entry becomes invalid.  */
  uint8_t notfound;             /* Nonzero if data has not been found.  */
  uint8_t notfound;             /* Nonzero if data has not been found.  */
  uint8_t nreloads;             /* Reloads without use.  */
  uint8_t nreloads;             /* Reloads without use.  */
  uint8_t usable;               /* False if the entry must be ignored.  */
  uint8_t usable;               /* False if the entry must be ignored.  */
  uint64_t :40;                 /* Alignment.  */
  uint64_t :40;                 /* Alignment.  */
 
 
  /* We need to have the following element aligned for the response
  /* We need to have the following element aligned for the response
     header data types and their use in the 'struct dataset' types
     header data types and their use in the 'struct dataset' types
     defined in the XXXcache.c files.  */
     defined in the XXXcache.c files.  */
  union
  union
  {
  {
    pw_response_header pwdata;
    pw_response_header pwdata;
    gr_response_header grdata;
    gr_response_header grdata;
    hst_response_header hstdata;
    hst_response_header hstdata;
    ai_response_header aidata;
    ai_response_header aidata;
    initgr_response_header initgrdata;
    initgr_response_header initgrdata;
    nscd_ssize_t align1;
    nscd_ssize_t align1;
    nscd_time_t align2;
    nscd_time_t align2;
  } data[0];
  } data[0];
};
};
 
 
 
 
/* Structure for one hash table entry.  */
/* Structure for one hash table entry.  */
struct hashentry
struct hashentry
{
{
  request_type type:8;          /* Which type of dataset.  */
  request_type type:8;          /* Which type of dataset.  */
  bool first;                   /* True if this was the original key.  */
  bool first;                   /* True if this was the original key.  */
  nscd_ssize_t len;             /* Length of key.  */
  nscd_ssize_t len;             /* Length of key.  */
  ref_t key;                    /* Pointer to key.  */
  ref_t key;                    /* Pointer to key.  */
  int32_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 next;                   /* Next entry in this hash bucket list.  */
  ref_t packet;                 /* Records for the result.  */
  ref_t packet;                 /* Records for the result.  */
  union
  union
  {
  {
    struct hashentry *dellist;  /* Next record to be deleted.  This can be a
    struct hashentry *dellist;  /* Next record to be deleted.  This can be a
                                   pointer since only nscd uses this field.  */
                                   pointer since only nscd uses this field.  */
    ref_t *prevp;               /* Pointer to field containing forward
    ref_t *prevp;               /* Pointer to field containing forward
                                   reference.  */
                                   reference.  */
  };
  };
};
};
 
 
 
 
/* Current persistent database version.  */
/* Current persistent database version.  */
#define DB_VERSION      1
#define DB_VERSION      1
 
 
/* Maximum time allowed between updates of the timestamp.  */
/* Maximum time allowed between updates of the timestamp.  */
#define MAPPING_TIMEOUT (5 * 60)
#define MAPPING_TIMEOUT (5 * 60)
 
 
 
 
/* Header of persistent database file.  */
/* Header of persistent database file.  */
struct database_pers_head
struct database_pers_head
{
{
  int32_t version;
  int32_t version;
  int32_t header_size;
  int32_t header_size;
  volatile int32_t gc_cycle;
  volatile int32_t gc_cycle;
  volatile int32_t nscd_certainly_running;
  volatile int32_t nscd_certainly_running;
  volatile nscd_time_t timestamp;
  volatile nscd_time_t timestamp;
 
 
  nscd_ssize_t module;
  nscd_ssize_t module;
  nscd_ssize_t data_size;
  nscd_ssize_t data_size;
 
 
  nscd_ssize_t first_free;      /* Offset of first free byte in data area.  */
  nscd_ssize_t first_free;      /* Offset of first free byte in data area.  */
 
 
  nscd_ssize_t nentries;
  nscd_ssize_t nentries;
  nscd_ssize_t maxnentries;
  nscd_ssize_t maxnentries;
  nscd_ssize_t maxnsearched;
  nscd_ssize_t maxnsearched;
 
 
  uint64_t poshit;
  uint64_t poshit;
  uint64_t neghit;
  uint64_t neghit;
  uint64_t posmiss;
  uint64_t posmiss;
  uint64_t negmiss;
  uint64_t negmiss;
 
 
  uint64_t rdlockdelayed;
  uint64_t rdlockdelayed;
  uint64_t wrlockdelayed;
  uint64_t wrlockdelayed;
 
 
  uint64_t addfailed;
  uint64_t addfailed;
 
 
  ref_t array[0];
  ref_t array[0];
};
};
 
 
 
 
/* Mapped database record.  */
/* Mapped database record.  */
struct mapped_database
struct mapped_database
{
{
  const struct database_pers_head *head;
  const struct database_pers_head *head;
  const char *data;
  const char *data;
  size_t mapsize;
  size_t mapsize;
  int counter;          /* > 0 indicates it is usable.  */
  int counter;          /* > 0 indicates it is usable.  */
};
};
#define NO_MAPPING ((struct mapped_database *) -1l)
#define NO_MAPPING ((struct mapped_database *) -1l)
 
 
struct locked_map_ptr
struct locked_map_ptr
{
{
  int lock;
  int lock;
  struct mapped_database *mapped;
  struct mapped_database *mapped;
};
};
#define libc_locked_map_ptr(class, name) class struct locked_map_ptr name
#define libc_locked_map_ptr(class, name) class struct locked_map_ptr name
 
 
 
 
/* Open socket connection to nscd server.  */
/* Open socket connection to nscd server.  */
extern int __nscd_open_socket (const char *key, size_t keylen,
extern int __nscd_open_socket (const char *key, size_t keylen,
                               request_type type, void *response,
                               request_type type, void *response,
                               size_t responselen) attribute_hidden;
                               size_t responselen) attribute_hidden;
 
 
/* Get reference of mapping.  */
/* Get reference of mapping.  */
extern struct mapped_database *__nscd_get_map_ref (request_type type,
extern struct mapped_database *__nscd_get_map_ref (request_type type,
                                                   const char *name,
                                                   const char *name,
                                                   struct locked_map_ptr *mapptr,
                                                   struct locked_map_ptr *mapptr,
                                                   int *gc_cyclep);
                                                   int *gc_cyclep);
 
 
/* Unmap database.  */
/* Unmap database.  */
extern void __nscd_unmap (struct mapped_database *mapped);
extern void __nscd_unmap (struct mapped_database *mapped);
 
 
/* Drop reference of mapping.  */
/* Drop reference of mapping.  */
static inline int __nscd_drop_map_ref (struct mapped_database *map,
static inline int __nscd_drop_map_ref (struct mapped_database *map,
                                       int *gc_cycle)
                                       int *gc_cycle)
{
{
  if (map != NO_MAPPING)
  if (map != NO_MAPPING)
    {
    {
      int now_cycle = map->head->gc_cycle;
      int now_cycle = map->head->gc_cycle;
      if (__builtin_expect (now_cycle != *gc_cycle, 0))
      if (__builtin_expect (now_cycle != *gc_cycle, 0))
        {
        {
          /* We might have read inconsistent data.  */
          /* We might have read inconsistent data.  */
          *gc_cycle = now_cycle;
          *gc_cycle = now_cycle;
          return -1;
          return -1;
        }
        }
 
 
      if (atomic_decrement_and_test (&map->counter) == 0)
      if (atomic_decrement_and_test (&map->counter) == 0)
        __nscd_unmap (map);
        __nscd_unmap (map);
    }
    }
 
 
  return 0;
  return 0;
}
}
 
 
 
 
/* Search the mapped database.  */
/* Search the mapped database.  */
extern const struct datahead *__nscd_cache_search (request_type type,
extern const struct datahead *__nscd_cache_search (request_type type,
                                                   const char *key,
                                                   const char *key,
                                                   size_t keylen,
                                                   size_t keylen,
                                                   const struct mapped_database *mapped);
                                                   const struct mapped_database *mapped);
 
 
#endif /* nscd.h */
#endif /* nscd.h */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.