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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
/*
nslcd.h - file describing client/server protocol
Copyright (C) 2006 West Consulting
Copyright (C) 2006, 2007 Arthur de Jong
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA
*/
#ifndef _NSLCD_H
#define _NSLCD_H 1
/*
The protocol used between the nslcd client and server is a simple binary
protocol. It is request/response based where the client initiates a
connection, does a single request and closes the connection again. Any
mangled or not understood messages will be silently ignored by the server.
A request looks like:
int32 NSLCD_VERSION
int32 NSLCD_ACTION_*
[request parameters if any]
A response looks like:
int32 NSLCD_VERSION
int32 NSLCD_ACTION_* (the original request type)
[result(s)]
NSLCD_RESULT_END
A result looks like:
int32 NSLCD_RESULT_SUCCESS
[result value(s)]
If a response would return multiple values (e.g. for NSLCD_ACTION_*_ALL
functions) each return value will be preceded by a NSLCD_RESULT_SUCCESS
value. After the last returned result the server sends
NSLCD_RESULT_END. If some error occurs the server terminates the
connection to signal an error condition (breaking the protocol).
These are the available data types:
INT32 - 32-bit integer value
TYPE - a typed field that is transferred using sizeof()
STRING - a string length (32bit) followed by the string value (not
null-terminted) the string itself is assumed to be UTF-8
STRINGLIST - a 32-bit number noting the number of strings followed by
the strings one at a time
Compound datatypes (such as PASSWD) are defined below as a combination of
the above types. They are defined as macros so they can be expanded to
code later on.
The protocol uses host-byte order for all types (except where the normal
value in-memory is already in network-byte order like with some
addresses). This simple protocol makes it easy to support diffenrent NSS
implementations.
*/
/* used for transferring alias information */
#define NSLCD_ALIAS \
NSLCD_STRING(ALIAS_NAME) \
NSLCD_STRINGLIST(ALIAS_RCPTS)
/* used for transferring mac addresses */
#define NSLCD_ETHER \
NSLCD_STRING(ETHER_NAME) \
NSLCD_TYPE(ETHER_ADDR,uint8_t[6])
/* used for transferring group and membership information */
#define NSLCD_GROUP \
NSLCD_STRING(GROUP_NAME) \
NSLCD_STRING(GROUP_PASSWD) \
NSLCD_TYPE(GROUP_GID,gid_t) \
NSLCD_STRINGLIST(GROUP_MEMBERS)
/* used for storing address information for the host database */
/* Note: this marcos is not expanded to code, check manually */
#define NSLCD_ADDRESS \
NSLCD_INT32(ADDRESS_TYPE) /* type of address: e.g. AF_INET or AF_INET6 */ \
NSLCD_INT32(ADDRESS_LEN) /* length of the address to follow */ \
NSLCD_BUF(ADDRESS_ADDR) /* the address itself in network byte order */
/* used for transferring host (/etc/hosts) information */
/* Note: this marco is not expanded to code, check manually */
#define NSLCD_HOST \
NSLCD_STRING(HOST_NAME) \
NSLCD_STRINGLIST(HOST_ALIASES) \
NSLCD_ADDRESSLIST(HOST_ADDRS)
/* used for transferring netgroup entries one at a time */
/* Note: this marcos is not expanded to code, check manually */
/* netgroup messages are split into two parts, first a part
determining the type */
#define NETGROUP_TYPE_NETGROUP 123
#define NETGROUP_TYPE_TRIPLE 456
#define NSLCD_NETGROUP_TYPE \
NSLCD_INT32(NETGROUP_TYPE) /* one of the above values */
/* followed by one of these message parts */
#define NSLCD_NETGROUP_NETGROUP \
NSLCD_STRING(NETGROUP_NETGROUP)
#define NSLCD_NETGROUP_TRIPLE \
NSLCD_STRING(NETGROUP_HOST) \
NSLCD_STRING(NETGROUP_USER) \
NSLCD_STRING(NETGROUP_DOMAIN)
/* user for transferring network (/etc/networks) information */
/* Note: this marco is not expanded to code, check manually */
#define NSLCD_NETWORK \
NSLCD_STRING(NETWORK_NAME) \
NSLCD_STRINGLIST(NETWORK_ALIASES) \
NSLCD_ADDRESSLIST(NETWORK_ADDRS)
/* used for transferring user (/etc/passwd) information */
#define NSLCD_PASSWD \
NSLCD_STRING(PASSWD_NAME) \
NSLCD_STRING(PASSWD_PASSWD) \
NSLCD_TYPE(PASSWD_UID,uid_t) \
NSLCD_TYPE(PASSWD_GID,gid_t) \
NSLCD_STRING(PASSWD_GECOS) \
NSLCD_STRING(PASSWD_DIR) \
NSLCD_STRING(PASSWD_SHELL)
/* used for transferring protocol information */
#define NSLCD_PROTOCOL \
NSLCD_STRING(PROTOCOL_NAME) \
NSLCD_STRINGLIST(PROTOCOL_ALIASES) \
NSLCD_INT32(PROTOCOL_NUMBER)
/* for transferring struct rpcent structs */
#define NSLCD_RPC \
NSLCD_STRING(RPC_NAME) \
NSLCD_STRINGLIST(RPC_ALIASES) \
NSLCD_INT32(RPC_NUMBER)
/* for transferring struct servent information */
#define NSLCD_SERVICE \
NSLCD_STRING(SERVICE_NAME) \
NSLCD_STRINGLIST(SERVICE_ALIASES) \
NSLCD_INT32(SERVICE_NUMBER) \
NSLCD_STRING(SERVICE_PROTOCOL)
/* used for transferring account (/etc/shadow) information */
#define NSLCD_SHADOW \
NSLCD_STRING(SHADOW_NAME) \
NSLCD_STRING(SHADOW_PASSWD) \
NSLCD_INT32(SHADOW_LASTCHANGE) \
NSLCD_INT32(SHADOW_MINDAYS) \
NSLCD_INT32(SHADOW_MAXDAYS) \
NSLCD_INT32(SHADOW_WARN) \
NSLCD_INT32(SHADOW_INACT) \
NSLCD_INT32(SHADOW_EXPIRE) \
NSLCD_INT32(SHADOW_FLAG)
/* The current version of the protocol. Note that version 1
is experimental and this version will be used until a
1.0 release of nss-ldapd is made. */
#define NSLCD_VERSION 1
/* Request types. */
#define NSLCD_ACTION_ALIAS_BYNAME 4001
#define NSLCD_ACTION_ALIAS_ALL 4002
#define NSLCD_ACTION_ETHER_BYNAME 3001
#define NSLCD_ACTION_ETHER_BYETHER 3002
#define NSLCD_ACTION_ETHER_ALL 3005
#define NSLCD_ACTION_GROUP_BYNAME 5001
#define NSLCD_ACTION_GROUP_BYGID 5002
#define NSLCD_ACTION_GROUP_BYMEMBER 5003
#define NSLCD_ACTION_GROUP_ALL 5004
#define NSLCD_ACTION_HOST_BYNAME 6001
#define NSLCD_ACTION_HOST_BYADDR 6002
#define NSLCD_ACTION_HOST_ALL 6005
#define NSLCD_ACTION_NETGROUP_BYNAME 12001
#define NSLCD_ACTION_NETWORK_BYNAME 8001
#define NSLCD_ACTION_NETWORK_BYADDR 8002
#define NSLCD_ACTION_NETWORK_ALL 8005
#define NSLCD_ACTION_PASSWD_BYNAME 1001
#define NSLCD_ACTION_PASSWD_BYUID 1002
#define NSLCD_ACTION_PASSWD_ALL 1004
#define NSLCD_ACTION_PROTOCOL_BYNAME 9001
#define NSLCD_ACTION_PROTOCOL_BYNUMBER 9002
#define NSLCD_ACTION_PROTOCOL_ALL 9003
#define NSLCD_ACTION_RPC_BYNAME 10001
#define NSLCD_ACTION_RPC_BYNUMBER 10002
#define NSLCD_ACTION_RPC_ALL 10003
#define NSLCD_ACTION_SERVICE_BYNAME 11001
#define NSLCD_ACTION_SERVICE_BYNUMBER 11002
#define NSLCD_ACTION_SERVICE_ALL 11005
#define NSLCD_ACTION_SHADOW_BYNAME 2001
#define NSLCD_ACTION_SHADOW_ALL 2005
/* Request result codes. */
#define NSLCD_RESULT_END 3 /* key was not found */
#define NSLCD_RESULT_SUCCESS 0 /* everything ok */
#endif /* not _NSLCD_H */
|