Blame nscd/nscd-client.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
/* This file defines everything that client code should need to
Packit Service 82fcde
   know to talk to the nscd daemon.  */
Packit Service 82fcde
Packit Service 82fcde
#ifndef _NSCD_CLIENT_H
Packit Service 82fcde
#define _NSCD_CLIENT_H	1
Packit Service 82fcde
Packit Service 82fcde
#include <stdbool.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <time.h>
Packit Service 82fcde
#include <sys/types.h>
Packit Service 82fcde
#include <atomic.h>
Packit Service 82fcde
#include <nscd-types.h>
Packit Service 82fcde
#include <sys/uio.h>
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Version number of the daemon interface */
Packit Service 82fcde
#define NSCD_VERSION 2
Packit Service 82fcde
Packit Service 82fcde
/* Path of the file where the PID of the running system is stored.  */
Packit Service 82fcde
#define _PATH_NSCDPID	 "/var/run/nscd/nscd.pid"
Packit Service 82fcde
Packit Service 82fcde
/* Path for the Unix domain socket.  */
Packit Service 82fcde
#define _PATH_NSCDSOCKET "/var/run/nscd/socket"
Packit Service 82fcde
Packit Service 82fcde
/* Path for the configuration file.  */
Packit Service 82fcde
#define _PATH_NSCDCONF	 "/etc/nscd.conf"
Packit Service 82fcde
Packit Service 82fcde
/* Maximum allowed length for the key.  */
Packit Service 82fcde
#define MAXKEYLEN 1024
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Available services.  */
Packit Service 82fcde
typedef enum
Packit Service 82fcde
{
Packit Service 82fcde
  GETPWBYNAME,
Packit Service 82fcde
  GETPWBYUID,
Packit Service 82fcde
  GETGRBYNAME,
Packit Service 82fcde
  GETGRBYGID,
Packit Service 82fcde
  GETHOSTBYNAME,
Packit Service 82fcde
  GETHOSTBYNAMEv6,
Packit Service 82fcde
  GETHOSTBYADDR,
Packit Service 82fcde
  GETHOSTBYADDRv6,
Packit Service 82fcde
  SHUTDOWN,		/* Shut the server down.  */
Packit Service 82fcde
  GETSTAT,		/* Get the server statistic.  */
Packit Service 82fcde
  INVALIDATE,           /* Invalidate one special cache.  */
Packit Service 82fcde
  GETFDPW,
Packit Service 82fcde
  GETFDGR,
Packit Service 82fcde
  GETFDHST,
Packit Service 82fcde
  GETAI,
Packit Service 82fcde
  INITGROUPS,
Packit Service 82fcde
  GETSERVBYNAME,
Packit Service 82fcde
  GETSERVBYPORT,
Packit Service 82fcde
  GETFDSERV,
Packit Service 82fcde
  GETNETGRENT,
Packit Service 82fcde
  INNETGR,
Packit Service 82fcde
  GETFDNETGR,
Packit Service 82fcde
  LASTREQ
Packit Service 82fcde
} request_type;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Header common to all requests */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;	/* Version number of the daemon interface.  */
Packit Service 82fcde
  request_type type;	/* Service requested.  */
Packit Service 82fcde
  int32_t key_len;	/* Key length.  */
Packit Service 82fcde
} request_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to password query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t pw_name_len;
Packit Service 82fcde
  nscd_ssize_t pw_passwd_len;
Packit Service 82fcde
  uid_t pw_uid;
Packit Service 82fcde
  gid_t pw_gid;
Packit Service 82fcde
  nscd_ssize_t pw_gecos_len;
Packit Service 82fcde
  nscd_ssize_t pw_dir_len;
Packit Service 82fcde
  nscd_ssize_t pw_shell_len;
Packit Service 82fcde
} pw_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to group query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t gr_name_len;
Packit Service 82fcde
  nscd_ssize_t gr_passwd_len;
Packit Service 82fcde
  gid_t gr_gid;
Packit Service 82fcde
  nscd_ssize_t gr_mem_cnt;
Packit Service 82fcde
} gr_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to host query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t h_name_len;
Packit Service 82fcde
  nscd_ssize_t h_aliases_cnt;
Packit Service 82fcde
  int32_t h_addrtype;
Packit Service 82fcde
  int32_t h_length;
Packit Service 82fcde
  nscd_ssize_t h_addr_list_cnt;
Packit Service 82fcde
  int32_t error;
Packit Service 82fcde
} hst_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to addrinfo query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t naddrs;
Packit Service 82fcde
  nscd_ssize_t addrslen;
Packit Service 82fcde
  nscd_ssize_t canonlen;
Packit Service 82fcde
  int32_t error;
