2 Unix SMB/CIFS implementation.
4 Copyright (C) Stefan Metzmacher 2009
6 ** NOTE! The following LGPL license applies to the tsocket
7 ** library. This does NOT imply that all of Samba is released
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.
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.
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/>.
30 struct tsocket_address;
31 struct tdgram_context;
32 struct tstream_context;
33 struct tsocket_context;
39 * The tsocket abstraction is an API ...
43 * @defgroup tsocket The tsocket API
45 * The tsocket abstraction is split into two different kinds of
46 * communication interfaces.
48 * There's the "tstream_context" interface with abstracts the communication
49 * through a bidirectional byte stream between two endpoints.
51 * And there's the "tdgram_context" interface with abstracts datagram based
52 * communication between any number of endpoints.
54 * Both interfaces share the "tsocket_address" abstraction for endpoint
57 * The whole library is based on the talloc(3) and 'tevent' libraries and
58 * provides "tevent_req" based "foo_send()"/"foo_recv()" functions pairs for
59 * all abstracted methods that need to be async.
61 * @section vsock Virtual Sockets
63 * The abstracted layout of tdgram_context and tstream_context allow
64 * implementations around virtual sockets for encrypted tunnels (like TLS,
65 * SASL or GSSAPI) or named pipes over smb.
67 * @section npa Named Pipe Auth (NPA) Sockets
69 * Samba has an implementation to abstract named pipes over smb (within the
70 * server side). See libcli/named_pipe_auth/npa_tstream.[ch] for the core code.
71 * The current callers are located in source4/ntvfs/ipc/vfs_ipc.c and
72 * source4/rpc_server/service_rpc.c for the users.
76 * @defgroup tsocket_address The tsocket_address abstraction
79 * The tsocket_address represents an socket endpoint genericly.
80 * As it's like an abstract class it has no specific constructor.
81 * The specific constructors are descripted in later sections.
87 * @brief Get a string representation of the endpoint.
89 * This function creates a string representation of the endpoint for debugging.
90 * The output will look as followed:
94 * ipv4:192.168.1.1:143
96 * Callers should not try to parse the string! The should use additional methods
97 * of the specific tsocket_address implemention to get more details.
99 * @param[in] addr The address to convert.
101 * @param[in] mem_ctx The talloc memory context to allocate the memory.
103 * @return The address as a string representation, NULL on error.
105 * @see tsocket_address_is_inet()
106 * @see tsocket_address_inet_addr_string()
107 * @see tsocket_address_inet_port()
109 char *tsocket_address_string(const struct tsocket_address *addr,
110 TALLOC_CTX *mem_ctx);
114 * @brief This creates a copy of a tsocket_address.
116 * This is useful when before doing modifications to a socket via additional
117 * methods of the specific tsocket_address implementation.
119 * @param[in] addr The address to create the copy from.
121 * @param[in] mem_ctx The talloc memory context to use.
123 * @return A newly allocated copy of addr (tsocket_address *), NULL
126 struct tsocket_address *tsocket_address_copy(const struct tsocket_address *addr,
127 TALLOC_CTX *mem_ctx);
129 struct tsocket_address *_tsocket_address_copy(const struct tsocket_address *addr,
131 const char *location);
133 #define tsocket_address_copy(addr, mem_ctx) \
134 _tsocket_address_copy(addr, mem_ctx, __location__)
142 * @defgroup tdgram_context The tdgram_context abstraction
145 * The tdgram_context is like an abstract class for datagram based sockets. The
146 * interface provides async 'tevent_req' based functions on top functionality
147 * is similar to the recvfrom(2)/sendto(2)/close(2) syscalls.
149 * @note You can always use talloc_free(tdgram) to cleanup the resources
150 * of the tdgram_context on a fatal error.
155 * @brief Ask for next available datagram on the abstracted tdgram_context.
157 * It returns a 'tevent_req' handle, where the caller can register
158 * a callback with tevent_req_set_callback(). The callback is triggered
159 * when a datagram is available or an error happened.
161 * @param[in] mem_ctx The talloc memory context to use.
163 * @param[in] ev The tevent_context to run on.
165 * @param[in] dgram The dgram context to work on.
167 * @return Returns a 'tevent_req' handle, where the caller can
168 * register a callback with tevent_req_set_callback().
169 * NULL on fatal error.
171 * @see tdgram_inet_udp_socket()
172 * @see tdgram_unix_socket()
174 struct tevent_req *tdgram_recvfrom_send(TALLOC_CTX *mem_ctx,
175 struct tevent_context *ev,
176 struct tdgram_context *dgram);
179 * @brief Receive the next available datagram on the abstracted tdgram_context.
181 * This function should be called by the callback when a datagram is available
182 * or an error happened.
184 * The caller can only have one outstanding tdgram_recvfrom_send() at a time
185 * otherwise the caller will get '*perrno = EBUSY'.
187 * @param[in] req The tevent request from tdgram_recvfrom_send().
189 * @param[out] perrno The error number, set if an error occurred.
191 * @param[in] mem_ctx The memory context to use.
193 * @param[out] buf This will hold the buffer of the datagram.
195 * @param[out] src The abstracted tsocket_address of the sender of the
198 * @return The length of the datagram (0 is never returned!),
199 * -1 on error with perrno set to the actual errno.
201 * @see tdgram_recvfrom_send()
203 ssize_t tdgram_recvfrom_recv(struct tevent_req *req,
207 struct tsocket_address **src);
210 * @brief Send a datagram to a destination endpoint.
212 * The function can be called to send a datagram (specified by a buf/len) to a
213 * destination endpoint (specified by dst). It's not allowed for len to be 0.
215 * It returns a 'tevent_req' handle, where the caller can register a callback
216 * with tevent_req_set_callback(). The callback is triggered when the specific
217 * implementation (assumes it) has delivered the datagram to the "wire".
219 * The callback is then supposed to get the result by calling
220 * tdgram_sendto_recv() on the 'tevent_req'.
222 * @param[in] mem_ctx The talloc memory context to use.
224 * @param[in] ev The tevent_context to run on.
226 * @param[in] dgram The dgram context to work on.
228 * @param[in] buf The buffer to send.
230 * @param[in] len The length of the buffer to send. It has to be bigger
233 * @param[in] dst The destination to send the datagram to in form of a
236 * @return Returns a 'tevent_req' handle, where the caller can
237 * register a callback with tevent_req_set_callback().
238 * NULL on fatal error.
240 * @see tdgram_inet_udp_socket()
241 * @see tdgram_unix_socket()
242 * @see tdgram_sendto_recv()
244 struct tevent_req *tdgram_sendto_send(TALLOC_CTX *mem_ctx,
245 struct tevent_context *ev,
246 struct tdgram_context *dgram,
247 const uint8_t *buf, size_t len,
248 const struct tsocket_address *dst);
251 * @brief Receive the result of the sent datagram.
253 * The caller can only have one outstanding tdgram_sendto_send() at a time
254 * otherwise the caller will get '*perrno = EBUSY'.
256 * @param[in] req The tevent request from tdgram_sendto_send().
258 * @param[out] perrno The error number, set if an error occurred.
260 * @return The length of the datagram (0 is never returned!), -1 on
261 * error with perrno set to the actual errno.
263 * @see tdgram_sendto_send()
265 ssize_t tdgram_sendto_recv(struct tevent_req *req,
269 * @brief Shutdown/close an abstracted socket.
271 * It returns a 'tevent_req' handle, where the caller can register a callback
272 * with tevent_req_set_callback(). The callback is triggered when the specific
273 * implementation (assumes it) has delivered the datagram to the "wire".
275 * The callback is then supposed to get the result by calling
276 * tdgram_sendto_recv() on the 'tevent_req'.
278 * @param[in] mem_ctx The talloc memory context to use.
280 * @param[in] ev The tevent_context to run on.
282 * @param[in] dgram The dgram context diconnect from.
284 * @return Returns a 'tevent_req' handle, where the caller can
285 * register a callback with tevent_req_set_callback().
286 * NULL on fatal error.
288 * @see tdgram_disconnect_recv()
290 struct tevent_req *tdgram_disconnect_send(TALLOC_CTX *mem_ctx,
291 struct tevent_context *ev,
292 struct tdgram_context *dgram);
295 * @brief Receive the result from a tdgram_disconnect_send() request.
297 * The caller should make sure there're no outstanding tdgram_recvfrom_send()
298 * and tdgram_sendto_send() calls otherwise the caller will get
301 * @param[in] req The tevent request from tdgram_disconnect_send().
303 * @param[out] perrno The error number, set if an error occurred.
305 * @return The length of the datagram (0 is never returned!), -1 on
306 * error with perrno set to the actual errno.
308 * @see tdgram_disconnect_send()
310 int tdgram_disconnect_recv(struct tevent_req *req,
318 * @defgroup tstream_context The tstream_context abstraction
321 * The tstream_context is like an abstract class for stream based sockets. The
322 * interface provides async 'tevent_req' based functions on top functionality
323 * is similar to the readv(2)/writev(2)/close(2) syscalls.
325 * @note You can always use talloc_free(tstream) to cleanup the resources
326 * of the tstream_context on a fatal error.
332 * @brief Report the number of bytes received but not consumed yet.
334 * The tstream_pending_bytes() function reports how much bytes of the incoming
335 * stream have been received but not consumed yet.
337 * @param[in] stream The tstream_context to check for pending bytes.
339 * @return The number of bytes received, -1 on error with errno
342 ssize_t tstream_pending_bytes(struct tstream_context *stream);
345 * @brief Read a specific amount of bytes from a stream socket.
347 * The function can be called to read for a specific amount of bytes from the
348 * stream into given buffers. The caller has to preallocate the buffers.
350 * The caller might need to use tstream_pending_bytes() if the protocol doesn't
351 * have a fixed pdu header containing the pdu size.
353 * @param[in] mem_ctx The talloc memory context to use.
355 * @param[in] ev The tevent_context to run on.
357 * @param[in] stream The tstream context to work on.
359 * @param[out] vector A preallocated iovec to store the data to read.
361 * @param[in] count The number of buffers in the vector allocated.
363 * @return A 'tevent_req' handle, where the caller can register
364 * a callback with tevent_req_set_callback(). NULL on
367 * @see tstream_unix_connect_send()
368 * @see tstream_inet_tcp_connect_send()
370 struct tevent_req *tstream_readv_send(TALLOC_CTX *mem_ctx,
371 struct tevent_context *ev,
372 struct tstream_context *stream,
373 struct iovec *vector,
377 * @brief Get the result of a tstream_readv_send().
379 * The caller can only have one outstanding tstream_readv_send()
380 * at a time otherwise the caller will get *perrno = EBUSY.
382 * @param[in] req The tevent request from tstream_readv_send().
384 * @param[out] perrno The error number, set if an error occurred.
386 * @return The length of the stream (0 is never returned!), -1 on
387 * error with perrno set to the actual errno.
389 int tstream_readv_recv(struct tevent_req *req,
393 * @brief Write buffers from a vector into a stream socket.
395 * The function can be called to write buffers from a given vector
396 * to a stream socket.
398 * You have to ensure that the vector is not empty.
400 * @param[in] mem_ctx The talloc memory context to use.
402 * @param[in] ev The tevent_context to run on.
404 * @param[in] stream The tstream context to work on.
406 * @param[in] vector The iovec vector with data to write on a stream socket.
408 * @param[in] count The number of buffers in the vector to write.
410 * @return A 'tevent_req' handle, where the caller can register
411 * a callback with tevent_req_set_callback(). NULL on
414 struct tevent_req *tstream_writev_send(TALLOC_CTX *mem_ctx,
415 struct tevent_context *ev,
416 struct tstream_context *stream,
417 const struct iovec *vector,
421 * @brief Get the result of a tstream_writev_send().
423 * The caller can only have one outstanding tstream_writev_send()
424 * at a time otherwise the caller will get *perrno = EBUSY.
426 * @param[in] req The tevent request from tstream_writev_send().
428 * @param[out] perrno The error number, set if an error occurred.
430 * @return The length of the stream (0 is never returned!), -1 on
431 * error with perrno set to the actual errno.
433 int tstream_writev_recv(struct tevent_req *req,
437 * @brief Shutdown/close an abstracted socket.
439 * It returns a 'tevent_req' handle, where the caller can register a callback
440 * with tevent_req_set_callback(). The callback is triggered when the specific
441 * implementation (assumes it) has delivered the stream to the "wire".
443 * The callback is then supposed to get the result by calling
444 * tdgram_sendto_recv() on the 'tevent_req'.
446 * @param[in] mem_ctx The talloc memory context to use.
448 * @param[in] ev The tevent_context to run on.
450 * @param[in] stream The tstream context to work on.
452 * @return A 'tevent_req' handle, where the caller can register
453 * a callback with tevent_req_set_callback(). NULL on
456 struct tevent_req *tstream_disconnect_send(TALLOC_CTX *mem_ctx,
457 struct tevent_context *ev,
458 struct tstream_context *stream);
461 * @brief Get the result of a tstream_disconnect_send().
463 * The caller can only have one outstanding tstream_writev_send()
464 * at a time otherwise the caller will get *perrno = EBUSY.
466 * @param[in] req The tevent request from tstream_disconnect_send().
468 * @param[out] perrno The error number, set if an error occurred.
470 * @return The length of the stream (0 is never returned!), -1 on
471 * error with perrno set to the actual errno.
473 int tstream_disconnect_recv(struct tevent_req *req,
482 * @defgroup tsocket_bsd tsocket_bsd - inet, inet6 and unix
485 * The main tsocket library comes with implentations for BSD style ipv4, ipv6
492 * @brief Find out if the tsocket_address represents an ipv4 or ipv6 endpoint.
494 * @param[in] addr The tsocket_address pointer
496 * @param[in] fam The family can be can be "ipv4", "ipv6" or "ip". With
497 * "ip" is autodetects "ipv4" or "ipv6" based on the
500 * @return true if addr represents an address of the given family,
503 bool tsocket_address_is_inet(const struct tsocket_address *addr, const char *fam);
507 * @brief Create a tsocket_address for ipv4 and ipv6 endpoint addresses.
509 * @param[in] mem_ctx The talloc memory context to use.
511 * @param[in] fam The family can be can be "ipv4", "ipv6" or "ip". With
512 * "ip" is autodetects "ipv4" or "ipv6" based on the
515 * @param[in] addr A valid ip address string based on the selected family
516 * (dns names are not allowed!). It's valid to pass NULL,
517 * which gets mapped to "0.0.0.0" or "::".
519 * @param[in] port A valid port number.
521 * @param[out] _addr A tsocket_address pointer to store the information.
523 * @return 0 on success, -1 on error with errno set.
525 int tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
529 struct tsocket_address **_addr);
531 int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
535 struct tsocket_address **_addr,
536 const char *location);
538 #define tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr) \
539 _tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr, \
544 * @brief Get the address of an 'inet' tsocket_address as a string.
546 * @param[in] addr The address to convert to a string.
548 * @param[in] mem_ctx The talloc memory context to use.
550 * @return A newly allocated string of the address, NULL on error
553 * @see tsocket_address_is_inet()
555 char *tsocket_address_inet_addr_string(const struct tsocket_address *addr,
556 TALLOC_CTX *mem_ctx);
559 * @brief Get the port number as an integer from an 'inet' tsocket_address.
561 * @param[in] addr The tsocket address to use.
563 * @return The port number, 0 on error with errno set.
565 uint16_t tsocket_address_inet_port(const struct tsocket_address *addr);
568 * @brief Set the port number of an existing 'inet' tsocket_address.
570 * @param[in] addr The existing tsocket_address to use.
572 * @param[in] port The valid port number to set.
574 * @return 0 on success, -1 on error with errno set.
576 int tsocket_address_inet_set_port(struct tsocket_address *addr,
580 * @brief Find out if the tsocket_address represents an unix domain endpoint.
582 * @param[in] addr The tsocket_address pointer
584 * @return true if addr represents an unix domain endpoint,
587 bool tsocket_address_is_unix(const struct tsocket_address *addr);
591 * @brief Create a tsocket_address for a unix domain endpoint addresses.
593 * @param[in] mem_ctx The talloc memory context to use.
595 * @param[in] path The filesystem path, NULL will map "".
597 * @param[in] _addr The tsocket_address pointer to store the information.
599 * @return 0 on success, -1 on error with errno set.
601 * @see tsocket_address_is_unix()
603 int tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx,
605 struct tsocket_address **_addr);
607 int _tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx,
609 struct tsocket_address **_addr,
610 const char *location);
612 #define tsocket_address_unix_from_path(mem_ctx, path, _addr) \
613 _tsocket_address_unix_from_path(mem_ctx, path, _addr, \
618 * @brief Get the address of an 'unix' tsocket_address.
620 * @param[in] addr A valid 'unix' tsocket_address.
622 * @param[in] mem_ctx The talloc memory context to use.
624 * @return The path of the unix domain socket, NULL on error or if
625 * the tsocket_address doesn't represent an unix domain
628 char *tsocket_address_unix_path(const struct tsocket_address *addr,
629 TALLOC_CTX *mem_ctx);
632 * @brief Request a syscall optimization for tdgram_recvfrom_send()
634 * This function is only used to reduce the amount of syscalls and
635 * optimize performance. You should only use this if you know
638 * The optimization is off by default.
640 * @param[in] dgram The tdgram_context of a bsd socket, if this
641 * not a bsd socket the function does nothing.
643 * @param[in] on The boolean value to turn the optimization on and off.
645 * @return The old boolean value.
647 * @see tdgram_recvfrom_send()
649 bool tdgram_bsd_optimize_recvfrom(struct tdgram_context *dgram,
654 * @brief Create a tdgram_context for a ipv4 or ipv6 UDP communication.
656 * @param[in] local An 'inet' tsocket_address for the local endpoint.
658 * @param[in] remote An 'inet' tsocket_address for the remote endpoint or
659 * NULL (??? to create a listener?).
661 * @param[in] mem_ctx The talloc memory context to use.
663 * @param[in] dgram The tdgram_context pointer to setup the udp
664 * communication. The function will allocate the memory.
666 * @return 0 on success, -1 on error with errno set.
668 int tdgram_inet_udp_socket(const struct tsocket_address *local,
669 const struct tsocket_address *remote,
671 struct tdgram_context **dgram);
673 int _tdgram_inet_udp_socket(const struct tsocket_address *local,
674 const struct tsocket_address *remote,
676 struct tdgram_context **dgram,
677 const char *location);
678 #define tdgram_inet_udp_socket(local, remote, mem_ctx, dgram) \
679 _tdgram_inet_udp_socket(local, remote, mem_ctx, dgram, __location__)
684 * @brief Create a tdgram_context for unix domain datagram communication.
686 * @param[in] local An 'unix' tsocket_address for the local endpoint.
688 * @param[in] remote An 'unix' tsocket_address for the remote endpoint or
689 * NULL (??? to create a listener?).
691 * @param[in] mem_ctx The talloc memory context to use.
693 * @param[in] dgram The tdgram_context pointer to setup the udp
694 * communication. The function will allocate the memory.
696 * @return 0 on success, -1 on error with errno set.
698 int tdgram_unix_socket(const struct tsocket_address *local,
699 const struct tsocket_address *remote,
701 struct tdgram_context **dgram);
703 int _tdgram_unix_socket(const struct tsocket_address *local,
704 const struct tsocket_address *remote,
706 struct tdgram_context **dgram,
707 const char *location);
709 #define tdgram_unix_socket(local, remote, mem_ctx, dgram) \
710 _tdgram_unix_socket(local, remote, mem_ctx, dgram, __location__)
714 * @brief Request a syscall optimization for tstream_readv_send()
716 * This function is only used to reduce the amount of syscalls and
717 * optimize performance. You should only use this if you know
720 * The optimization is off by default.
722 * @param[in] stream The tstream_context of a bsd socket, if this
723 * not a bsd socket the function does nothing.
725 * @param[in] on The boolean value to turn the optimization on and off.
727 * @return The old boolean value.
729 * @see tstream_readv_send()
731 bool tstream_bsd_optimize_readv(struct tstream_context *stream,
735 * @brief Connect async to a TCP endpoint and create a tstream_context for the
736 * stream based communication.
738 * Use this function to connenct asynchronously to a remote ipv4 or ipv6 TCP
739 * endpoint and create a tstream_context for the stream based communication.
741 * @param[in] mem_ctx The talloc memory context to use.
743 * @param[in] ev The tevent_context to run on.
745 * @param[in] local An 'inet' tsocket_address for the local endpoint.
747 * @param[in] remote An 'inet' tsocket_address for the remote endpoint.
749 * @return A 'tevent_req' handle, where the caller can register a
750 * callback with tevent_req_set_callback(). NULL on a fatal
753 * @see tstream_inet_tcp_connect_recv()
755 struct tevent_req *tstream_inet_tcp_connect_send(TALLOC_CTX *mem_ctx,
756 struct tevent_context *ev,
757 const struct tsocket_address *local,
758 const struct tsocket_address *remote);
762 * @brief Receive the result from a tstream_inet_tcp_connect_send().
764 * @param[in] req The tevent request from tstream_inet_tcp_connect_send().
766 * @param[out] perrno The error number, set if an error occurred.
768 * @param[in] mem_ctx The talloc memory context to use.
770 * @param[out] stream A tstream_context pointer to setup the tcp communication
771 * on. This function will allocate the memory.
773 * @param[out] local The real 'inet' tsocket_address of the local endpoint.
774 * This parameter is optional and can be NULL.
776 * @return 0 on success, -1 on error with perrno set.
778 int tstream_inet_tcp_connect_recv(struct tevent_req *req,
781 struct tstream_context **stream,
782 struct tsocket_address **local)
784 int _tstream_inet_tcp_connect_recv(struct tevent_req *req,
787 struct tstream_context **stream,
788 struct tsocket_address **local,
789 const char *location);
790 #define tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local) \
791 _tstream_inet_tcp_connect_recv(req, perrno, mem_ctx, stream, local, \
796 * @brief Connect async to a unix domain endpoint and create a tstream_context
797 * for the stream based communication.
799 * Use this function to connenct asynchronously to a unix domainendpoint and
800 * create a tstream_context for the stream based communication.
802 * The callback is triggered when a socket is connected and ready for IO or an
805 * @param[in] mem_ctx The talloc memory context to use.
807 * @param[in] ev The tevent_context to run on.
809 * @param[in] local An 'unix' tsocket_address for the local endpoint.
811 * @param[in] remote An 'unix' tsocket_address for the remote endpoint.
813 * @return A 'tevent_req' handle, where the caller can register a
814 * callback with tevent_req_set_callback(). NULL on a falal
817 * @see tstream_unix_connect_recv()
819 struct tevent_req * tstream_unix_connect_send(TALLOC_CTX *mem_ctx,
820 struct tevent_context *ev,
821 const struct tsocket_address *local,
822 const struct tsocket_address *remote);
826 * @brief Receive the result from a tstream_unix_connect_send().
828 * @param[in] req The tevent request from tstream_inet_tcp_connect_send().
830 * @param[out] perrno The error number, set if an error occurred.
832 * @param[in] mem_ctx The talloc memory context to use.
834 * @param[in] stream The tstream context to work on.
836 * @return 0 on success, -1 on error with perrno set.
838 int tstream_unix_connect_recv(struct tevent_req *req,
841 struct tstream_context **stream);
843 int _tstream_unix_connect_recv(struct tevent_req *req,
846 struct tstream_context **stream,
847 const char *location);
848 #define tstream_unix_connect_recv(req, perrno, mem_ctx, stream) \
849 _tstream_unix_connect_recv(req, perrno, mem_ctx, stream, \
855 * @brief Create two connected 'unix' tsocket_contexts for stream based
858 * @param[in] mem_ctx1 The talloc memory context to use for stream1.
860 * @param[in] stream1 The first stream to connect.
862 * @param[in] mem_ctx2 The talloc memory context to use for stream2.
864 * @param[in] stream2 The second stream to connect.
866 * @return 0 on success, -1 on error with errno set.
868 int tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
869 struct tstream_context **stream1,
870 TALLOC_CTX *mem_ctx2,
871 struct tstream_context **stream2);
873 int _tstream_unix_socketpair(TALLOC_CTX *mem_ctx1,
874 struct tstream_context **_stream1,
875 TALLOC_CTX *mem_ctx2,
876 struct tstream_context **_stream2,
877 const char *location);
879 #define tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2) \
880 _tstream_unix_socketpair(mem_ctx1, stream1, mem_ctx2, stream2, \
888 * @brief Convert a tsocket address to a bsd socket address.
890 * @param[in] mem_ctx The talloc memory context to use.
892 * @param[in] sa The sockaddr structure to convert.
894 * @param[in] sa_socklen The lenth of the sockaddr sturucte.
896 * @param[out] addr The tsocket pointer to allocate and fill.
898 * @return 0 on success, -1 on error with errno set.
900 int tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
903 struct tsocket_address **addr);
905 int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
908 struct tsocket_address **_addr,
909 const char *location);
911 #define tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr) \
912 _tsocket_address_bsd_from_sockaddr(mem_ctx, sa, sa_socklen, _addr, \
917 * @brief Fill a bsd sockaddr structure.
919 * @param[in] addr The tsocket address structure to use.
921 * @param[in] sa The bsd sockaddr structure to fill out.
923 * @param[in] sa_socklen The length of the bsd sockaddr structure to fill out.
925 * @return The actual size of the sockaddr structure, -1 on error
926 * with errno set. The size could differ from sa_socklen.
930 * struct sockaddr_storage ss;
932 * socklen = tsocket_address_bsd_sockaddr(taddr,
933 * (struct sockaddr *) &ss,
934 * sizeof(struct sockaddr_storage));
940 ssize_t tsocket_address_bsd_sockaddr(const struct tsocket_address *addr,
946 * @brief Wrap an existing file descriptors into the tstream abstraction.
948 * You can use this function to wrap an existing file descriptors into the
949 * tstream abstraction. After that you're not able to use this file descriptor
950 * for anything else. The file descriptor will be closed when the stream gets
951 * freed. If you still want to use the fd you have have to create a duplicate.
953 * @param[in] mem_ctx The talloc memory context to use.
955 * @param[in] fd The non blocking fd to use!
957 * @param[out] stream A pointer to store an allocated tstream_context.
959 * @return 0 on success, -1 on error.
964 * rc = tstream_bsd_existing_socket(mem_ctx, fd2, &tstream);
966 * stream_terminate_connection(conn, "named_pipe_accept: out of memory");
971 * @warning This is an internal function. You should read the code to fully
972 * understand it if you plan to use it.
974 int tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
976 struct tstream_context **stream);
978 int _tstream_bsd_existing_socket(TALLOC_CTX *mem_ctx,
980 struct tstream_context **_stream,
981 const char *location);
982 #define tstream_bsd_existing_socket(mem_ctx, fd, stream) \
983 _tstream_bsd_existing_socket(mem_ctx, fd, stream, \
992 * @defgroup tsocket_helper Queue and PDU helpers
995 * In order to make the live easier for callers which want to implement a
996 * function to receive a full PDU with a single async function pair, there're
997 * some helper functions.
999 * There're some cases where the caller wants doesn't care about the order of
1000 * doing IO on the abstracted sockets.
1006 * @brief Queue a dgram blob for sending through the socket.
1008 * This function queues a blob for sending to destination through an existing
1009 * dgram socket. The async callback is triggered when the whole blob is
1010 * delivered to the underlying system socket.
1012 * The caller needs to make sure that all non-scalar input parameters hang
1013 * around for the whole lifetime of the request.
1015 * @param[in] mem_ctx The memory context for the result.
1017 * @param[in] ev The event context the operation should work on.
1019 * @param[in] dgram The tdgram_context to send the message buffer.
1021 * @param[in] queue The existing dgram queue.
1023 * @param[in] buf The message buffer to send.
1025 * @param[in] len The message length.
1027 * @param[in] dst The destination socket address.
1029 * @return The async request handle. NULL on fatal error.
1031 * @see tdgram_sendto_queue_recv()
1033 struct tevent_req *tdgram_sendto_queue_send(TALLOC_CTX *mem_ctx,
1034 struct tevent_context *ev,
1035 struct tdgram_context *dgram,
1036 struct tevent_queue *queue,
1039 struct tsocket_address *dst);
1042 * @brief Receive the result of the sent dgram blob.
1044 * @param[in] req The tevent request from tdgram_sendto_queue_send().
1046 * @param[out] perrno The error set to the actual errno.
1048 * @return The length of the datagram (0 is never returned!), -1 on
1049 * error with perrno set to the actual errno.
1051 ssize_t tdgram_sendto_queue_recv(struct tevent_req *req, int *perrno);
1053 typedef int (*tstream_readv_pdu_next_vector_t)(struct tstream_context *stream,
1055 TALLOC_CTX *mem_ctx,
1056 struct iovec **vector,
1059 struct tevent_req *tstream_readv_pdu_send(TALLOC_CTX *mem_ctx,
1060 struct tevent_context *ev,
1061 struct tstream_context *stream,
1062 tstream_readv_pdu_next_vector_t next_vector_fn,
1063 void *next_vector_private);
1064 int tstream_readv_pdu_recv(struct tevent_req *req, int *perrno);
1067 * @brief Queue a read request for a PDU on the socket.
1069 * This function queues a read request for a PDU on a stream socket. The async
1070 * callback is triggered when a full PDU has been read from the socket.
1072 * The caller needs to make sure that all non-scalar input parameters hang
1073 * around for the whole lifetime of the request.
1075 * @param[in] mem_ctx The memory context for the result
1077 * @param[in] ev The tevent_context to run on
1079 * @param[in] stream The stream to send data through
1081 * @param[in] queue The existing send queue
1083 * @param[in] next_vector_fn The next vector function
1085 * @param[in] next_vector_private The private_data of the next vector function
1087 * @return The async request handle. NULL on fatal error.
1089 * @see tstream_readv_pdu_queue_recv()
1091 struct tevent_req *tstream_readv_pdu_queue_send(TALLOC_CTX *mem_ctx,
1092 struct tevent_context *ev,
1093 struct tstream_context *stream,
1094 struct tevent_queue *queue,
1095 tstream_readv_pdu_next_vector_t next_vector_fn,
1096 void *next_vector_private);
1099 * @brief Receive the PDU blob read from the stream.
1101 * @param[in] req The tevent request from tstream_readv_pdu_queue_send().
1103 * @param[out] perrno The error set to the actual errno.
1105 * @return The number of bytes read on success, -1 on error with
1106 * perrno set to the actual errno.
1108 int tstream_readv_pdu_queue_recv(struct tevent_req *req, int *perrno);
1111 * @brief Queue an iovector for sending through the socket
1113 * This function queues an iovector for sending to destination through an
1114 * existing stream socket. The async callback is triggered when the whole
1115 * vectror has been delivered to the underlying system socket.
1117 * The caller needs to make sure that all non-scalar input parameters hang
1118 * around for the whole lifetime of the request.
1120 * @param[in] mem_ctx The memory context for the result.
1122 * @param[in] ev The tevent_context to run on.
1124 * @param[in] stream The stream to send data through.
1126 * @param[in] queue The existing send queue.
1128 * @param[in] vector The iovec vector so write.
1130 * @param[in] count The size of the vector.
1132 * @return The async request handle. NULL on fatal error.
1134 struct tevent_req *tstream_writev_queue_send(TALLOC_CTX *mem_ctx,
1135 struct tevent_context *ev,
1136 struct tstream_context *stream,
1137 struct tevent_queue *queue,
1138 const struct iovec *vector,
1142 * @brief Receive the result of the sent iovector.
1144 * @param[in] req The tevent request from tstream_writev_queue_send().
1146 * @param[out] perrno The error set to the actual errno.
1148 * @return The length of the iovector (0 is never returned!), -1 on
1149 * error with perrno set to the actual errno.
1151 int tstream_writev_queue_recv(struct tevent_req *req, int *perrno);
1158 * tsocket_context related functions
1160 struct tevent_req *tsocket_accept_send(TALLOC_CTX *mem_ctx,
1161 struct tevent_context *ev,
1162 struct tsocket_context *sock);
1163 int _tsocket_accept_recv(struct tevent_req *req,
1165 TALLOC_CTX *mem_ctx,
1166 struct tsocket_address **local,
1167 struct tsocket_address **remote,
1168 struct tstream_context **stream,
1169 const char *location);
1170 #define tsocket_accept_recv(req, perrno, mem_ctx, local, remote, stream) \
1171 _tsocket_accept_recv(req, perrno, mem_ctx, local, remote, stream, \
1174 struct tevent_req *tsocket_shutdown_send(TALLOC_CTX *mem_ctx,
1175 struct tevent_context *ev,
1176 struct tsocket_context *sock);
1177 int tsocket_shutdown_recv(struct tevent_req *req,
1180 #endif /* _TSOCKET_H */