smbd: Add make_smb2_posix_create_ctx()
authorVolker Lendecke <vl@samba.org>
Thu, 23 Jan 2020 20:14:44 +0000 (21:14 +0100)
committerJeremy Allison <jra@samba.org>
Fri, 7 Feb 2020 21:01:31 +0000 (21:01 +0000)
Will be used internally to pass an artificial posix create context
into VFS_CREATE_FILE from the SMB1 unix extension calls

Pair programmed with: Jeremy Allison <jra@samba.org>
Signed-off-by: Volker Lendecke <vl@samba.org>
libcli/smb/smb2_posix.c [new file with mode: 0644]
libcli/smb/smb2_posix.h [new file with mode: 0644]
libcli/smb/wscript

diff --git a/libcli/smb/smb2_posix.c b/libcli/smb/smb2_posix.c
new file mode 100644 (file)
index 0000000..60be321
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * SMB2 Posix context handling
+ *
+ * Copyright (C) Jeremy Allison 2019
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "replace.h"
+#include "libcli/smb/smb2_posix.h"
+#include "libcli/smb/smb2_constants.h"
+#include "lib/util/byteorder.h"
+
+NTSTATUS make_smb2_posix_create_ctx(
+       TALLOC_CTX *mem_ctx,
+       struct smb2_create_blobs **crb,
+       mode_t mode)
+{
+       struct smb2_create_blobs *cblobs = NULL;
+       uint8_t linear_mode[4];
+       DATA_BLOB blob = { .data=linear_mode, .length=sizeof(linear_mode) };
+       NTSTATUS status;
+
+       cblobs = talloc_zero(mem_ctx, struct smb2_create_blobs);
+       if (cblobs == NULL) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       SIVAL(&linear_mode,0, unix_perms_to_wire(mode & ~S_IFMT));
+
+       status = smb2_create_blob_add(
+               cblobs, cblobs, SMB2_CREATE_TAG_POSIX, blob);
+       if (!NT_STATUS_IS_OK(status)) {
+               TALLOC_FREE(cblobs);
+               return status;
+       }
+       *crb = cblobs;
+       return NT_STATUS_OK;
+}
diff --git a/libcli/smb/smb2_posix.h b/libcli/smb/smb2_posix.h
new file mode 100644 (file)
index 0000000..0751814
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Unix SMB/CIFS implementation.
+ *
+ * SMB2 Posix context handling
+ *
+ * Copyright (C) Jeremy Allison 2019
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _LIBCLI_SMB_SMB2_POSIX_H_
+#define _LIBCLI_SMB_SMB2_POSIX_H_
+
+#include "replace.h"
+#include "system/filesys.h"
+#include <talloc.h>
+#include "libcli/smb/smb2_create_blob.h"
+#include "libcli/smb/smb_util.h"
+
+NTSTATUS make_smb2_posix_create_ctx(
+       TALLOC_CTX *mem_ctx,
+       struct smb2_create_blobs **crb,
+       mode_t mode);
+
+#endif /* _LIBCLI_SMB_SMB2_POSIX_H_ */
index 66c2b9b7e709bda43416e159475a14edb5c0b804..86e377f570bc79a60d9d924db8f0ceec9970950d 100644 (file)
@@ -43,6 +43,7 @@ def build(bld):
            smb2cli_query_directory.c
            smb2cli_ioctl.c
            smb2cli_echo.c
+           smb2_posix.c
            tstream_smbXcli_np.c
     ''',
     deps='''
@@ -62,6 +63,7 @@ def build(bld):
                     smb2_lease.h
                     smb_util.h
                     smb_unix_ext.h
+                    smb_posix.h
                     tstream_smbXcli_np.h
     ''',
     )