]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libcli/smb: introduce smbXcli_transport_bsd
authorStefan Metzmacher <metze@samba.org>
Wed, 7 May 2025 12:21:31 +0000 (14:21 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 18 Jun 2025 17:52:37 +0000 (17:52 +0000)
The next commits will pass an smbXcli_transport to
smbXcli_conn_create() instead of a plain 'int fd'.

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 bf0ffb83702b03111552dea3c75676cb5d48ea1d..5c9a21d55761434f59b6f6c59c7cc84c006e3e46 100644 (file)
 #include <gnutls/gnutls.h>
 #include <gnutls/crypto.h>
 
+struct smbXcli_transport;
 struct smbXcli_conn;
 struct smbXcli_req;
 struct smbXcli_session;
 struct smbXcli_tcon;
 
+struct smbXcli_transport {
+       struct smb_transport transport;
+       int sock_fd;
+       struct samba_sockaddr laddr;
+       struct samba_sockaddr raddr;
+};
+
 struct smbXcli_conn {
        int sock_fd;
        struct sockaddr_storage local_ss;
@@ -310,6 +318,55 @@ struct smbXcli_req_state {
        } smb2;
 };
 
+static int smbXcli_transport_destructor(struct smbXcli_transport *xtp)
+{
+       if (xtp->sock_fd != -1) {
+               close(xtp->sock_fd);
+               xtp->sock_fd = -1;
+       }
+
+       return 0;
+}
+
+struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx,
+                                               int fd,
+                                               const struct smb_transport *tp)
+{
+       struct smbXcli_transport *xtp = NULL;
+       int ret;
+
+       xtp = talloc_zero(mem_ctx, struct smbXcli_transport);
+       if (xtp == NULL) {
+               return NULL;
+       }
+
+       xtp->transport = *tp;
+       xtp->sock_fd = fd;
+
+       xtp->laddr.sa_socklen = sizeof(xtp->laddr.u);
+       ret = getsockname(fd, &xtp->laddr.u.sa, &xtp->laddr.sa_socklen);
+       if (ret == -1) {
+               TALLOC_FREE(xtp);
+               return NULL;
+       }
+
+       xtp->raddr.sa_socklen = sizeof(xtp->raddr.u);
+       ret = getpeername(fd, &xtp->raddr.u.sa, &xtp->raddr.sa_socklen);
+       if (ret == -1) {
+               TALLOC_FREE(xtp);
+               return NULL;
+       }
+
+       ret = set_blocking(fd, false);
+       if (ret < 0) {
+               TALLOC_FREE(xtp);
+               return NULL;
+       }
+
+       talloc_set_destructor(xtp, smbXcli_transport_destructor);
+       return xtp;
+}
+
 static int smbXcli_conn_destructor(struct smbXcli_conn *conn)
 {
        /*
index 2e60201c9a021bdcfd30c551490405f70faf45ce..226ab5a7d8ff32a9d5dd253bd84a526c16305d3a 100644 (file)
@@ -30,6 +30,7 @@
 #include "lib/util/time.h"
 #include "lib/util/data_blob.h"
 
+struct smbXcli_transport;
 struct smbXcli_conn;
 struct smbXcli_session;
 struct smbXcli_tcon;
@@ -38,8 +39,13 @@ struct GUID;
 struct iovec;
 struct smb2_create_blobs;
 struct smb_create_returns;
+struct smb_transport;
 struct smb311_capabilities;
 
+struct smbXcli_transport *smbXcli_transport_bsd(TALLOC_CTX *mem_ctx,
+                                               int fd,
+                                               const struct smb_transport *tp);
+
 struct smbXcli_conn *smbXcli_conn_create(TALLOC_CTX *mem_ctx,
                                         int fd,
                                         const char *remote_name,