File: nss_cdb.h

package info (click to toggle)
tinycdb 0.78
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, buster, jessie, jessie-kfreebsd, stretch, wheezy
  • size: 212 kB
  • ctags: 220
  • sloc: ansic: 1,714; makefile: 229; sh: 113
file content (100 lines) | stat: -rw-r--r-- 2,790 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/* nss_cdb.h: nss_cdb common include file.
 *
 * This file is a part of tinycdb package by Michael Tokarev, mjt@corpit.ru.
 * Public domain.
 */


#include <sys/types.h>
#include <stdlib.h>
#include <nss.h>
#include "cdb.h"

#ifndef NSSCDB_DIR
# define NSSCDB_DIR "/etc"
#endif
#ifndef NSSCDB_DB
# define NSSCDB_DB(name) NSSCDB_DIR "/" name ".cdb"
#endif

typedef int (nss_parse_fn)(void *result, char *buf, size_t bufl);

struct nss_cdb {
  nss_parse_fn *parsefn;
  const char *dbname;
  int keepopen;
  unsigned lastpos;
  struct cdb cdb;
};

enum nss_status
__nss_cdb_setent(struct nss_cdb *dbp, int stayopen);
enum nss_status
__nss_cdb_endent(struct nss_cdb *dbp);
enum nss_status
__nss_cdb_getent(struct nss_cdb *dbp,
		 void *result, char *buf, size_t bufl, int *errnop);
enum nss_status
__nss_cdb_byname(struct nss_cdb *dbp, const char *name,
		 void *result, char *buf, size_t bufl, int *errnop);
enum nss_status
__nss_cdb_byid(struct nss_cdb *dbp, unsigned long id,
	       void *result, char *buf, size_t bufl, int *errnop);

#define nss_common(dbname,structname,entname) \
static int \
nss_##dbname##_parse(structname *result, char *buf, size_t bufl); \
static struct nss_cdb db = { \
  (nss_parse_fn*)&nss_##dbname##_parse, \
  NSSCDB_DB(#dbname),0,0,CDB_STATIC_INIT}; \
enum nss_status _nss_cdb_set##entname(int stayopen) { \
  return __nss_cdb_setent(&db, stayopen); \
} \
enum nss_status _nss_cdb_end##entname(void) { \
  return __nss_cdb_endent(&db); \
} \
enum nss_status \
_nss_cdb_get##entname##_r(structname *result, \
                           char *buf, size_t bufl, int *errnop) { \
  return __nss_cdb_getent(&db, result, buf, bufl, errnop); \
}

#define nss_getbyname(getbyname, structname) \
enum nss_status \
_nss_cdb_##getbyname##_r(const char *name, structname *result, \
		          char *buf, size_t bufl, int *errnop) { \
  return __nss_cdb_byname(&db, name, result, buf, bufl, errnop); \
}

#define nss_getbyid(getbyid, structname, idtype) \
enum nss_status \
_nss_cdb_##getbyid##_r(idtype id, structname *result, \
		           char *buf, size_t bufl, int *errnop) { \
  return __nss_cdb_byid(&db, id, result, buf, bufl, errnop); \
}

#define STRING_FIELD(line, variable) \
   variable = line; \
   while(*line != ':') \
     if (!*line++) return -1; \
   *line++ = '\0'

#define INT_FIELD(line, variable, convert) \
 { \
   char *endp; \
   variable = convert(strtoul(line, &endp, 10)); \
   if (endp == line) return -1; \
   if (*endp++ != ':') return -1; \
   line = endp; \
 }

#define INT_FIELD_MAYBE_NULL(line, variable, convert, default) \
 { \
   char *endp; \
   if (!*line) return -1; \
   variable = convert(strtoul(line, &endp, 10)); \
   if (*endp != ':') return -1; \
   if (endp == line) variable = convert(default); \
   line = endp; \
 }