From 7b68bb03eac5449d404c0cc930afe2446b437cd7 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Fri, 16 May 2025 11:34:37 +0200 Subject: [PATCH] libcli/smb: add smbXcli_transport_bsd_tstream() This can be used to force the usage of the tstream code path even for bsd sockets. Signed-off-by: Stefan Metzmacher Reviewed-by: Volker Lendecke --- libcli/smb/smbXcli_base.c | 42 +++++++++++++++++++++++++++++++++++++++ libcli/smb/smbXcli_base.h | 5 +++++ 2 files changed, 47 insertions(+) diff --git a/libcli/smb/smbXcli_base.c b/libcli/smb/smbXcli_base.c index 46bdedadb83..2f21973f4a7 100644 --- a/libcli/smb/smbXcli_base.c +++ b/libcli/smb/smbXcli_base.c @@ -556,6 +556,48 @@ struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx, return xtp; } +struct smbXcli_transport *smbXcli_transport_bsd_tstream( + TALLOC_CTX *mem_ctx, + int *fd, + const struct smb_transport *tp) +{ + struct samba_sockaddr laddr = { + .sa_socklen = sizeof(struct sockaddr_storage), + }; + struct samba_sockaddr raddr = { + .sa_socklen = sizeof(struct sockaddr_storage), + }; + struct tstream_context *tstream = NULL; + struct smbXcli_transport *xtp = NULL; + int ret; + + ret = getsockname(*fd, &laddr.u.sa, &laddr.sa_socklen); + if (ret == -1) { + return NULL; + } + + ret = getpeername(*fd, &raddr.u.sa, &raddr.sa_socklen); + if (ret == -1) { + return NULL; + } + + ret = set_blocking(*fd, false); + if (ret < 0) { + return NULL; + } + + ret = tstream_bsd_existing_socket(mem_ctx, *fd, &tstream); + if (ret == -1) { + return NULL; + } + *fd = -1; + tstream_bsd_optimize_readv(tstream, true); + + xtp = smbXcli_transport_tstream(mem_ctx, &tstream, &laddr, &raddr, tp); + TALLOC_FREE(tstream); + return xtp; +} + static int smbXcli_conn_destructor(struct smbXcli_conn *conn) { /* diff --git a/libcli/smb/smbXcli_base.h b/libcli/smb/smbXcli_base.h index 7f28aeb3cab..8b5db773c98 100644 --- a/libcli/smb/smbXcli_base.h +++ b/libcli/smb/smbXcli_base.h @@ -54,6 +54,11 @@ struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx, int *_fd, const struct smb_transport *tp); +struct smbXcli_transport *smbXcli_transport_bsd_tstream( + TALLOC_CTX *mem_ctx, + int *fd, + const struct smb_transport *tp); + struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx, struct smbXcli_transport **ptransport, const char *remote_name, -- 2.47.3