Packit Service 82fcde
} ai_response_header;
Packit Service 82fcde
Packit Service 82fcde
/* Structure filled in by __nscd_getai.  */
Packit Service 82fcde
struct nscd_ai_result
Packit Service 82fcde
{
Packit Service 82fcde
  int naddrs;
Packit Service 82fcde
  char *canon;
Packit Service 82fcde
  uint8_t *family;
Packit Service 82fcde
  char *addrs;
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to initgroups query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t ngrps;
Packit Service 82fcde
} initgr_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure sent in reply to services query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t s_name_len;
Packit Service 82fcde
  nscd_ssize_t s_proto_len;
Packit Service 82fcde
  nscd_ssize_t s_aliases_cnt;
Packit Service 82fcde
  int32_t s_port;
Packit Service 82fcde
} serv_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Structure send in reply to netgroup query.  Note that this struct is
Packit Service 82fcde
   sent also if the service is disabled or there is no record found.  */
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  nscd_ssize_t nresults;
Packit Service 82fcde
  nscd_ssize_t result_len;
Packit Service 82fcde
} netgroup_response_header;
Packit Service 82fcde
Packit Service 82fcde
typedef struct
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t found;
Packit Service 82fcde
  int32_t result;
Packit Service 82fcde
} innetgroup_response_header;
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Type for offsets in data part of database.  */
Packit Service 82fcde
typedef uint32_t ref_t;
Packit Service 82fcde
/* Value for invalid/no reference.  */
Packit Service 82fcde
#define ENDREF	UINT32_MAX
Packit Service 82fcde
Packit Service 82fcde
/* Timestamp type.  */
Packit Service 82fcde
typedef uint64_t nscd_time_t;
Packit Service 82fcde
Packit Service 82fcde
/* Maximum timestamp.  */
Packit Service 82fcde
#define MAX_TIMEOUT_VALUE \
Packit Service 82fcde
  (sizeof (time_t) == sizeof (long int) ? LONG_MAX : INT_MAX)
