source: trunk/server/lib/tsocket/tsocket.h@ 987

Last change on this file since 987 was 862, checked in by Silvan Scherrer, 11 years ago

Samba Server: update trunk to 3.6.23

File size: 37.5 KB
Line 
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
30struct tsocket_address;
31struct tdgram_context;
32struct tstream_context;
33struct 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 */
108char *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 */
125struct tsocket_address *tsocket_address_copy(const struct tsocket_address *addr,
126 TALLOC_CTX *mem_ctx);
127#else
128struct 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 */
173struct 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 */
202ssize_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 */
243struct 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 */
264ssize_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 */
289struct 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 */
309int 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 */
341ssize_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 */
369struct 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 */
388int 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 */
413struct 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 */
432int 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 */
455struct 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 */
472int 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 */
502bool 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 */
524int 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
530int _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 */
554char *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 */
564uint16_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 */
575int 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 */
586bool 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 */
602int tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx,
603 const char *path,
604 struct tsocket_address **_addr);
605#else
606int _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 */
627char *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 */
648bool 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 */
667int 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
672int _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 */
697int 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
702int _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 */
730bool 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 */
754struct 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 */
777int 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
783int _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 */
818struct 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 */
837int tstream_unix_connect_recv(struct tevent_req *req,
838 int *perrno,
839 TALLOC_CTX *mem_ctx,
840 struct tstream_context **stream);
841#else
842int _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 */
867int tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
868 struct tstream_context **stream1,
869 TALLOC_CTX *mem_ctx2,
870 struct tstream_context **stream2);
871#else
872int _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
883struct 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 */
899int 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
904int _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 */
939ssize_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 */
973int tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
974 int fd,
975 struct tstream_context **stream);
976#else
977int _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 */
1032struct 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 */
1050ssize_t tdgram_sendto_queue_recv(struct tevent_req *req, int *perrno);
1051
1052typedef 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
1058struct 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);
1063int 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 */
1090struct 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 */
1107int 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 */
1133struct 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 */
1150int tstream_writev_queue_recv(struct tevent_req *req, int *perrno);
1151
1152/**
1153 * @}
1154 */
1155
1156#endif /* _TSOCKET_H */
1157
Note: See TracBrowser for help on using the repository browser.