summaryrefslogtreecommitdiff
path: root/source4/lib/socket
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/socket')
-rw-r--r--source4/lib/socket/socket.c10
-rw-r--r--source4/lib/socket/socket.h3
2 files changed, 12 insertions, 1 deletions
diff --git a/source4/lib/socket/socket.c b/source4/lib/socket/socket.c
index d975eae2dc..548b11ebcc 100644
--- a/source4/lib/socket/socket.c
+++ b/source4/lib/socket/socket.c
@@ -30,7 +30,8 @@
*/
static int socket_destructor(struct socket_context *sock)
{
- if (sock->ops->fn_close) {
+ if (sock->ops->fn_close &&
+ !(sock->flags & SOCKET_FLAG_NOCLOSE)) {
sock->ops->fn_close(sock);
}
return 0;
@@ -547,3 +548,10 @@ _PUBLIC_ void set_socket_options(int fd, const char *options)
talloc_free(options_list);
}
+/*
+ set some flags on a socket
+ */
+void socket_set_flags(struct socket_context *sock, unsigned flags)
+{
+ sock->flags |= flags;
+}
diff --git a/source4/lib/socket/socket.h b/source4/lib/socket/socket.h
index 025fc7e13d..161f112ca6 100644
--- a/source4/lib/socket/socket.h
+++ b/source4/lib/socket/socket.h
@@ -109,6 +109,8 @@ enum socket_state {
* is encrypting data.
* This modifies the
* TESTNONBLOCK case */
+#define SOCKET_FLAG_NOCLOSE 0x00000010 /* don't auto-close on free */
+
struct socket_context {
enum socket_type type;
@@ -196,5 +198,6 @@ NTSTATUS socket_connect_multi(TALLOC_CTX *mem_ctx, const char *server_address,
struct socket_context **result,
uint16_t *port);
void set_socket_options(int fd, const char *options);
+void socket_set_flags(struct socket_context *socket, unsigned flags);
#endif /* _SAMBA_SOCKET_H */