]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libcli/smb: add smbXcli_transport_bsd_tstream()
authorStefan Metzmacher <metze@samba.org>
Fri, 16 May 2025 09:34:37 +0000 (11:34 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 18 Jun 2025 17:52:37 +0000 (17:52 +0000)
This can be used to force the usage of the tstream code path even
for bsd sockets.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
libcli/smb/smbXcli_base.c
libcli/smb/smbXcli_base.h

index 46bdedadb83c8b985105f5735c3072e0bdfd2aea..2f21973f4a782d9267cfc90b78b888223a78f26e 100644 (file)
@@ -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)
 {
        /*
index 7f28aeb3cab90a3290581c31d9babe7f71c4ee1c..8b5db773c980ab10b353d0124202f102e93cb9a6 100644 (file)
@@ -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,