protocol.h revision 194089
1/*-
2 * Copyright (c) 2005 Michael Bushkov <bushman@rsu.ru>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/usr.sbin/nscd/protocol.h 194089 2009-06-13 00:06:52Z des $
27 */
28
29#ifndef __NSCD_PROTOCOL_H__
30#define __NSCD_PROTOCOL_H__
31
32/* maximum buffer size to receive - larger buffers are not allowed */
33#define MAX_BUFFER_SIZE (1 << 20)
34
35/* buffer size correctness checking routine */
36#define BUFSIZE_CORRECT(x) (((x) > 0) && ((x) < MAX_BUFFER_SIZE))
37#define BUFSIZE_INVALID(x) (!BUFSIZE_CORRECT(x))
38
39/* structures below represent the data that are sent/received by the daemon */
40struct cache_write_request
41{
42	char	*entry;
43	char	*cache_key;
44	char	*data;
45
46	size_t	entry_length;
47	size_t	cache_key_size;
48	size_t	data_size;
49};
50
51struct cache_write_response
52{
53	int	error_code;
54};
55
56struct cache_read_request
57{
58	char	*entry;
59	char	*cache_key;
60
61	size_t	entry_length;
62	size_t	cache_key_size;
63};
64
65struct cache_read_response
66{
67	char	*data;			// ignored if error_code is not 0
68	size_t	data_size;		// ignored if error_code is not 0
69
70	int	error_code;
71};
72
73enum transformation_type {
74	TT_USER = 0,	// tranform only the entries of the caller
75	TT_ALL = 1	// transform all entries
76};
77
78struct cache_transform_request
79{
80	char	*entry; 		// ignored if entry_length is 0
81	size_t	entry_length;
82
83	int	transformation_type;
84};
85
86struct cache_transform_response
87{
88	int	error_code;
89};
90
91struct cache_mp_write_session_request {
92	char	*entry;
93	size_t	entry_length;
94};
95
96struct cache_mp_write_session_response {
97	int	error_code;
98};
99
100struct cache_mp_write_session_write_request {
101	char	*data;
102	size_t	data_size;
103};
104
105struct cache_mp_write_session_write_response {
106	int	error_code;
107};
108
109struct cache_mp_read_session_request {
110	char	*entry;
111	size_t	entry_length;
112};
113
114struct cache_mp_read_session_response {
115	int	error_code;
116};
117
118struct cache_mp_read_session_read_response {
119	char	*data;
120	size_t	data_size;
121
122	int	error_code;
123};
124
125
126enum comm_element_t {
127	CET_UNDEFINED 	= 0,
128	CET_WRITE_REQUEST = 1,
129	CET_WRITE_RESPONSE = 2,
130	CET_READ_REQUEST = 3,
131	CET_READ_RESPONSE = 4,
132	CET_TRANSFORM_REQUEST = 5,
133	CET_TRANSFORM_RESPONSE = 6,
134	CET_MP_WRITE_SESSION_REQUEST = 7,
135	CET_MP_WRITE_SESSION_RESPONSE = 8,
136	CET_MP_WRITE_SESSION_WRITE_REQUEST = 9,
137	CET_MP_WRITE_SESSION_WRITE_RESPONSE = 10,
138	CET_MP_WRITE_SESSION_CLOSE_NOTIFICATION = 11,
139	CET_MP_WRITE_SESSION_ABANDON_NOTIFICATION = 12,
140	CET_MP_READ_SESSION_REQUEST = 13,
141	CET_MP_READ_SESSION_RESPONSE = 14,
142	CET_MP_READ_SESSION_READ_REQUEST = 15,
143	CET_MP_READ_SESSION_READ_RESPONSE = 16,
144	CET_MP_READ_SESSION_CLOSE_NOTIFICATION = 17,
145	CET_MAX = 18
146};
147
148/*
149 * The comm_element is used as the holder of any known (defined above) data
150 * type that is to be sent/received.
151 */
152struct comm_element
153{
154	union {
155	struct cache_write_request c_write_request;
156	struct cache_write_response c_write_response;
157	struct cache_read_request c_read_request;
158	struct cache_read_response c_read_response;
159	struct cache_transform_request c_transform_request;
160	struct cache_transform_response c_transform_response;
161
162	struct cache_mp_write_session_request c_mp_ws_request;
163	struct cache_mp_write_session_response c_mp_ws_response;
164	struct cache_mp_write_session_write_request c_mp_ws_write_request;
165	struct cache_mp_write_session_write_response c_mp_ws_write_response;
166
167	struct cache_mp_read_session_request c_mp_rs_request;
168	struct cache_mp_read_session_response c_mp_rs_response;
169	struct cache_mp_read_session_read_response c_mp_rs_read_response;
170	};
171	enum comm_element_t type;
172};
173
174extern void init_comm_element(struct comm_element *, enum comm_element_t type);
175extern void finalize_comm_element(struct comm_element *);
176
177/*
178 * For each type of data, there is three functions (init/finalize/get), that
179 * used with comm_element structure
180 */
181extern void init_cache_write_request(struct cache_write_request *);
182extern void finalize_cache_write_request(struct cache_write_request *);
183extern struct cache_write_request *get_cache_write_request(
184	struct comm_element *);
185
186extern void init_cache_write_response(struct cache_write_response *);
187extern void finalize_cache_write_response(struct cache_write_response *);
188extern struct cache_write_response *get_cache_write_response(
189	struct comm_element *);
190
191extern void init_cache_read_request(struct cache_read_request *);
192extern void finalize_cache_read_request(struct cache_read_request *);
193extern struct cache_read_request *get_cache_read_request(
194	struct comm_element *);
195
196extern void init_cache_read_response(struct cache_read_response *);
197extern void finalize_cache_read_response(struct cache_read_response *);
198extern struct cache_read_response *get_cache_read_response(
199	struct comm_element *);
200
201extern void init_cache_transform_request(struct cache_transform_request *);
202extern void finalize_cache_transform_request(struct cache_transform_request *);
203extern struct cache_transform_request *get_cache_transform_request(
204	struct comm_element *);
205
206extern void init_cache_transform_response(struct cache_transform_response *);
207extern void finalize_cache_transform_response(
208	struct cache_transform_response *);
209extern struct cache_transform_response *get_cache_transform_response(
210	struct comm_element *);
211
212extern void init_cache_mp_write_session_request(
213	struct cache_mp_write_session_request *);
214extern void finalize_cache_mp_write_session_request(
215	struct cache_mp_write_session_request *);
216extern struct cache_mp_write_session_request *
217    	get_cache_mp_write_session_request(
218	struct comm_element *);
219
220extern void init_cache_mp_write_session_response(
221	struct cache_mp_write_session_response *);
222extern void finalize_cache_mp_write_session_response(
223	struct cache_mp_write_session_response *);
224extern struct cache_mp_write_session_response *
225	get_cache_mp_write_session_response(struct comm_element *);
226
227extern void init_cache_mp_write_session_write_request(
228	struct cache_mp_write_session_write_request *);
229extern void finalize_cache_mp_write_session_write_request(
230	struct cache_mp_write_session_write_request *);
231extern struct cache_mp_write_session_write_request *
232	get_cache_mp_write_session_write_request(struct comm_element *);
233
234extern void init_cache_mp_write_session_write_response(
235	struct cache_mp_write_session_write_response *);
236extern void finalize_cache_mp_write_session_write_response(
237	struct cache_mp_write_session_write_response *);
238extern struct cache_mp_write_session_write_response *
239	get_cache_mp_write_session_write_response(struct comm_element *);
240
241extern void init_cache_mp_read_session_request(
242	struct cache_mp_read_session_request *);
243extern void finalize_cache_mp_read_session_request(
244	struct cache_mp_read_session_request *);
245extern struct cache_mp_read_session_request *get_cache_mp_read_session_request(
246	struct comm_element *);
247
248extern void init_cache_mp_read_session_response(
249	struct cache_mp_read_session_response *);
250extern void finalize_cache_mp_read_session_response(
251	struct cache_mp_read_session_response *);
252extern struct cache_mp_read_session_response *
253    	get_cache_mp_read_session_response(
254	struct comm_element *);
255
256extern void init_cache_mp_read_session_read_response(
257	struct cache_mp_read_session_read_response *);
258extern void finalize_cache_mp_read_session_read_response(
259	struct cache_mp_read_session_read_response *);
260extern struct cache_mp_read_session_read_response *
261	get_cache_mp_read_session_read_response(struct comm_element *);
262
263#endif
264