1 /*
2    Unix SMB/CIFS implementation.
3 
4    Copyright (C) Stefan Metzmacher 2009
5 
6      ** NOTE! The following LGPL license applies to the tsocket
7      ** library. This does NOT imply that all of Samba is released
8      ** under the LGPL
9 
10    This library is free software; you can redistribute it and/or
11    modify it under the terms of the GNU Lesser General Public
12    License as published by the Free Software Foundation; either
13    version 3 of the License, or (at your option) any later version.
14 
15    This library is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    Lesser General Public License for more details.
19 
20    You should have received a copy of the GNU Lesser General Public
21    License along with this library; if not, see <http://www.gnu.org/licenses/>.
22 */
23 
24 #ifndef _TSOCKET_INTERNAL_H
25 #define _TSOCKET_INTERNAL_H
26 
27 #include <unistd.h>
28 #include <sys/uio.h>
29 
30 struct tsocket_address_ops {
31 	const char *name;
32 
33 	char *(*string)(const struct tsocket_address *addr,
34 			TALLOC_CTX *mem_ctx);
35 
36 	struct tsocket_address *(*copy)(const struct tsocket_address *addr,
37 					TALLOC_CTX *mem_ctx,
38 					const char *location);
39 };
40 
41 struct tsocket_address {
42 	const char *location;
43 	const struct tsocket_address_ops *ops;
44 
45 	void *private_data;
46 };
47 
48 struct tsocket_address *_tsocket_address_create(TALLOC_CTX *mem_ctx,
49 					const struct tsocket_address_ops *ops,
50 					void *pstate,
51 					size_t psize,
52 					const char *type,
53 					const char *location);
54 #define tsocket_address_create(mem_ctx, ops, state, type, location) \
55 	_tsocket_address_create(mem_ctx, ops, state, sizeof(type), \
56 				#type, location)
57 
58 struct tdgram_context_ops {
59 	const char *name;
60 
61 	struct tevent_req *(*recvfrom_send)(TALLOC_CTX *mem_ctx,
62 					    struct tevent_context *ev,
63 					    struct tdgram_context *dgram);
64 	ssize_t (*recvfrom_recv)(struct tevent_req *req,
65 				 int *perrno,
66 				 TALLOC_CTX *mem_ctx,
67 				 uint8_t **buf,
68 				 struct tsocket_address **src);
69 
70 	struct tevent_req *(*sendto_send)(TALLOC_CTX *mem_ctx,
71 					  struct tevent_context *ev,
72 					  struct tdgram_context *dgram,
73 					  const uint8_t *buf, size_t len,
74 					  const struct tsocket_address *dst);
75 	ssize_t (*sendto_recv)(struct tevent_req *req,
76 			       int *perrno);
77 
78 	struct tevent_req *(*disconnect_send)(TALLOC_CTX *mem_ctx,
79 					      struct tevent_context *ev,
80 					      struct tdgram_context *dgram);
81 	int (*disconnect_recv)(struct tevent_req *req,
82 			       int *perrno);
83 };
84 
85 struct tdgram_context *_tdgram_context_create(TALLOC_CTX *mem_ctx,
86 					const struct tdgram_context_ops *ops,
87 					void *pstate,
88 					size_t psize,
89 					const char *type,
90 					const char *location);
91 #define tdgram_context_create(mem_ctx, ops, state, type, location) \
92 	_tdgram_context_create(mem_ctx, ops, state, sizeof(type), \
93 				#type, location)
94 
95 void *_tdgram_context_data(struct tdgram_context *dgram);
96 #define tdgram_context_data(_req, _type) \
97 	talloc_get_type_abort(_tdgram_context_data(_req), _type)
98 
99 struct tstream_context_ops {
100 	const char *name;
101 
102 	ssize_t (*pending_bytes)(struct tstream_context *stream);
103 
104 	struct tevent_req *(*readv_send)(TALLOC_CTX *mem_ctx,
105 					 struct tevent_context *ev,
106 					 struct tstream_context *stream,
107 					 struct iovec *vector,
108 					 size_t count);
109 	int (*readv_recv)(struct tevent_req *req,
110 			  int *perrno);
111 
112 	struct tevent_req *(*writev_send)(TALLOC_CTX *mem_ctx,
113 					  struct tevent_context *ev,
114 					  struct tstream_context *stream,
115 					  const struct iovec *vector,
116 					  size_t count);
117 	int (*writev_recv)(struct tevent_req *req,
118 			   int *perrno);
119 
120 	struct tevent_req *(*disconnect_send)(TALLOC_CTX *mem_ctx,
121 					      struct tevent_context *ev,
122 					      struct tstream_context *stream);
123 	int (*disconnect_recv)(struct tevent_req *req,
124 			       int *perrno);
125 };
126 
127 struct tstream_context *_tstream_context_create(TALLOC_CTX *mem_ctx,
128 					const struct tstream_context_ops *ops,
129 					void *pstate,
130 					size_t psize,
131 					const char *type,
132 					const char *location);
133 #define tstream_context_create(mem_ctx, ops, state, type, location) \
134 	_tstream_context_create(mem_ctx, ops, state, sizeof(type), \
135 				#type, location)
136 
137 void *_tstream_context_data(struct tstream_context *stream);
138 #define tstream_context_data(_req, _type) \
139 	talloc_get_type_abort(_tstream_context_data(_req), _type)
140 
141 int tsocket_simple_int_recv(struct tevent_req *req, int *perrno);
142 
143 #endif /* _TSOCKET_H */
144 
145