Packit Service 82fcde
Packit Service 82fcde
/* Alignment requirement of the beginning of the data region.  */
Packit Service 82fcde
#define ALIGN 16
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Head of record in data part of database.  */
Packit Service 82fcde
struct datahead
Packit Service 82fcde
{
Packit Service 82fcde
  nscd_ssize_t allocsize;	/* Allocated Bytes.  */
Packit Service 82fcde
  nscd_ssize_t recsize;		/* Size of the record.  */
Packit Service 82fcde
  nscd_time_t timeout;		/* Time when this entry becomes invalid.  */
Packit Service 82fcde
  uint8_t notfound;		/* Nonzero if data has not been found.  */
Packit Service 82fcde
  uint8_t nreloads;		/* Reloads without use.  */
Packit Service 82fcde
  uint8_t usable;		/* False if the entry must be ignored.  */
Packit Service 82fcde
  uint8_t unused;		/* Unused.  */
Packit Service 82fcde
  uint32_t ttl;			/* TTL value used.  */
Packit Service 82fcde
Packit Service 82fcde
  /* We need to have the following element aligned for the response
Packit Service 82fcde
     header data types and their use in the 'struct dataset' types
Packit Service 82fcde
     defined in the XXXcache.c files.  */
Packit Service 82fcde
  union
Packit Service 82fcde
  {
Packit Service 82fcde
    pw_response_header pwdata;
Packit Service 82fcde
    gr_response_header grdata;
Packit Service 82fcde
    hst_response_header hstdata;
Packit Service 82fcde
    ai_response_header aidata;
Packit Service 82fcde
    initgr_response_header initgrdata;
Packit Service 82fcde
    serv_response_header servdata;
Packit Service 82fcde
    netgroup_response_header netgroupdata;
Packit Service 82fcde
    innetgroup_response_header innetgroupdata;
Packit Service 82fcde
    nscd_ssize_t align1;
Packit Service 82fcde
    nscd_time_t align2;
Packit Service 82fcde
  } data[0];
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
static inline time_t
Packit Service 82fcde
datahead_init_common (struct datahead *head, nscd_ssize_t allocsize,
Packit Service 82fcde
		      nscd_ssize_t recsize, uint32_t ttl)
Packit Service 82fcde
{
Packit Service 82fcde
  /* Initialize so that we don't write out junk in uninitialized data to the
Packit Service 82fcde
     cache.  */
Packit Service 82fcde
  memset (head, 0, sizeof (*head));
Packit Service 82fcde
Packit Service 82fcde
  head->allocsize = allocsize;
Packit Service 82fcde
  head->recsize = recsize;
Packit Service 82fcde
  head->usable = true;
Packit Service 82fcde
Packit Service 82fcde
  head->ttl = ttl;
Packit Service 82fcde
Packit Service 82fcde
  /* Compute and return the timeout time.  */
Packit Service 82fcde
  return head->timeout = time (NULL) + ttl;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static inline time_t
Packit Service 82fcde
datahead_init_pos (struct datahead *head, nscd_ssize_t allocsize,
Packit Service 82fcde
		   nscd_ssize_t recsize, uint8_t nreloads, uint32_t ttl)
Packit Service 82fcde
{
Packit Service 82fcde
  time_t ret = datahead_init_common (head, allocsize, recsize, ttl);
Packit Service 82fcde
Packit Service 82fcde
  head->notfound = false;
Packit Service 82fcde
  head->nreloads = nreloads;
Packit Service 82fcde
Packit Service 82fcde
  return ret;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static inline time_t
Packit Service 82fcde
datahead_init_neg (struct datahead *head, nscd_ssize_t allocsize,
Packit Service 82fcde
		   nscd_ssize_t recsize, uint32_t ttl)
Packit Service 82fcde
{
Packit Service 82fcde
  time_t ret = datahead_init_common (head, allocsize, recsize, ttl);
Packit Service 82fcde
Packit Service 82fcde
  /* We don't need to touch nreloads here since it is set to our desired value
Packit Service 82fcde
     (0) when we clear the structure.  */
Packit Service 82fcde
  head->notfound = true;
Packit Service 82fcde
Packit Service 82fcde
  return ret;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Structure for one hash table entry.  */
Packit Service 82fcde
struct hashentry
Packit Service 82fcde
{
Packit Service 82fcde
  request_type type:8;		/* Which type of dataset.  */
Packit Service 82fcde
  bool first;			/* True if this was the original key.  */
Packit Service 82fcde
  nscd_ssize_t len;		/* Length of key.  */
Packit Service 82fcde
  ref_t key;			/* Pointer to key.  */
Packit Service 82fcde
  int32_t owner;		/* If secure table, this is the owner.  */
Packit Service 82fcde
  ref_t next;			/* Next entry in this hash bucket list.  */
Packit Service 82fcde
  ref_t packet;			/* Records for the result.  */
Packit Service 82fcde
  union
Packit Service 82fcde
  {
Packit Service 82fcde
    struct hashentry *dellist;	/* Next record to be deleted.  This can be a
Packit Service 82fcde
				   pointer since only nscd uses this field.  */
Packit Service 82fcde
    ref_t *prevp;		/* Pointer to field containing forward
Packit Service 82fcde
				   reference.  */
Packit Service 82fcde
  };
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Current persistent database version.  */
Packit Service 82fcde
#define DB_VERSION	2
Packit Service 82fcde
Packit Service 82fcde
/* Maximum time allowed between updates of the timestamp.  */
Packit Service 82fcde
#define MAPPING_TIMEOUT (5 * 60)
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Used indices for the EXTRA_DATA element of 'database_pers_head'.
Packit Service 82fcde
   Each database has its own indices.  */
Packit Service 82fcde
#define NSCD_HST_IDX_CONF_TIMESTAMP	0
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Header of persistent database file.  */
Packit Service 82fcde
struct database_pers_head
Packit Service 82fcde
{
Packit Service 82fcde
  int32_t version;
Packit Service 82fcde
  int32_t header_size;
Packit Service 82fcde
  volatile int32_t gc_cycle;
Packit Service 82fcde
  volatile int32_t nscd_certainly_running;
Packit Service 82fcde
  volatile nscd_time_t timestamp;
Packit Service 82fcde
  /* Room for extensions.  */
Packit Service 82fcde
  volatile uint32_t extra_data[4];
Packit Service 82fcde
Packit Service 82fcde
  nscd_ssize_t module;
Packit Service 82fcde
  nscd_ssize_t data_size;
Packit Service 82fcde
Packit Service 82fcde
  nscd_ssize_t first_free;	/* Offset of first free byte in data area.  */
Packit Service 82fcde
Packit Service 82fcde
  nscd_ssize_t nentries;
Packit Service 82fcde
  nscd_ssize_t maxnentries;
Packit Service 82fcde
  nscd_ssize_t maxnsearched;
Packit Service 82fcde
Packit Service 82fcde
  uint64_t poshit;
Packit Service 82fcde
  uint64_t neghit;
Packit Service 82fcde
  uint64_t posmiss;
Packit Service 82fcde
  uint64_t negmiss;
Packit Service 82fcde
Packit Service 82fcde
  uint64_t rdlockdelayed;
Packit Service 82fcde
  uint64_t wrlockdelayed;
Packit Service 82fcde
Packit Service 82fcde
  uint64_t addfailed;
Packit Service 82fcde
Packit Service 82fcde
  ref_t array[0];
Packit Service 82fcde
};
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Mapped database record.  */
Packit Service 82fcde
struct mapped_database
Packit Service 82fcde
{
Packit Service 82fcde
  const struct database_pers_head *head;
Packit Service 82fcde
  const char *data;
Packit Service 82fcde
  size_t mapsize;
Packit Service 82fcde
  int counter;		/* > 0 indicates it is usable.  */
Packit Service 82fcde
  size_t datasize;
Packit Service 82fcde
};
Packit Service 82fcde
#define NO_MAPPING ((struct mapped_database *) -1l)
Packit Service 82fcde
Packit Service 82fcde
struct locked_map_ptr
Packit Service 82fcde
{
Packit Service 82fcde
  int lock;
Packit Service 82fcde
  struct mapped_database *mapped;
Packit Service 82fcde
};
Packit Service 82fcde
#define libc_locked_map_ptr(class, name) class struct locked_map_ptr name
Packit Service 82fcde
Packit Service 82fcde
/* Try acquiring lock for mapptr, returns true if it succeeds, false
Packit Service 82fcde
   if not.  */
Packit Service 82fcde
static inline bool
Packit Service 82fcde
__nscd_acquire_maplock (volatile struct locked_map_ptr *mapptr)
Packit Service 82fcde
{
Packit Service 82fcde
  int cnt = 0;
Packit Service 82fcde
  while (__builtin_expect (atomic_compare_and_exchange_val_acq (&mapptr->lock,
Packit Service 82fcde
								1, 0) != 0, 0))
Packit Service 82fcde
    {
Packit Service 82fcde
      // XXX Best number of rounds?
Packit Service 82fcde
      if (__glibc_unlikely (++cnt > 5))
Packit Service 82fcde
	return false;
Packit Service 82fcde
Packit Service 82fcde
      atomic_spin_nop ();
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return true;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Open socket connection to nscd server.  */
Packit Service 82fcde
extern int __nscd_open_socket (const char *key, size_t keylen,
Packit Service 82fcde
			       request_type type, void *response,
Packit Service 82fcde
			       size_t responselen) attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Try to get a file descriptor for the shared meory segment
Packit Service 82fcde
   containing the database.  */
Packit Service 82fcde
extern struct mapped_database *__nscd_get_mapping (request_type type,
Packit Service 82fcde
						   const char *key,
Packit Service 82fcde
						   struct mapped_database **mappedp) attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Get reference of mapping.  */
Packit Service 82fcde
extern struct mapped_database *__nscd_get_map_ref (request_type type,
Packit Service 82fcde
						   const char *name,
Packit Service 82fcde
						   volatile struct locked_map_ptr *mapptr,
Packit Service 82fcde
						   int *gc_cyclep)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Unmap database.  */
Packit Service 82fcde
extern void __nscd_unmap (struct mapped_database *mapped)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Drop reference of mapping.  */
Packit Service 82fcde
static int
Packit Service 82fcde
__attribute__ ((unused))
Packit Service 82fcde
__nscd_drop_map_ref (struct mapped_database *map, int *gc_cycle)
Packit Service 82fcde
{
Packit Service 82fcde
  if (map != NO_MAPPING)
Packit Service 82fcde
    {
Packit Service 82fcde
      int now_cycle = map->head->gc_cycle;
Packit Service 82fcde
      if (__glibc_unlikely (now_cycle != *gc_cycle))
Packit Service 82fcde
	{
Packit Service 82fcde
	  /* We might have read inconsistent data.  */
Packit Service 82fcde
	  *gc_cycle = now_cycle;
Packit Service 82fcde
	  return -1;
Packit Service 82fcde
	}
Packit Service 82fcde
Packit Service 82fcde
      if (atomic_decrement_val (&map->counter) == 0)
Packit Service 82fcde
	__nscd_unmap (map);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Search the mapped database.  */
Packit Service 82fcde
extern struct datahead *__nscd_cache_search (request_type type,
Packit Service 82fcde
					     const char *key,
Packit Service 82fcde
					     size_t keylen,
Packit Service 82fcde
					     const struct mapped_database *mapped,
Packit Service 82fcde
					     size_t datalen)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Wrappers around read, readv and write that only read/write less than LEN
Packit Service 82fcde
   bytes on error or EOF.  */
Packit Service 82fcde
extern ssize_t __readall (int fd, void *buf, size_t len)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
extern ssize_t __readvall (int fd, const struct iovec *iov, int iovcnt)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
extern ssize_t writeall (int fd, const void *buf, size_t len)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
/* Get netlink timestamp counter from mapped area or zero.  */
Packit Service 82fcde
extern uint32_t __nscd_get_nl_timestamp (void)
Packit Service 82fcde
  attribute_hidden;
Packit Service 82fcde
Packit Service 82fcde
#endif /* nscd.h */