From 2e0e416676f5d67e716f272d3923386c3f0c9524 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Feb 2009 09:10:54 +0100 Subject: lib/tsocket: add generic socket abstraction layer This will replace source4/lib/socket/. metze --- lib/tsocket/tsocket.h | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 lib/tsocket/tsocket.h (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h new file mode 100644 index 0000000000..fd05e394f3 --- /dev/null +++ b/lib/tsocket/tsocket.h @@ -0,0 +1,124 @@ +/* + Unix SMB/CIFS implementation. + + Copyright (C) Stefan Metzmacher 2009 + + ** NOTE! The following LGPL license applies to the tevent + ** library. This does NOT imply that all of Samba is released + ** under the LGPL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see . +*/ + +#ifndef _TSOCKET_H +#define _TSOCKET_H + +#include +#include + +struct tsocket_context; +struct tsocket_address; +struct iovec; + +enum tsocket_type { + TSOCKET_TYPE_STREAM = 1, + TSOCKET_TYPE_DGRAM, + TSOCKET_TYPE_MESSAGE +}; + +typedef void (*tsocket_event_handler_t)(struct tsocket_context *, void *); +int tsocket_set_event_context(struct tsocket_context *sock, + struct tevent_context *ev); +int tsocket_set_readable_handler(struct tsocket_context *sock, + tsocket_event_handler_t handler, + void *private_data); +int tsocket_set_writeable_handler(struct tsocket_context *sock, + tsocket_event_handler_t handler, + void *private_data); + +int tsocket_connect(struct tsocket_context *sock, + const struct tsocket_address *remote_addr); + +int tsocket_listen(struct tsocket_context *sock, + int queue_size); + +int _tsocket_accept(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + struct tsocket_context **new_sock, + const char *location); +#define tsocket_accept(sock, mem_ctx, new_sock) \ + _tsocket_accept(sock, mem_ctx, new_sock, __location__) + +ssize_t tsocket_pending(struct tsocket_context *sock); + +int tsocket_readv(struct tsocket_context *sock, + const struct iovec *vector, size_t count); +int tsocket_writev(struct tsocket_context *sock, + const struct iovec *vector, size_t count); + +ssize_t tsocket_recvfrom(struct tsocket_context *sock, + uint8_t *data, size_t len, + TALLOC_CTX *addr_ctx, + struct tsocket_address **src_addr); +ssize_t tsocket_sendto(struct tsocket_context *sock, + const uint8_t *data, size_t len, + const struct tsocket_address *dest_addr); + +int tsocket_get_status(const struct tsocket_context *sock); + +int _tsocket_get_local_address(const struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + struct tsocket_address **local_addr, + const char *location); +#define tsocket_get_local_address(sock, mem_ctx, local_addr) \ + _tsocket_get_local_address(sock, mem_ctx, local_addr, __location__) +int _tsocket_get_remote_address(const struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + struct tsocket_address **remote_addr, + const char *location); +#define tsocket_get_remote_address(sock, mem_ctx, remote_addr) \ + _tsocket_get_remote_address(sock, mem_ctx, remote_addr, __location__) + +int tsocket_get_option(const struct tsocket_context *sock, + const char *option, + TALLOC_CTX *mem_ctx, + char **value); +int tsocket_set_option(const struct tsocket_context *sock, + const char *option, + bool force, + const char *value); + +void tsocket_disconnect(struct tsocket_context *sock); + +char *tsocket_address_string(const struct tsocket_address *addr, + TALLOC_CTX *mem_ctx); + +struct tsocket_address *_tsocket_address_copy(const struct tsocket_address *addr, + TALLOC_CTX *mem_ctx, + const char *location); + +#define tsocket_address_copy(addr, mem_ctx) \ + _tsocket_address_copy(addr, mem_ctx, __location__) + +int _tsocket_address_create_socket(const struct tsocket_address *addr, + enum tsocket_type type, + TALLOC_CTX *mem_ctx, + struct tsocket_context **sock, + const char *location); +#define tsocket_address_create_socket(addr, type, mem_ctx, sock) \ + _tsocket_address_create_socket(addr, type, mem_ctx, sock,\ + __location__) + +#endif /* _TSOCKET_H */ + -- cgit From 6c88d61bdd7333c671f440ada23bca7169cd60fc Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Thu, 26 Feb 2009 15:37:44 +0100 Subject: lib/tsocket: add an implementation for bsd style sockets. metze --- lib/tsocket/tsocket.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index fd05e394f3..04eb989a07 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -120,5 +120,46 @@ int _tsocket_address_create_socket(const struct tsocket_address *addr, _tsocket_address_create_socket(addr, type, mem_ctx, sock,\ __location__) +/* + * BSD sockets: inet, inet6 and unix + */ + + +int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx, + const char *fam, + const char *addr, + uint16_t port, + struct tsocket_address **_addr, + const char *location); +#define tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr) \ + _tsocket_address_inet_from_strings(mem_ctx, fam, addr, port, _addr, \ + __location__) + +char *tsocket_address_inet_addr_string(const struct tsocket_address *addr, + TALLOC_CTX *mem_ctx); +uint16_t tsocket_address_inet_port(const struct tsocket_address *addr); +int tsocket_address_inet_set_port(struct tsocket_address *addr, + uint16_t port); +void tsocket_address_inet_set_broadcast(struct tsocket_address *addr, + bool broadcast); + +int _tsocket_address_unix_from_path(TALLOC_CTX *mem_ctx, + const char *path, + struct tsocket_address **_addr, + const char *location); +#define tsocket_address_unix_from_path(mem_ctx, path, _addr) \ + _tsocket_address_unix_from_path(mem_ctx, path, _addr, \ + __location__) +char *tsocket_address_unix_path(const struct tsocket_address *addr, + TALLOC_CTX *mem_ctx); + +int _tsocket_context_bsd_wrap_existing(TALLOC_CTX *mem_ctx, + int fd, bool close_on_disconnect, + struct tsocket_context **_sock, + const char *location); +#define tsocket_context_bsd_wrap_existing(mem_ctx, fd, cod, _sock) \ + _tsocket_context_bsd_wrap_existing(mem_ctx, fd, cod, _sock, \ + __location__) + #endif /* _TSOCKET_H */ -- cgit From ccfd6a6e39ab999df0eba0d9e94cc22f1aa6e000 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Feb 2009 09:23:32 +0100 Subject: lib/tsocket: add tsocket_recvfrom_send/recv() metze --- lib/tsocket/tsocket.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 04eb989a07..8cabd4263f 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -124,7 +124,6 @@ int _tsocket_address_create_socket(const struct tsocket_address *addr, * BSD sockets: inet, inet6 and unix */ - int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx, const char *fam, const char *addr, @@ -161,5 +160,17 @@ int _tsocket_context_bsd_wrap_existing(TALLOC_CTX *mem_ctx, _tsocket_context_bsd_wrap_existing(mem_ctx, fd, cod, _sock, \ __location__) +/* + * Async helpers + */ + +struct tevent_req *tsocket_recvfrom_send(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx); +ssize_t tsocket_recvfrom_recv(struct tevent_req *req, + int *perrno, + TALLOC_CTX *mem_ctx, + uint8_t **buf, + struct tsocket_address **src); + #endif /* _TSOCKET_H */ -- cgit From 9ed7a45c88d9daeedf818b56ecefd6ce58fcce36 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Tue, 10 Mar 2009 21:12:31 +0100 Subject: lib/tsocket: add tsocket_sendto_send/recv() metze --- lib/tsocket/tsocket.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 8cabd4263f..7987571bc3 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -172,5 +172,12 @@ ssize_t tsocket_recvfrom_recv(struct tevent_req *req, uint8_t **buf, struct tsocket_address **src); +struct tevent_req *tsocket_sendto_send(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + const uint8_t *buf, + size_t len, + const struct tsocket_address *dst); +ssize_t tsocket_sendto_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit From 4002b7bdc132988b44aa83b3d0cd8af54a55fe08 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Feb 2009 10:00:50 +0100 Subject: lib/tsocket: add tsocket_sendto_queue_send/recv() metze --- lib/tsocket/tsocket.h | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 7987571bc3..4445aafe9d 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -179,5 +179,13 @@ struct tevent_req *tsocket_sendto_send(struct tsocket_context *sock, const struct tsocket_address *dst); ssize_t tsocket_sendto_recv(struct tevent_req *req, int *perrno); +struct tevent_req *tsocket_sendto_queue_send(TALLOC_CTX *mem_ctx, + struct tsocket_context *sock, + struct tevent_queue *queue, + const uint8_t *buf, + size_t len, + struct tsocket_address *dst); +ssize_t tsocket_sendto_queue_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit From a140823cc9d7a47e2fc2ffdb80d63b402f7664c0 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 18 Feb 2009 09:19:09 +0100 Subject: lib/tsocket: add tsocket_connect_send/recv() metze --- lib/tsocket/tsocket.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 4445aafe9d..f7a7d6b614 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -187,5 +187,10 @@ struct tevent_req *tsocket_sendto_queue_send(TALLOC_CTX *mem_ctx, struct tsocket_address *dst); ssize_t tsocket_sendto_queue_recv(struct tevent_req *req, int *perrno); +struct tevent_req *tsocket_connect_send(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + const struct tsocket_address *dst); +int tsocket_connect_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit From 2e44ceaea858a611bcb7018df80a6a00096449ab Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 11 Mar 2009 14:10:47 +0100 Subject: lib/tsocket: add tsocket_writev_send/recv() metze --- lib/tsocket/tsocket.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index f7a7d6b614..2456062b47 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -192,5 +192,11 @@ struct tevent_req *tsocket_connect_send(struct tsocket_context *sock, const struct tsocket_address *dst); int tsocket_connect_recv(struct tevent_req *req, int *perrno); +struct tevent_req *tsocket_writev_send(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + const struct iovec *vector, + size_t count); +int tsocket_writev_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit From 6c8bd1005d7440c929d5b70f9faba09e0838b12a Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 11 Mar 2009 14:26:15 +0100 Subject: lib/tsocket: add tsocket_writev_queue_send/recv() metze --- lib/tsocket/tsocket.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index 2456062b47..d4fb68f766 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -198,5 +198,12 @@ struct tevent_req *tsocket_writev_send(struct tsocket_context *sock, size_t count); int tsocket_writev_recv(struct tevent_req *req, int *perrno); +struct tevent_req *tsocket_writev_queue_send(TALLOC_CTX *mem_ctx, + struct tsocket_context *sock, + struct tevent_queue *queue, + const struct iovec *vector, + size_t count); +int tsocket_writev_queue_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit From a27c6eb8e23db924e0dc67aa71c832be54cda98f Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 11 Mar 2009 15:51:07 +0100 Subject: lib/tsocket: add tsocket_readv_send/recv() metze --- lib/tsocket/tsocket.h | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'lib/tsocket/tsocket.h') diff --git a/lib/tsocket/tsocket.h b/lib/tsocket/tsocket.h index d4fb68f766..9bcfb5cb7e 100644 --- a/lib/tsocket/tsocket.h +++ b/lib/tsocket/tsocket.h @@ -205,5 +205,16 @@ struct tevent_req *tsocket_writev_queue_send(TALLOC_CTX *mem_ctx, size_t count); int tsocket_writev_queue_recv(struct tevent_req *req, int *perrno); +typedef int (*tsocket_readv_next_iovec_t)(struct tsocket_context *sock, + void *private_data, + TALLOC_CTX *mem_ctx, + struct iovec **vector, + size_t *count); +struct tevent_req *tsocket_readv_send(struct tsocket_context *sock, + TALLOC_CTX *mem_ctx, + tsocket_readv_next_iovec_t next_iovec_fn, + void *private_data); +int tsocket_readv_recv(struct tevent_req *req, int *perrno); + #endif /* _TSOCKET_H */ -- cgit