[862] | 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_H
|
---|
| 25 | #define _TSOCKET_H
|
---|
| 26 |
|
---|
| 27 | #include <talloc.h>
|
---|
| 28 | #include <tevent.h>
|
---|
| 29 |
|
---|
| 30 | struct tsocket_address;
|
---|
| 31 | struct tdgram_context;
|
---|
| 32 | struct tstream_context;
|
---|
| 33 | struct iovec;
|
---|
| 34 |
|
---|
| 35 | /**
|
---|
| 36 | * @mainpage
|
---|
| 37 | *
|
---|
| 38 | * The tsocket abstraction is an API ...
|
---|
| 39 | */
|
---|
| 40 |
|
---|
| 41 | /**
|
---|
| 42 | * @defgroup tsocket The tsocket API
|
---|
| 43 | *
|
---|
| 44 | * The tsocket abstraction is split into two different kinds of
|
---|
| 45 | * communication interfaces.
|
---|
| 46 | *
|
---|
| 47 | * There's the "tstream_context" interface with abstracts the communication
|
---|
| 48 | * through a bidirectional byte stream between two endpoints.
|
---|
| 49 | *
|
---|
| 50 | * And there's the "tdgram_context" interface with abstracts datagram based
|
---|
| 51 | * communication between any number of endpoints.
|
---|
| 52 | *
|
---|
| 53 | * Both interfaces share the "tsocket_address" abstraction for endpoint
|
---|
| 54 | * addresses.
|
---|
| 55 | *
|
---|
| 56 | * The whole library is based on the talloc(3) and 'tevent' libraries and
|
---|
| 57 | * provides "tevent_req" based "foo_send()"/"foo_recv()" functions pairs for
|
---|
| 58 | * all abstracted methods that need to be async.
|
---|
| 59 | *
|
---|
| 60 | * @section vsock Virtual Sockets
|
---|
| 61 | *
|
---|
| 62 | * The abstracted layout of tdgram_context and tstream_context allow
|
---|
| 63 | * implementations around virtual sockets for encrypted tunnels (like TLS,
|
---|
| 64 | * SASL or GSSAPI) or named pipes over smb.
|
---|
| 65 | *
|
---|
| 66 | * @section npa Named Pipe Auth (NPA) Sockets
|
---|
| 67 | *
|
---|
| 68 | * Samba has an implementation to abstract named pipes over smb (within the
|
---|
| 69 | * server side). See libcli/named_pipe_auth/npa_tstream.[ch] for the core code.
|
---|
| 70 | * The current callers are located in source4/ntvfs/ipc/vfs_ipc.c and
|
---|
| 71 | * source4/rpc_server/service_rpc.c for the users.
|
---|
| 72 | */
|
---|
| 73 |
|
---|
| 74 | /**
|
---|
| 75 | * @defgroup tsocket_address The tsocket_address abstraction
|
---|
| 76 | * @ingroup tsocket
|
---|
| 77 | *
|
---|
| 78 | * The tsocket_address represents an socket endpoint genericly.
|
---|
| 79 | * As it's like an abstract class it has no specific constructor.
|
---|
| 80 | * The specific constructors are descripted in later sections.
|
---|
| 81 | *
|
---|
| 82 | * @{
|
---|
| 83 | */
|
---|
| 84 |
|
---|
| 85 | /**
|
---|
| 86 | * @brief Get a string representation of the endpoint.
|
---|
| 87 | *
|
---|
| 88 | * This function creates a string representation of the endpoint for debugging.
|
---|
| 89 | * The output will look as followed:
|
---|
| 90 | * prefix:address:port
|
---|
| 91 | *
|
---|
| 92 | * e.g.
|
---|
| 93 | * ipv4:192.168.1.1:143
|
---|
| 94 | *
|
---|
| 95 | * Callers should not try to parse the string! The should use additional methods
|
---|
| 96 | * of the specific tsocket_address implemention to get more details.
|
---|
| 97 | *
|
---|
| 98 | * @param[in] addr The address to convert.
|
---|
| 99 | *
|
---|
| 100 | * @param[in] mem_ctx The talloc memory context to allocate the memory.
|
---|
| 101 | *
|
---|
| 102 | * @return The address as a string representation, NULL on error.
|
---|
| 103 | *
|
---|
| 104 | * @see tsocket_address_is_inet()
|
---|
| 105 | * @see tsocket_address_inet_addr_string()
|
---|
| 106 | * @see tsocket_address_inet_port()
|
---|
| 107 | */
|
---|
| 108 | char *tsocket_address_string(const struct tsocket_address *addr,
|
---|
| 109 | TALLOC_CTX *mem_ctx);
|
---|
| 110 |
|
---|
| 111 | #ifdef DOXYGEN
|
---|
| 112 | /**
|
---|
| 113 | * @brief This creates a copy of a tsocket_address.
|
---|
| 114 | *
|
---|
| 115 | * This is useful when before doing modifications to a socket via additional
|
---|
| 116 | * methods of the specific tsocket_address implementation.
|
---|
| 117 | *
|
---|
| 118 | * @param[in] addr The address to create the copy from.
|
---|
| 119 | *
|
---|
| 120 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 121 | *
|
---|
| 122 | * @return A newly allocated copy of addr (tsocket_address *), NULL
|
---|
| 123 | * on error.
|
---|
| 124 | */
|
---|
| 125 | struct tsocket_address *tsocket_address_copy(const struct tsocket_address *addr,
|
---|
| 126 | TALLOC_CTX *mem_ctx);
|
---|
| 127 | #else
|
---|
| 128 | struct tsocket_address *_tsocket_address_copy(const struct tsocket_address *addr,
|
---|
| 129 | TALLOC_CTX *mem_ctx,
|
---|
| 130 | const char *location);
|
---|
| 131 |
|
---|
| 132 | #define tsocket_address_copy(addr, mem_ctx) \
|
---|
| 133 | _tsocket_address_copy(addr, mem_ctx, __location__)
|
---|
| 134 | #endif
|
---|
| 135 |
|
---|
| 136 | /**
|
---|
| 137 | * @}
|
---|
| 138 | */
|
---|
| 139 |
|
---|
| 140 | /**
|
---|
| 141 | * @defgroup tdgram_context The tdgram_context abstraction
|
---|
| 142 | * @ingroup tsocket
|
---|
| 143 | *
|
---|
| 144 | * The tdgram_context is like an abstract class for datagram based sockets. The
|
---|
| 145 | * interface provides async 'tevent_req' based functions on top functionality
|
---|
| 146 | * is similar to the recvfrom(2)/sendto(2)/close(2) syscalls.
|
---|
| 147 | *
|
---|
| 148 | * @note You can always use talloc_free(tdgram) to cleanup the resources
|
---|
| 149 | * of the tdgram_context on a fatal error.
|
---|
| 150 | * @{
|
---|
| 151 | */
|
---|
| 152 |
|
---|
| 153 | /**
|
---|
| 154 | * @brief Ask for next available datagram on the abstracted tdgram_context.
|
---|
| 155 | *
|
---|
| 156 | * It returns a 'tevent_req' handle, where the caller can register
|
---|
| 157 | * a callback with tevent_req_set_callback(). The callback is triggered
|
---|
| 158 | * when a datagram is available or an error happened.
|
---|
| 159 | *
|
---|
| 160 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 161 | *
|
---|
| 162 | * @param[in] ev The tevent_context to run on.
|
---|
| 163 | *
|
---|
| 164 | * @param[in] dgram The dgram context to work on.
|
---|
| 165 | *
|
---|
| 166 | * @return Returns a 'tevent_req' handle, where the caller can
|
---|
| 167 | * register a callback with tevent_req_set_callback().
|
---|
| 168 | * NULL on fatal error.
|
---|
| 169 | *
|
---|
| 170 | * @see tdgram_inet_udp_socket()
|
---|
| 171 | * @see tdgram_unix_socket()
|
---|
| 172 | */
|
---|
| 173 | struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx,
|
---|
| 174 | struct tevent_context *ev,
|
---|
| 175 | struct tdgram_context *dgram);
|
---|
| 176 |
|
---|
| 177 | /**
|
---|
| 178 | * @brief Receive the next available datagram on the abstracted tdgram_context.
|
---|
| 179 | *
|
---|
| 180 | * This function should be called by the callback when a datagram is available
|
---|
| 181 | * or an error happened.
|
---|
| 182 | *
|
---|
| 183 | * The caller can only have one outstanding tdgram_recvfrom_send() at a time
|
---|
| 184 | * otherwise the caller will get '*perrno = EBUSY'.
|
---|
| 185 | *
|
---|
| 186 | * @param[in] req The tevent request from tdgram_recvfrom_send().
|
---|
| 187 | *
|
---|
| 188 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 189 | *
|
---|
| 190 | * @param[in] mem_ctx The memory context to use.
|
---|
| 191 | *
|
---|
| 192 | * @param[out] buf This will hold the buffer of the datagram.
|
---|
| 193 | *
|
---|
| 194 | * @param[out] src The abstracted tsocket_address of the sender of the
|
---|
| 195 | * received datagram.
|
---|
| 196 | *
|
---|
| 197 | * @return The length of the datagram (0 is never returned!),
|
---|
| 198 | * -1 on error with perrno set to the actual errno.
|
---|
| 199 | *
|
---|
| 200 | * @see tdgram_recvfrom_send()
|
---|
| 201 | */
|
---|
| 202 | ssize_t tdgram_recvfrom_recv(struct tevent_req *req,
|
---|
| 203 | int *perrno,
|
---|
| 204 | TALLOC_CTX *mem_ctx,
|
---|
| 205 | uint8_t **buf,
|
---|
| 206 | struct tsocket_address **src);
|
---|
| 207 |
|
---|
| 208 | /**
|
---|
| 209 | * @brief Send a datagram to a destination endpoint.
|
---|
| 210 | *
|
---|
| 211 | * The function can be called to send a datagram (specified by a buf/len) to a
|
---|
| 212 | * destination endpoint (specified by dst). It's not allowed for len to be 0.
|
---|
| 213 | *
|
---|
| 214 | * It returns a 'tevent_req' handle, where the caller can register a callback
|
---|
| 215 | * with tevent_req_set_callback(). The callback is triggered when the specific
|
---|
| 216 | * implementation (assumes it) has delivered the datagram to the "wire".
|
---|
| 217 | *
|
---|
| 218 | * The callback is then supposed to get the result by calling
|
---|
| 219 | * tdgram_sendto_recv() on the 'tevent_req'.
|
---|
| 220 | *
|
---|
| 221 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 222 | *
|
---|
| 223 | * @param[in] ev The tevent_context to run on.
|
---|
| 224 | *
|
---|
| 225 | * @param[in] dgram The dgram context to work on.
|
---|
| 226 | *
|
---|
| 227 | * @param[in] buf The buffer to send.
|
---|
| 228 | *
|
---|
| 229 | * @param[in] len The length of the buffer to send. It has to be bigger
|
---|
| 230 | * than 0.
|
---|
| 231 | *
|
---|
| 232 | * @param[in] dst The destination to send the datagram to in form of a
|
---|
| 233 | * tsocket_address.
|
---|
| 234 | *
|
---|
| 235 | * @return Returns a 'tevent_req' handle, where the caller can
|
---|
| 236 | * register a callback with tevent_req_set_callback().
|
---|
| 237 | * NULL on fatal error.
|
---|
| 238 | *
|
---|
| 239 | * @see tdgram_inet_udp_socket()
|
---|
| 240 | * @see tdgram_unix_socket()
|
---|
| 241 | * @see tdgram_sendto_recv()
|
---|
| 242 | */
|
---|
| 243 | struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx,
|
---|
| 244 | struct tevent_context *ev,
|
---|
| 245 | struct tdgram_context *dgram,
|
---|
| 246 | const uint8_t *buf, size_t len,
|
---|
| 247 | const struct tsocket_address *dst);
|
---|
| 248 |
|
---|
| 249 | /**
|
---|
| 250 | * @brief Receive the result of the sent datagram.
|
---|
| 251 | *
|
---|
| 252 | * The caller can only have one outstanding tdgram_sendto_send() at a time
|
---|
| 253 | * otherwise the caller will get '*perrno = EBUSY'.
|
---|
| 254 | *
|
---|
| 255 | * @param[in] req The tevent request from tdgram_sendto_send().
|
---|
| 256 | *
|
---|
| 257 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 258 | *
|
---|
| 259 | * @return The length of the datagram (0 is never returned!), -1 on
|
---|
| 260 | * error with perrno set to the actual errno.
|
---|
| 261 | *
|
---|
| 262 | * @see tdgram_sendto_send()
|
---|
| 263 | */
|
---|
| 264 | ssize_t tdgram_sendto_recv(struct tevent_req *req,
|
---|
| 265 | int *perrno);
|
---|
| 266 |
|
---|
| 267 | /**
|
---|
| 268 | * @brief Shutdown/close an abstracted socket.
|
---|
| 269 | *
|
---|
| 270 | * It returns a 'tevent_req' handle, where the caller can register a callback
|
---|
| 271 | * with tevent_req_set_callback(). The callback is triggered when the specific
|
---|
| 272 | * implementation (assumes it) has delivered the datagram to the "wire".
|
---|
| 273 | *
|
---|
| 274 | * The callback is then supposed to get the result by calling
|
---|
| 275 | * tdgram_sendto_recv() on the 'tevent_req'.
|
---|
| 276 | *
|
---|
| 277 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 278 | *
|
---|
| 279 | * @param[in] ev The tevent_context to run on.
|
---|
| 280 | *
|
---|
| 281 | * @param[in] dgram The dgram context diconnect from.
|
---|
| 282 | *
|
---|
| 283 | * @return Returns a 'tevent_req' handle, where the caller can
|
---|
| 284 | * register a callback with tevent_req_set_callback().
|
---|
| 285 | * NULL on fatal error.
|
---|
| 286 | *
|
---|
| 287 | * @see tdgram_disconnect_recv()
|
---|
| 288 | */
|
---|
| 289 | struct tevent_req *tdgram_disconnect_send(TALLOC_CTX *mem_ctx,
|
---|
| 290 | struct tevent_context *ev,
|
---|
| 291 | struct tdgram_context *dgram);
|
---|
| 292 |
|
---|
| 293 | /**
|
---|
| 294 | * @brief Receive the result from a tdgram_disconnect_send() request.
|
---|
| 295 | *
|
---|
| 296 | * The caller should make sure there're no outstanding tdgram_recvfrom_send()
|
---|
| 297 | * and tdgram_sendto_send() calls otherwise the caller will get
|
---|
| 298 | * '*perrno = EBUSY'.
|
---|
| 299 | *
|
---|
| 300 | * @param[in] req The tevent request from tdgram_disconnect_send().
|
---|
| 301 | *
|
---|
| 302 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 303 | *
|
---|
| 304 | * @return The length of the datagram (0 is never returned!), -1 on
|
---|
| 305 | * error with perrno set to the actual errno.
|
---|
| 306 | *
|
---|
| 307 | * @see tdgram_disconnect_send()
|
---|
| 308 | */
|
---|
| 309 | int tdgram_disconnect_recv(struct tevent_req *req,
|
---|
| 310 | int *perrno);
|
---|
| 311 |
|
---|
| 312 | /**
|
---|
| 313 | * @}
|
---|
| 314 | */
|
---|
| 315 |
|
---|
| 316 | /**
|
---|
| 317 | * @defgroup tstream_context The tstream_context abstraction
|
---|
| 318 | * @ingroup tsocket
|
---|
| 319 | *
|
---|
| 320 | * The tstream_context is like an abstract class for stream based sockets. The
|
---|
| 321 | * interface provides async 'tevent_req' based functions on top functionality
|
---|
| 322 | * is similar to the readv(2)/writev(2)/close(2) syscalls.
|
---|
| 323 | *
|
---|
| 324 | * @note You can always use talloc_free(tstream) to cleanup the resources
|
---|
| 325 | * of the tstream_context on a fatal error.
|
---|
| 326 | *
|
---|
| 327 | * @{
|
---|
| 328 | */
|
---|
| 329 |
|
---|
| 330 | /**
|
---|
| 331 | * @brief Report the number of bytes received but not consumed yet.
|
---|
| 332 | *
|
---|
| 333 | * The tstream_pending_bytes() function reports how much bytes of the incoming
|
---|
| 334 | * stream have been received but not consumed yet.
|
---|
| 335 | *
|
---|
| 336 | * @param[in] stream The tstream_context to check for pending bytes.
|
---|
| 337 | *
|
---|
| 338 | * @return The number of bytes received, -1 on error with errno
|
---|
| 339 | * set.
|
---|
| 340 | */
|
---|
| 341 | ssize_t tstream_pending_bytes(struct tstream_context *stream);
|
---|
| 342 |
|
---|
| 343 | /**
|
---|
| 344 | * @brief Read a specific amount of bytes from a stream socket.
|
---|
| 345 | *
|
---|
| 346 | * The function can be called to read for a specific amount of bytes from the
|
---|
| 347 | * stream into given buffers. The caller has to preallocate the buffers.
|
---|
| 348 | *
|
---|
| 349 | * The caller might need to use tstream_pending_bytes() if the protocol doesn't
|
---|
| 350 | * have a fixed pdu header containing the pdu size.
|
---|
| 351 | *
|
---|
| 352 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 353 | *
|
---|
| 354 | * @param[in] ev The tevent_context to run on.
|
---|
| 355 | *
|
---|
| 356 | * @param[in] stream The tstream context to work on.
|
---|
| 357 | *
|
---|
| 358 | * @param[out] vector A preallocated iovec to store the data to read.
|
---|
| 359 | *
|
---|
| 360 | * @param[in] count The number of buffers in the vector allocated.
|
---|
| 361 | *
|
---|
| 362 | * @return A 'tevent_req' handle, where the caller can register
|
---|
| 363 | * a callback with tevent_req_set_callback(). NULL on
|
---|
| 364 | * fatal error.
|
---|
| 365 | *
|
---|
| 366 | * @see tstream_unix_connect_send()
|
---|
| 367 | * @see tstream_inet_tcp_connect_send()
|
---|
| 368 | */
|
---|
| 369 | struct tevent_req *tstream_readv_send(TALLOC_CTX *mem_ctx,
|
---|
| 370 | struct tevent_context *ev,
|
---|
| 371 | struct tstream_context *stream,
|
---|
| 372 | struct iovec *vector,
|
---|
| 373 | size_t count);
|
---|
| 374 |
|
---|
| 375 | /**
|
---|
| 376 | * @brief Get the result of a tstream_readv_send().
|
---|
| 377 | *
|
---|
| 378 | * The caller can only have one outstanding tstream_readv_send()
|
---|
| 379 | * at a time otherwise the caller will get *perrno = EBUSY.
|
---|
| 380 | *
|
---|
| 381 | * @param[in] req The tevent request from tstream_readv_send().
|
---|
| 382 | *
|
---|
| 383 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 384 | *
|
---|
| 385 | * @return The length of the stream (0 is never returned!), -1 on
|
---|
| 386 | * error with perrno set to the actual errno.
|
---|
| 387 | */
|
---|
| 388 | int tstream_readv_recv(struct tevent_req *req,
|
---|
| 389 | int *perrno);
|
---|
| 390 |
|
---|
| 391 | /**
|
---|
| 392 | * @brief Write buffers from a vector into a stream socket.
|
---|
| 393 | *
|
---|
| 394 | * The function can be called to write buffers from a given vector
|
---|
| 395 | * to a stream socket.
|
---|
| 396 | *
|
---|
| 397 | * You have to ensure that the vector is not empty.
|
---|
| 398 | *
|
---|
| 399 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 400 | *
|
---|
| 401 | * @param[in] ev The tevent_context to run on.
|
---|
| 402 | *
|
---|
| 403 | * @param[in] stream The tstream context to work on.
|
---|
| 404 | *
|
---|
| 405 | * @param[in] vector The iovec vector with data to write on a stream socket.
|
---|
| 406 | *
|
---|
| 407 | * @param[in] count The number of buffers in the vector to write.
|
---|
| 408 | *
|
---|
| 409 | * @return A 'tevent_req' handle, where the caller can register
|
---|
| 410 | * a callback with tevent_req_set_callback(). NULL on
|
---|
| 411 | * fatal error.
|
---|
| 412 | */
|
---|
| 413 | struct tevent_req *tstream_writev_send(TALLOC_CTX *mem_ctx,
|
---|
| 414 | struct tevent_context *ev,
|
---|
| 415 | struct tstream_context *stream,
|
---|
| 416 | const struct iovec *vector,
|
---|
| 417 | size_t count);
|
---|
| 418 |
|
---|
| 419 | /**
|
---|
| 420 | * @brief Get the result of a tstream_writev_send().
|
---|
| 421 | *
|
---|
| 422 | * The caller can only have one outstanding tstream_writev_send()
|
---|
| 423 | * at a time otherwise the caller will get *perrno = EBUSY.
|
---|
| 424 | *
|
---|
| 425 | * @param[in] req The tevent request from tstream_writev_send().
|
---|
| 426 | *
|
---|
| 427 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 428 | *
|
---|
| 429 | * @return The length of the stream (0 is never returned!), -1 on
|
---|
| 430 | * error with perrno set to the actual errno.
|
---|
| 431 | */
|
---|
| 432 | int tstream_writev_recv(struct tevent_req *req,
|
---|
| 433 | int *perrno);
|
---|
| 434 |
|
---|
| 435 | /**
|
---|
| 436 | * @brief Shutdown/close an abstracted socket.
|
---|
| 437 | *
|
---|
| 438 | * It returns a 'tevent_req' handle, where the caller can register a callback
|
---|
| 439 | * with tevent_req_set_callback(). The callback is triggered when the specific
|
---|
| 440 | * implementation (assumes it) has delivered the stream to the "wire".
|
---|
| 441 | *
|
---|
| 442 | * The callback is then supposed to get the result by calling
|
---|
| 443 | * tdgram_sendto_recv() on the 'tevent_req'.
|
---|
| 444 | *
|
---|
| 445 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 446 | *
|
---|
| 447 | * @param[in] ev The tevent_context to run on.
|
---|
| 448 | *
|
---|
| 449 | * @param[in] stream The tstream context to work on.
|
---|
| 450 | *
|
---|
| 451 | * @return A 'tevent_req' handle, where the caller can register
|
---|
| 452 | * a callback with tevent_req_set_callback(). NULL on
|
---|
| 453 | * fatal error.
|
---|
| 454 | */
|
---|
| 455 | struct tevent_req *tstream_disconnect_send(TALLOC_CTX *mem_ctx,
|
---|
| 456 | struct tevent_context *ev,
|
---|
| 457 | struct tstream_context *stream);
|
---|
| 458 |
|
---|
| 459 | /**
|
---|
| 460 | * @brief Get the result of a tstream_disconnect_send().
|
---|
| 461 | *
|
---|
| 462 | * The caller can only have one outstanding tstream_writev_send()
|
---|
| 463 | * at a time otherwise the caller will get *perrno = EBUSY.
|
---|
| 464 | *
|
---|
| 465 | * @param[in] req The tevent request from tstream_disconnect_send().
|
---|
| 466 | *
|
---|
| 467 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 468 | *
|
---|
| 469 | * @return The length of the stream (0 is never returned!), -1 on
|
---|
| 470 | * error with perrno set to the actual errno.
|
---|
| 471 | */
|
---|
| 472 | int tstream_disconnect_recv(struct tevent_req *req,
|
---|
| 473 | int *perrno);
|
---|
| 474 |
|
---|
| 475 | /**
|
---|
| 476 | * @}
|
---|
| 477 | */
|
---|
| 478 |
|
---|
| 479 |
|
---|
| 480 | /**
|
---|
| 481 | * @defgroup tsocket_bsd tsocket_bsd - inet, inet6 and unix
|
---|
| 482 | * @ingroup tsocket
|
---|
| 483 | *
|
---|
| 484 | * The main tsocket library comes with implentations for BSD style ipv4, ipv6
|
---|
| 485 | * and unix sockets.
|
---|
| 486 | *
|
---|
| 487 | * @{
|
---|
| 488 | */
|
---|
| 489 |
|
---|
| 490 | /**
|
---|
| 491 | * @brief Find out if the tsocket_address represents an ipv4 or ipv6 endpoint.
|
---|
| 492 | *
|
---|
| 493 | * @param[in] addr The tsocket_address pointer
|
---|
| 494 | *
|
---|
| 495 | * @param[in] fam The family can be can be "ipv4", "ipv6" or "ip". With
|
---|
| 496 | * "ip" is autodetects "ipv4" or "ipv6" based on the
|
---|
| 497 | * addr.
|
---|
| 498 | *
|
---|
| 499 | * @return true if addr represents an address of the given family,
|
---|
| 500 | * otherwise false.
|
---|
| 501 | */
|
---|
| 502 | bool tsocket_address_is_inet(const struct tsocket_address *addr, const char *fam);
|
---|
| 503 |
|
---|
| 504 | #if DOXYGEN
|
---|
| 505 | /**
|
---|
| 506 | * @brief Create a tsocket_address for ipv4 and ipv6 endpoint addresses.
|
---|
| 507 | *
|
---|
| 508 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 509 | *
|
---|
| 510 | * @param[in] fam The family can be can be "ipv4", "ipv6" or "ip". With
|
---|
| 511 | * "ip" is autodetects "ipv4" or "ipv6" based on the
|
---|
| 512 | * addr.
|
---|
| 513 | *
|
---|
| 514 | * @param[in] addr A valid ip address string based on the selected family
|
---|
| 515 | * (dns names are not allowed!). It's valid to pass NULL,
|
---|
| 516 | * which gets mapped to "0.0.0.0" or "::".
|
---|
| 517 | *
|
---|
| 518 | * @param[in] port A valid port number.
|
---|
| 519 | *
|
---|
| 520 | * @param[out] _addr A tsocket_address pointer to store the information.
|
---|
| 521 | *
|
---|
| 522 | * @return 0 on success, -1 on error with errno set.
|
---|
| 523 | */
|
---|
| 524 | int tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
|
---|
| 525 | const char *fam,
|
---|
| 526 | const char *addr,
|
---|
| 527 | uint16_t port,
|
---|
| 528 | struct tsocket_address **_addr);
|
---|
| 529 | #else
|
---|
| 530 | int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
|
---|
| 531 | const char *fam,
|
---|
| 532 | const char *addr,
|
---|
| 533 | uint16_t port,
|
---|
| 534 | struct tsocket_address **_addr,
|
---|
| 535 | const char *location);
|
---|
| 536 |
|
---|
| 537 | #define tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr) \
|
---|
| 538 | _tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr, \
|
---|
| 539 | __location__)
|
---|
| 540 | #endif
|
---|
| 541 |
|
---|
| 542 | /**
|
---|
| 543 | * @brief Get the address of an 'inet' tsocket_address as a string.
|
---|
| 544 | *
|
---|
| 545 | * @param[in] addr The address to convert to a string.
|
---|
| 546 | *
|
---|
| 547 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 548 | *
|
---|
| 549 | * @return A newly allocated string of the address, NULL on error
|
---|
| 550 | * with errno set.
|
---|
| 551 | *
|
---|
| 552 | * @see tsocket_address_is_inet()
|
---|
| 553 | */
|
---|
| 554 | char *tsocket_address_inet_addr_string(const struct tsocket_address *addr,
|
---|
| 555 | TALLOC_CTX *mem_ctx);
|
---|
| 556 |
|
---|
| 557 | /**
|
---|
| 558 | * @brief Get the port number as an integer from an 'inet' tsocket_address.
|
---|
| 559 | *
|
---|
| 560 | * @param[in] addr The tsocket address to use.
|
---|
| 561 | *
|
---|
| 562 | * @return The port number, 0 on error with errno set.
|
---|
| 563 | */
|
---|
| 564 | uint16_t tsocket_address_inet_port(const struct tsocket_address *addr);
|
---|
| 565 |
|
---|
| 566 | /**
|
---|
| 567 | * @brief Set the port number of an existing 'inet' tsocket_address.
|
---|
| 568 | *
|
---|
| 569 | * @param[in] addr The existing tsocket_address to use.
|
---|
| 570 | *
|
---|
| 571 | * @param[in] port The valid port number to set.
|
---|
| 572 | *
|
---|
| 573 | * @return 0 on success, -1 on error with errno set.
|
---|
| 574 | */
|
---|
| 575 | int tsocket_address_inet_set_port(struct tsocket_address *addr,
|
---|
| 576 | uint16_t port);
|
---|
| 577 |
|
---|
| 578 | /**
|
---|
| 579 | * @brief Find out if the tsocket_address represents an unix domain endpoint.
|
---|
| 580 | *
|
---|
| 581 | * @param[in] addr The tsocket_address pointer
|
---|
| 582 | *
|
---|
| 583 | * @return true if addr represents an unix domain endpoint,
|
---|
| 584 | * otherwise false.
|
---|
| 585 | */
|
---|
| 586 | bool tsocket_address_is_unix(const struct tsocket_address *addr);
|
---|
| 587 |
|
---|
| 588 | #ifdef DOXYGEN
|
---|
| 589 | /**
|
---|
| 590 | * @brief Create a tsocket_address for a unix domain endpoint addresses.
|
---|
| 591 | *
|
---|
| 592 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 593 | *
|
---|
| 594 | * @param[in] path The filesystem path, NULL will map "".
|
---|
| 595 | *
|
---|
| 596 | * @param[in] _addr The tsocket_address pointer to store the information.
|
---|
| 597 | *
|
---|
| 598 | * @return 0 on success, -1 on error with errno set.
|
---|
| 599 | *
|
---|
| 600 | * @see tsocket_address_is_unix()
|
---|
| 601 | */
|
---|
| 602 | int tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx,
|
---|
| 603 | const char *path,
|
---|
| 604 | struct tsocket_address **_addr);
|
---|
| 605 | #else
|
---|
| 606 | int _tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx,
|
---|
| 607 | const char *path,
|
---|
| 608 | struct tsocket_address **_addr,
|
---|
| 609 | const char *location);
|
---|
| 610 |
|
---|
| 611 | #define tsocket_address_unix_from_path(mem_ctx, path, _addr) \
|
---|
| 612 | _tsocket_address_unix_from_path(mem_ctx, path, _addr, \
|
---|
| 613 | __location__)
|
---|
| 614 | #endif
|
---|
| 615 |
|
---|
| 616 | /**
|
---|
| 617 | * @brief Get the address of an 'unix' tsocket_address.
|
---|
| 618 | *
|
---|
| 619 | * @param[in] addr A valid 'unix' tsocket_address.
|
---|
| 620 | *
|
---|
| 621 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 622 | *
|
---|
| 623 | * @return The path of the unix domain socket, NULL on error or if
|
---|
| 624 | * the tsocket_address doesn't represent an unix domain
|
---|
| 625 | * endpoint path.
|
---|
| 626 | */
|
---|
| 627 | char *tsocket_address_unix_path(const struct tsocket_address *addr,
|
---|
| 628 | TALLOC_CTX *mem_ctx);
|
---|
| 629 |
|
---|
| 630 | /**
|
---|
| 631 | * @brief Request a syscall optimization for tdgram_recvfrom_send()
|
---|
| 632 | *
|
---|
| 633 | * This function is only used to reduce the amount of syscalls and
|
---|
| 634 | * optimize performance. You should only use this if you know
|
---|
| 635 | * what you're doing.
|
---|
| 636 | *
|
---|
| 637 | * The optimization is off by default.
|
---|
| 638 | *
|
---|
| 639 | * @param[in] dgram The tdgram_context of a bsd socket, if this
|
---|
| 640 | * not a bsd socket the function does nothing.
|
---|
| 641 | *
|
---|
| 642 | * @param[in] on The boolean value to turn the optimization on and off.
|
---|
| 643 | *
|
---|
| 644 | * @return The old boolean value.
|
---|
| 645 | *
|
---|
| 646 | * @see tdgram_recvfrom_send()
|
---|
| 647 | */
|
---|
| 648 | bool tdgram_bsd_optimize_recvfrom(struct tdgram_context *dgram,
|
---|
| 649 | bool on);
|
---|
| 650 |
|
---|
| 651 | #ifdef DOXYGEN
|
---|
| 652 | /**
|
---|
| 653 | * @brief Create a tdgram_context for a ipv4 or ipv6 UDP communication.
|
---|
| 654 | *
|
---|
| 655 | * @param[in] local An 'inet' tsocket_address for the local endpoint.
|
---|
| 656 | *
|
---|
| 657 | * @param[in] remote An 'inet' tsocket_address for the remote endpoint or
|
---|
| 658 | * NULL (??? to create a listener?).
|
---|
| 659 | *
|
---|
| 660 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 661 | *
|
---|
| 662 | * @param[in] dgram The tdgram_context pointer to setup the udp
|
---|
| 663 | * communication. The function will allocate the memory.
|
---|
| 664 | *
|
---|
| 665 | * @return 0 on success, -1 on error with errno set.
|
---|
| 666 | */
|
---|
| 667 | int tdgram_inet_udp_socket(const struct tsocket_address *local,
|
---|
| 668 | const struct tsocket_address *remote,
|
---|
| 669 | TALLOC_CTX *mem_ctx,
|
---|
| 670 | struct tdgram_context **dgram);
|
---|
| 671 | #else
|
---|
| 672 | int _tdgram_inet_udp_socket(const struct tsocket_address *local,
|
---|
| 673 | const struct tsocket_address *remote,
|
---|
| 674 | TALLOC_CTX *mem_ctx,
|
---|
| 675 | struct tdgram_context **dgram,
|
---|
| 676 | const char *location);
|
---|
| 677 | #define tdgram_inet_udp_socket(local, remote, mem_ctx, dgram) \
|
---|
| 678 | _tdgram_inet_udp_socket(local, remote, mem_ctx, dgram, __location__)
|
---|
| 679 | #endif
|
---|
| 680 |
|
---|
| 681 | #ifdef DOXYGEN
|
---|
| 682 | /**
|
---|
| 683 | * @brief Create a tdgram_context for unix domain datagram communication.
|
---|
| 684 | *
|
---|
| 685 | * @param[in] local An 'unix' tsocket_address for the local endpoint.
|
---|
| 686 | *
|
---|
| 687 | * @param[in] remote An 'unix' tsocket_address for the remote endpoint or
|
---|
| 688 | * NULL (??? to create a listener?).
|
---|
| 689 | *
|
---|
| 690 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 691 | *
|
---|
| 692 | * @param[in] dgram The tdgram_context pointer to setup the udp
|
---|
| 693 | * communication. The function will allocate the memory.
|
---|
| 694 | *
|
---|
| 695 | * @return 0 on success, -1 on error with errno set.
|
---|
| 696 | */
|
---|
| 697 | int tdgram_unix_socket(const struct tsocket_address *local,
|
---|
| 698 | const struct tsocket_address *remote,
|
---|
| 699 | TALLOC_CTX *mem_ctx,
|
---|
| 700 | struct tdgram_context **dgram);
|
---|
| 701 | #else
|
---|
| 702 | int _tdgram_unix_socket(const struct tsocket_address *local,
|
---|
| 703 | const struct tsocket_address *remote,
|
---|
| 704 | TALLOC_CTX *mem_ctx,
|
---|
| 705 | struct tdgram_context **dgram,
|
---|
| 706 | const char *location);
|
---|
| 707 |
|
---|
| 708 | #define tdgram_unix_socket(local, remote, mem_ctx, dgram) \
|
---|
| 709 | _tdgram_unix_socket(local, remote, mem_ctx, dgram, __location__)
|
---|
| 710 | #endif
|
---|
| 711 |
|
---|
| 712 | /**
|
---|
| 713 | * @brief Request a syscall optimization for tstream_readv_send()
|
---|
| 714 | *
|
---|
| 715 | * This function is only used to reduce the amount of syscalls and
|
---|
| 716 | * optimize performance. You should only use this if you know
|
---|
| 717 | * what you're doing.
|
---|
| 718 | *
|
---|
| 719 | * The optimization is off by default.
|
---|
| 720 | *
|
---|
| 721 | * @param[in] stream The tstream_context of a bsd socket, if this
|
---|
| 722 | * not a bsd socket the function does nothing.
|
---|
| 723 | *
|
---|
| 724 | * @param[in] on The boolean value to turn the optimization on and off.
|
---|
| 725 | *
|
---|
| 726 | * @return The old boolean value.
|
---|
| 727 | *
|
---|
| 728 | * @see tstream_readv_send()
|
---|
| 729 | */
|
---|
| 730 | bool tstream_bsd_optimize_readv(struct tstream_context *stream,
|
---|
| 731 | bool on);
|
---|
| 732 |
|
---|
| 733 | /**
|
---|
| 734 | * @brief Connect async to a TCP endpoint and create a tstream_context for the
|
---|
| 735 | * stream based communication.
|
---|
| 736 | *
|
---|
| 737 | * Use this function to connenct asynchronously to a remote ipv4 or ipv6 TCP
|
---|
| 738 | * endpoint and create a tstream_context for the stream based communication.
|
---|
| 739 | *
|
---|
| 740 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 741 | *
|
---|
| 742 | * @param[in] ev The tevent_context to run on.
|
---|
| 743 | *
|
---|
| 744 | * @param[in] local An 'inet' tsocket_address for the local endpoint.
|
---|
| 745 | *
|
---|
| 746 | * @param[in] remote An 'inet' tsocket_address for the remote endpoint.
|
---|
| 747 | *
|
---|
| 748 | * @return A 'tevent_req' handle, where the caller can register a
|
---|
| 749 | * callback with tevent_req_set_callback(). NULL on a fatal
|
---|
| 750 | * error.
|
---|
| 751 | *
|
---|
| 752 | * @see tstream_inet_tcp_connect_recv()
|
---|
| 753 | */
|
---|
| 754 | struct tevent_req *tstream_inet_tcp_connect_send(TALLOC_CTX *mem_ctx,
|
---|
| 755 | struct tevent_context *ev,
|
---|
| 756 | const struct tsocket_address *local,
|
---|
| 757 | const struct tsocket_address *remote);
|
---|
| 758 |
|
---|
| 759 | #ifdef DOXYGEN
|
---|
| 760 | /**
|
---|
| 761 | * @brief Receive the result from a tstream_inet_tcp_connect_send().
|
---|
| 762 | *
|
---|
| 763 | * @param[in] req The tevent request from tstream_inet_tcp_connect_send().
|
---|
| 764 | *
|
---|
| 765 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 766 | *
|
---|
| 767 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 768 | *
|
---|
| 769 | * @param[out] stream A tstream_context pointer to setup the tcp communication
|
---|
| 770 | * on. This function will allocate the memory.
|
---|
| 771 | *
|
---|
| 772 | * @param[out] local The real 'inet' tsocket_address of the local endpoint.
|
---|
| 773 | * This parameter is optional and can be NULL.
|
---|
| 774 | *
|
---|
| 775 | * @return 0 on success, -1 on error with perrno set.
|
---|
| 776 | */
|
---|
| 777 | int tstream_inet_tcp_connect_recv(struct tevent_req *req,
|
---|
| 778 | int *perrno,
|
---|
| 779 | TALLOC_CTX *mem_ctx,
|
---|
| 780 | struct tstream_context **stream,
|
---|
| 781 | struct tsocket_address **local)
|
---|
| 782 | #else
|
---|
| 783 | int _tstream_inet_tcp_connect_recv(struct tevent_req *req,
|
---|
| 784 | int *perrno,
|
---|
| 785 | TALLOC_CTX *mem_ctx,
|
---|
| 786 | struct tstream_context **stream,
|
---|
| 787 | struct tsocket_address **local,
|
---|
| 788 | const char *location);
|
---|
| 789 | #define tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local) \
|
---|
| 790 | _tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local, \
|
---|
| 791 | __location__)
|
---|
| 792 | #endif
|
---|
| 793 |
|
---|
| 794 | /**
|
---|
| 795 | * @brief Connect async to a unix domain endpoint and create a tstream_context
|
---|
| 796 | * for the stream based communication.
|
---|
| 797 | *
|
---|
| 798 | * Use this function to connenct asynchronously to a unix domainendpoint and
|
---|
| 799 | * create a tstream_context for the stream based communication.
|
---|
| 800 | *
|
---|
| 801 | * The callback is triggered when a socket is connected and ready for IO or an
|
---|
| 802 | * error happened.
|
---|
| 803 | *
|
---|
| 804 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 805 | *
|
---|
| 806 | * @param[in] ev The tevent_context to run on.
|
---|
| 807 | *
|
---|
| 808 | * @param[in] local An 'unix' tsocket_address for the local endpoint.
|
---|
| 809 | *
|
---|
| 810 | * @param[in] remote An 'unix' tsocket_address for the remote endpoint.
|
---|
| 811 | *
|
---|
| 812 | * @return A 'tevent_req' handle, where the caller can register a
|
---|
| 813 | * callback with tevent_req_set_callback(). NULL on a falal
|
---|
| 814 | * error.
|
---|
| 815 | *
|
---|
| 816 | * @see tstream_unix_connect_recv()
|
---|
| 817 | */
|
---|
| 818 | struct tevent_req * tstream_unix_connect_send(TALLOC_CTX *mem_ctx,
|
---|
| 819 | struct tevent_context *ev,
|
---|
| 820 | const struct tsocket_address *local,
|
---|
| 821 | const struct tsocket_address *remote);
|
---|
| 822 |
|
---|
| 823 | #ifdef DOXYGEN
|
---|
| 824 | /**
|
---|
| 825 | * @brief Receive the result from a tstream_unix_connect_send().
|
---|
| 826 | *
|
---|
| 827 | * @param[in] req The tevent request from tstream_inet_tcp_connect_send().
|
---|
| 828 | *
|
---|
| 829 | * @param[out] perrno The error number, set if an error occurred.
|
---|
| 830 | *
|
---|
| 831 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 832 | *
|
---|
| 833 | * @param[in] stream The tstream context to work on.
|
---|
| 834 | *
|
---|
| 835 | * @return 0 on success, -1 on error with perrno set.
|
---|
| 836 | */
|
---|
| 837 | int tstream_unix_connect_recv(struct tevent_req *req,
|
---|
| 838 | int *perrno,
|
---|
| 839 | TALLOC_CTX *mem_ctx,
|
---|
| 840 | struct tstream_context **stream);
|
---|
| 841 | #else
|
---|
| 842 | int _tstream_unix_connect_recv(struct tevent_req *req,
|
---|
| 843 | int *perrno,
|
---|
| 844 | TALLOC_CTX *mem_ctx,
|
---|
| 845 | struct tstream_context **stream,
|
---|
| 846 | const char *location);
|
---|
| 847 | #define tstream_unix_connect_recv(req, perrno, mem_ctx, stream) \
|
---|
| 848 | _tstream_unix_connect_recv(req, perrno, mem_ctx, stream, \
|
---|
| 849 | __location__)
|
---|
| 850 | #endif
|
---|
| 851 |
|
---|
| 852 | #ifdef DOXYGEN
|
---|
| 853 | /**
|
---|
| 854 | * @brief Create two connected 'unix' tsocket_contexts for stream based
|
---|
| 855 | * communication.
|
---|
| 856 | *
|
---|
| 857 | * @param[in] mem_ctx1 The talloc memory context to use for stream1.
|
---|
| 858 | *
|
---|
| 859 | * @param[in] stream1 The first stream to connect.
|
---|
| 860 | *
|
---|
| 861 | * @param[in] mem_ctx2 The talloc memory context to use for stream2.
|
---|
| 862 | *
|
---|
| 863 | * @param[in] stream2 The second stream to connect.
|
---|
| 864 | *
|
---|
| 865 | * @return 0 on success, -1 on error with errno set.
|
---|
| 866 | */
|
---|
| 867 | int tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
|
---|
| 868 | struct tstream_context **stream1,
|
---|
| 869 | TALLOC_CTX *mem_ctx2,
|
---|
| 870 | struct tstream_context **stream2);
|
---|
| 871 | #else
|
---|
| 872 | int _tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
|
---|
| 873 | struct tstream_context **_stream1,
|
---|
| 874 | TALLOC_CTX *mem_ctx2,
|
---|
| 875 | struct tstream_context **_stream2,
|
---|
| 876 | const char *location);
|
---|
| 877 |
|
---|
| 878 | #define tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2) \
|
---|
| 879 | _tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2, \
|
---|
| 880 | __location__)
|
---|
| 881 | #endif
|
---|
| 882 |
|
---|
| 883 | struct sockaddr;
|
---|
| 884 |
|
---|
| 885 | #ifdef DOXYGEN
|
---|
| 886 | /**
|
---|
| 887 | * @brief Convert a tsocket address to a bsd socket address.
|
---|
| 888 | *
|
---|
| 889 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 890 | *
|
---|
| 891 | * @param[in] sa The sockaddr structure to convert.
|
---|
| 892 | *
|
---|
| 893 | * @param[in] sa_socklen The lenth of the sockaddr sturucte.
|
---|
| 894 | *
|
---|
| 895 | * @param[out] addr The tsocket pointer to allocate and fill.
|
---|
| 896 | *
|
---|
| 897 | * @return 0 on success, -1 on error with errno set.
|
---|
| 898 | */
|
---|
| 899 | int tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
---|
| 900 | struct sockaddr *sa,
|
---|
| 901 | size_t sa_socklen,
|
---|
| 902 | struct tsocket_address **addr);
|
---|
| 903 | #else
|
---|
| 904 | int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
|
---|
| 905 | struct sockaddr *sa,
|
---|
| 906 | size_t sa_socklen,
|
---|
| 907 | struct tsocket_address **_addr,
|
---|
| 908 | const char *location);
|
---|
| 909 |
|
---|
| 910 | #define tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr) \
|
---|
| 911 | _tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr, \
|
---|
| 912 | __location__)
|
---|
| 913 | #endif
|
---|
| 914 |
|
---|
| 915 | /**
|
---|
| 916 | * @brief Fill a bsd sockaddr structure.
|
---|
| 917 | *
|
---|
| 918 | * @param[in] addr The tsocket address structure to use.
|
---|
| 919 | *
|
---|
| 920 | * @param[in] sa The bsd sockaddr structure to fill out.
|
---|
| 921 | *
|
---|
| 922 | * @param[in] sa_socklen The length of the bsd sockaddr structure to fill out.
|
---|
| 923 | *
|
---|
| 924 | * @return The actual size of the sockaddr structure, -1 on error
|
---|
| 925 | * with errno set. The size could differ from sa_socklen.
|
---|
| 926 | *
|
---|
| 927 | * @code
|
---|
| 928 | * ssize_t socklen;
|
---|
| 929 | * struct sockaddr_storage ss;
|
---|
| 930 | *
|
---|
| 931 | * socklen = tsocket_address_bsd_sockaddr(taddr,
|
---|
| 932 | * (struct sockaddr *) &ss,
|
---|
| 933 | * sizeof(struct sockaddr_storage));
|
---|
| 934 | * if (socklen < 0) {
|
---|
| 935 | * return -1;
|
---|
| 936 | * }
|
---|
| 937 | * @endcode
|
---|
| 938 | */
|
---|
| 939 | ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
|
---|
| 940 | struct sockaddr *sa,
|
---|
| 941 | size_t sa_socklen);
|
---|
| 942 |
|
---|
| 943 | #ifdef DOXYGEN
|
---|
| 944 | /**
|
---|
| 945 | * @brief Wrap an existing file descriptors into the tstream abstraction.
|
---|
| 946 | *
|
---|
| 947 | * You can use this function to wrap an existing file descriptors into the
|
---|
| 948 | * tstream abstraction. After that you're not able to use this file descriptor
|
---|
| 949 | * for anything else. The file descriptor will be closed when the stream gets
|
---|
| 950 | * freed. If you still want to use the fd you have have to create a duplicate.
|
---|
| 951 | *
|
---|
| 952 | * @param[in] mem_ctx The talloc memory context to use.
|
---|
| 953 | *
|
---|
| 954 | * @param[in] fd The non blocking fd to use!
|
---|
| 955 | *
|
---|
| 956 | * @param[out] stream A pointer to store an allocated tstream_context.
|
---|
| 957 | *
|
---|
| 958 | * @return 0 on success, -1 on error.
|
---|
| 959 | *
|
---|
| 960 | * Example:
|
---|
| 961 | * @code
|
---|
| 962 | * fd2 = dup(fd);
|
---|
| 963 | * rc = tstream_bsd_existing_socket(mem_ctx, fd2, &tstream);
|
---|
| 964 | * if (rc < 0) {
|
---|
| 965 | * stream_terminate_connection(conn, "named_pipe_accept: out of memory");
|
---|
| 966 | * return;
|
---|
| 967 | * }
|
---|
| 968 | * @endcode
|
---|
| 969 | *
|
---|
| 970 | * @warning This is an internal function. You should read the code to fully
|
---|
| 971 | * understand it if you plan to use it.
|
---|
| 972 | */
|
---|
| 973 | int tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
|
---|
| 974 | int fd,
|
---|
| 975 | struct tstream_context **stream);
|
---|
| 976 | #else
|
---|
| 977 | int _tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
|
---|
| 978 | int fd,
|
---|
| 979 | struct tstream_context **_stream,
|
---|
| 980 | const char *location);
|
---|
| 981 | #define tstream_bsd_existing_socket(mem_ctx, fd, stream) \
|
---|
| 982 | _tstream_bsd_existing_socket(mem_ctx, fd, stream, \
|
---|
| 983 | __location__)
|
---|
| 984 | #endif
|
---|
| 985 |
|
---|
| 986 | /**
|
---|
| 987 | * @}
|
---|
| 988 | */
|
---|
| 989 |
|
---|
| 990 | /**
|
---|
| 991 | * @defgroup tsocket_helper Queue and PDU helpers
|
---|
| 992 | * @ingroup tsocket
|
---|
| 993 | *
|
---|
| 994 | * In order to make the live easier for callers which want to implement a
|
---|
| 995 | * function to receive a full PDU with a single async function pair, there're
|
---|
| 996 | * some helper functions.
|
---|
| 997 | *
|
---|
| 998 | * There're some cases where the caller wants doesn't care about the order of
|
---|
| 999 | * doing IO on the abstracted sockets.
|
---|
| 1000 | *
|
---|
| 1001 | * @{
|
---|
| 1002 | */
|
---|
| 1003 |
|
---|
| 1004 | /**
|
---|
| 1005 | * @brief Queue a dgram blob for sending through the socket.
|
---|
| 1006 | *
|
---|
| 1007 | * This function queues a blob for sending to destination through an existing
|
---|
| 1008 | * dgram socket. The async callback is triggered when the whole blob is
|
---|
| 1009 | * delivered to the underlying system socket.
|
---|
| 1010 | *
|
---|
| 1011 | * The caller needs to make sure that all non-scalar input parameters hang
|
---|
| 1012 | * around for the whole lifetime of the request.
|
---|
| 1013 | *
|
---|
| 1014 | * @param[in] mem_ctx The memory context for the result.
|
---|
| 1015 | *
|
---|
| 1016 | * @param[in] ev The event context the operation should work on.
|
---|
| 1017 | *
|
---|
| 1018 | * @param[in] dgram The tdgram_context to send the message buffer.
|
---|
| 1019 | *
|
---|
| 1020 | * @param[in] queue The existing dgram queue.
|
---|
| 1021 | *
|
---|
| 1022 | * @param[in] buf The message buffer to send.
|
---|
| 1023 | *
|
---|
| 1024 | * @param[in] len The message length.
|
---|
| 1025 | *
|
---|
| 1026 | * @param[in] dst The destination socket address.
|
---|
| 1027 | *
|
---|
| 1028 | * @return The async request handle. NULL on fatal error.
|
---|
| 1029 | *
|
---|
| 1030 | * @see tdgram_sendto_queue_recv()
|
---|
| 1031 | */
|
---|
| 1032 | struct tevent_req *tdgram_sendto_queue_send(TALLOC_CTX *mem_ctx,
|
---|
| 1033 | struct tevent_context *ev,
|
---|
| 1034 | struct tdgram_context *dgram,
|
---|
| 1035 | struct tevent_queue *queue,
|
---|
| 1036 | const uint8_t *buf,
|
---|
| 1037 | size_t len,
|
---|
| 1038 | struct tsocket_address *dst);
|
---|
| 1039 |
|
---|
| 1040 | /**
|
---|
| 1041 | * @brief Receive the result of the sent dgram blob.
|
---|
| 1042 | *
|
---|
| 1043 | * @param[in] req The tevent request from tdgram_sendto_queue_send().
|
---|
| 1044 | *
|
---|
| 1045 | * @param[out] perrno The error set to the actual errno.
|
---|
| 1046 | *
|
---|
| 1047 | * @return The length of the datagram (0 is never returned!), -1 on
|
---|
| 1048 | * error with perrno set to the actual errno.
|
---|
| 1049 | */
|
---|
| 1050 | ssize_t tdgram_sendto_queue_recv(struct tevent_req *req, int *perrno);
|
---|
| 1051 |
|
---|
| 1052 | typedef int (*tstream_readv_pdu_next_vector_t)(struct tstream_context *stream,
|
---|
| 1053 | void *private_data,
|
---|
| 1054 | TALLOC_CTX *mem_ctx,
|
---|
| 1055 | struct iovec **vector,
|
---|
| 1056 | size_t *count);
|
---|
| 1057 |
|
---|
| 1058 | struct tevent_req *tstream_readv_pdu_send(TALLOC_CTX *mem_ctx,
|
---|
| 1059 | struct tevent_context *ev,
|
---|
| 1060 | struct tstream_context *stream,
|
---|
| 1061 | tstream_readv_pdu_next_vector_t next_vector_fn,
|
---|
| 1062 | void *next_vector_private);
|
---|
| 1063 | int tstream_readv_pdu_recv(struct tevent_req *req, int *perrno);
|
---|
| 1064 |
|
---|
| 1065 | /**
|
---|
| 1066 | * @brief Queue a read request for a PDU on the socket.
|
---|
| 1067 | *
|
---|
| 1068 | * This function queues a read request for a PDU on a stream socket. The async
|
---|
| 1069 | * callback is triggered when a full PDU has been read from the socket.
|
---|
| 1070 | *
|
---|
| 1071 | * The caller needs to make sure that all non-scalar input parameters hang
|
---|
| 1072 | * around for the whole lifetime of the request.
|
---|
| 1073 | *
|
---|
| 1074 | * @param[in] mem_ctx The memory context for the result
|
---|
| 1075 | *
|
---|
| 1076 | * @param[in] ev The tevent_context to run on
|
---|
| 1077 | *
|
---|
| 1078 | * @param[in] stream The stream to send data through
|
---|
| 1079 | *
|
---|
| 1080 | * @param[in] queue The existing send queue
|
---|
| 1081 | *
|
---|
| 1082 | * @param[in] next_vector_fn The next vector function
|
---|
| 1083 | *
|
---|
| 1084 | * @param[in] next_vector_private The private_data of the next vector function
|
---|
| 1085 | *
|
---|
| 1086 | * @return The async request handle. NULL on fatal error.
|
---|
| 1087 | *
|
---|
| 1088 | * @see tstream_readv_pdu_queue_recv()
|
---|
| 1089 | */
|
---|
| 1090 | struct tevent_req *tstream_readv_pdu_queue_send(TALLOC_CTX *mem_ctx,
|
---|
| 1091 | struct tevent_context *ev,
|
---|
| 1092 | struct tstream_context *stream,
|
---|
| 1093 | struct tevent_queue *queue,
|
---|
| 1094 | tstream_readv_pdu_next_vector_t next_vector_fn,
|
---|
| 1095 | void *next_vector_private);
|
---|
| 1096 |
|
---|
| 1097 | /**
|
---|
| 1098 | * @brief Receive the PDU blob read from the stream.
|
---|
| 1099 | *
|
---|
| 1100 | * @param[in] req The tevent request from tstream_readv_pdu_queue_send().
|
---|
| 1101 | *
|
---|
| 1102 | * @param[out] perrno The error set to the actual errno.
|
---|
| 1103 | *
|
---|
| 1104 | * @return The number of bytes read on success, -1 on error with
|
---|
| 1105 | * perrno set to the actual errno.
|
---|
| 1106 | */
|
---|
| 1107 | int tstream_readv_pdu_queue_recv(struct tevent_req *req, int *perrno);
|
---|
| 1108 |
|
---|
| 1109 | /**
|
---|
| 1110 | * @brief Queue an iovector for sending through the socket
|
---|
| 1111 | *
|
---|
| 1112 | * This function queues an iovector for sending to destination through an
|
---|
| 1113 | * existing stream socket. The async callback is triggered when the whole
|
---|
| 1114 | * vectror has been delivered to the underlying system socket.
|
---|
| 1115 | *
|
---|
| 1116 | * The caller needs to make sure that all non-scalar input parameters hang
|
---|
| 1117 | * around for the whole lifetime of the request.
|
---|
| 1118 | *
|
---|
| 1119 | * @param[in] mem_ctx The memory context for the result.
|
---|
| 1120 | *
|
---|
| 1121 | * @param[in] ev The tevent_context to run on.
|
---|
| 1122 | *
|
---|
| 1123 | * @param[in] stream The stream to send data through.
|
---|
| 1124 | *
|
---|
| 1125 | * @param[in] queue The existing send queue.
|
---|
| 1126 | *
|
---|
| 1127 | * @param[in] vector The iovec vector so write.
|
---|
| 1128 | *
|
---|
| 1129 | * @param[in] count The size of the vector.
|
---|
| 1130 | *
|
---|
| 1131 | * @return The async request handle. NULL on fatal error.
|
---|
| 1132 | */
|
---|
| 1133 | struct tevent_req *tstream_writev_queue_send(TALLOC_CTX *mem_ctx,
|
---|
| 1134 | struct tevent_context *ev,
|
---|
| 1135 | struct tstream_context *stream,
|
---|
| 1136 | struct tevent_queue *queue,
|
---|
| 1137 | const struct iovec *vector,
|
---|
| 1138 | size_t count);
|
---|
| 1139 |
|
---|
| 1140 | /**
|
---|
| 1141 | * @brief Receive the result of the sent iovector.
|
---|
| 1142 | *
|
---|
| 1143 | * @param[in] req The tevent request from tstream_writev_queue_send().
|
---|
| 1144 | *
|
---|
| 1145 | * @param[out] perrno The error set to the actual errno.
|
---|
| 1146 | *
|
---|
| 1147 | * @return The length of the iovector (0 is never returned!), -1 on
|
---|
| 1148 | * error with perrno set to the actual errno.
|
---|
| 1149 | */
|
---|
| 1150 | int tstream_writev_queue_recv(struct tevent_req *req, int *perrno);
|
---|
| 1151 |
|
---|
| 1152 | /**
|
---|
| 1153 | * @}
|
---|
| 1154 | */
|
---|
| 1155 |
|
---|
| 1156 | #endif /* _TSOCKET_H */
|
---|
| 1157 |
|
---|