[SCM] Samba Shared Repository - branch master updated
Jeremy Allison
jra at samba.org
Fri Jun 16 17:08:02 UTC 2023
The branch, master has been updated
via 96a64fb3333 smbd: smbd_dirptr_lanman2_match_fn(): Remove "exact_match" handling
via 079aad50ef4 smbd: Remove a smb1-only optimization findfirst/findnext
via cf4e55421bb smbd: Remove "a heuristic to avoid seeking the dirptr"
via 880eb2bd56d libsmb: Test smb1 mknod
via 41b094dd2ff pylibsmb: Add smb1_stat()
via efeb540602c pylibsmb: Add mknod()
via ca99d6a6ff4 libsmb: Add SMB1 posix cli_mknod
via c64699aeb0b rpc_server: Fix talloc hierarchy in _srvsvc_NetSrvGetInfo()
via 1cd2f38b54b profiling: Factor out functions to read smbprofile.tdb
via 18070a2d657 WHATSNEW: Mention removed "directory name cache size" parameter
via a4972336f12 lib: Add a few required #includes
via 2c610804fe3 winbind: Fix a typo
via 1b7fb13654f lib: Simplify two if-expressions
via 1d6f6f9529b smbd: Remove references to get_Protocol()
via c86fef84ef1 smbd: Modernize a DEBUG statement in smbd_dirptr_get_entry()
via 8a864e3f522 docs: Remove seekdir/telldir reference
via 007b5825de9 smbd: Fix a typo
via 12cbb043d10 libcli: Simplify security_token_is_sid()
via 9e2723988ef libcli: Simplify dom_sid_dup()
from 32fdc764efb s4:auth: Remove unneeded ‘sam_ctx’ parameter
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 96a64fb3333eb62f87e4b55e2c51fd501a13fd7f
Author: Volker Lendecke <vl at samba.org>
Date: Fri Jun 16 13:53:25 2023 +0200
smbd: smbd_dirptr_lanman2_match_fn(): Remove "exact_match" handling
No caller uses this anymore. The only downside here now is that we
always go directly to mask_match instead of a trying strcasecmp_m
first. I very much doubt this makes a measurable difference because
this would have been called for non-wildcard
readdirs (a.k.a. qpathinfo), and there we do this only once per
complete directory read. Also I don't believe mask_match() is
measurably more expensive than strcasecmp_m() for the usually short
filenames we're looking at here.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
Autobuild-User(master): Jeremy Allison <jra at samba.org>
Autobuild-Date(master): Fri Jun 16 17:07:46 UTC 2023 on atb-devel-224
commit 079aad50ef47f34453eee9911655872397635c88
Author: Volker Lendecke <vl at samba.org>
Date: Fri Jun 16 13:45:57 2023 +0200
smbd: Remove a smb1-only optimization findfirst/findnext
I don't think this is an effective optimization at all anymore. It was
intended to speed up non-wildcard readdirs after we found the correct
entry. Nowadays we do the non-wildcard readdirs by a direct fstatat,
and after we successfully found the entry dptr_ReadDirName()
immediately returns without any further action. So my very strong
guess is that this never really kicked in anymore. Not using this flag
can't be *that* bad, smb2 never used it.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit cf4e55421bbe809bd869781432f4c2385dbf41bc
Author: Volker Lendecke <vl at samba.org>
Date: Fri Jun 16 13:32:24 2023 +0200
smbd: Remove "a heuristic to avoid seeking the dirptr"
-- we don't seek the dirptr anymore
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 880eb2bd56d6044e7407f98cc0af45df616267ae
Author: Volker Lendecke <vl at samba.org>
Date: Thu Mar 9 16:16:50 2023 +0100
libsmb: Test smb1 mknod
Requires O_PATH to work correctly
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 41b094dd2ff313c37981755c606d4f1d6500def6
Author: Volker Lendecke <vl at samba.org>
Date: Thu Feb 16 17:20:55 2023 +0100
pylibsmb: Add smb1_stat()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit efeb540602c76566ee646d204f4eedbd775d573b
Author: Volker Lendecke <vl at samba.org>
Date: Thu Feb 16 16:43:46 2023 +0100
pylibsmb: Add mknod()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit ca99d6a6ff4b39bfa73e2b2efd1e8140424bb4e8
Author: Volker Lendecke <vl at samba.org>
Date: Thu Feb 16 13:41:44 2023 +0100
libsmb: Add SMB1 posix cli_mknod
This is a dead horse, but in the future it will make it easier to test
the smb311 unix extension code.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c64699aeb0bb67caddb830004f4db237b3dcfda8
Author: Volker Lendecke <vl at samba.org>
Date: Mon Apr 24 16:46:17 2023 +0200
rpc_server: Fix talloc hierarchy in _srvsvc_NetSrvGetInfo()
Make ->comment a proper talloc child of the right structure.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1cd2f38b54b7a79ae21a328075fae07cfdc5e9aa
Author: Volker Lendecke <vl at samba.org>
Date: Wed May 31 09:48:58 2023 +0200
profiling: Factor out functions to read smbprofile.tdb
We don't need all of Samba just to dump contents of this tdb, make
exporting profile information cheaper.
No direct use yet, but it's a good cleanup IMHO
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 18070a2d657c3daf80cb1387bcb721275b6c3946
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jun 14 07:23:52 2023 +0200
WHATSNEW: Mention removed "directory name cache size" parameter
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit a4972336f129efc2d7df802cef4d3a75d4761e21
Author: Volker Lendecke <vl at samba.org>
Date: Tue May 30 13:27:00 2023 +0200
lib: Add a few required #includes
You find them if you try to #include these files directly
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 2c610804fe35c683ef395f4e00b96012a5616877
Author: Volker Lendecke <vl at samba.org>
Date: Wed Apr 26 15:58:51 2023 +0200
winbind: Fix a typo
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1b7fb13654fba3f3a06189e86dafb0c5e483b0ca
Author: Volker Lendecke <vl at samba.org>
Date: Tue May 23 10:44:40 2023 +0200
lib: Simplify two if-expressions
This version looks easier to read to me.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 1d6f6f9529b137fac89688cd2a63887caeb579f8
Author: Volker Lendecke <vl at samba.org>
Date: Thu May 25 07:50:43 2023 +0200
smbd: Remove references to get_Protocol()
We have that available in smbXsrv_connection that is available almost
everywhere.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit c86fef84ef16630839b0e4ce98e03c28a95ded28
Author: Volker Lendecke <vl at samba.org>
Date: Thu Jun 15 15:41:35 2023 +0200
smbd: Modernize a DEBUG statement in smbd_dirptr_get_entry()
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 8a864e3f5222723f869c973c00bd3c850c76b4f2
Author: Volker Lendecke <vl at samba.org>
Date: Wed Jun 14 07:20:34 2023 +0200
docs: Remove seekdir/telldir reference
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 007b5825de98589a39735906413066d8bc89d811
Author: Volker Lendecke <vl at samba.org>
Date: Thu May 25 07:31:02 2023 +0200
smbd: Fix a typo
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 12cbb043d10b773ac292f61f33a81bd61b3c3aa5
Author: Volker Lendecke <vl at samba.org>
Date: Tue Apr 18 11:30:26 2023 +0200
libcli: Simplify security_token_is_sid()
Avoid an explicit if-statement.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
commit 9e2723988ef3d8e3c84f812a48475e095f3dcaee
Author: Volker Lendecke <vl at samba.org>
Date: Tue Apr 18 13:39:09 2023 +0200
libcli: Simplify dom_sid_dup()
We have sid_copy() for this.
Signed-off-by: Volker Lendecke <vl at samba.org>
Reviewed-by: Jeremy Allison <jra at samba.org>
-----------------------------------------------------------------------
Summary of changes:
WHATSNEW.txt | 1 +
docs-xml/manpages/vfs_full_audit.8.xml | 2 -
lib/crypto/gnutls_helpers.h | 1 +
libcli/security/dom_sid.c | 15 +--
libcli/security/security_token.c | 8 +-
python/samba/tests/smb1posix.py | 20 +++
selftest/skip.opath-required | 7 ++
source3/include/smbprofile.h | 8 ++
source3/lib/util.c | 18 +--
source3/libsmb/clifile.c | 134 ++++++++++++++++++++
source3/libsmb/proto.h | 8 ++
source3/libsmb/pylibsmb.c | 120 ++++++++++++++++++
source3/profile/profile.c | 144 +--------------------
source3/profile/profile_read.c | 202 ++++++++++++++++++++++++++++++
source3/rpc_server/srvsvc/srv_srvsvc_nt.c | 10 +-
source3/smbd/dir.c | 6 +-
source3/smbd/globals.h | 1 -
source3/smbd/smb1_nttrans.c | 4 +-
source3/smbd/smb1_reply.c | 22 ++--
source3/smbd/smb1_sesssetup.c | 4 +-
source3/smbd/smb1_trans2.c | 145 +++++++++------------
source3/smbd/smb2_query_directory.c | 2 -
source3/smbd/smb2_trans2.c | 56 +--------
source3/utils/conn_tdb.h | 2 +
source3/winbindd/wb_query_user_list.c | 2 +-
source3/wscript_build | 5 +-
source4/lib/messaging/irpc.h | 1 +
source4/lib/messaging/messaging.h | 2 +
28 files changed, 616 insertions(+), 334 deletions(-)
create mode 100644 source3/profile/profile_read.c
Changeset truncated at 500 lines:
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 8fbf1b59dbd..f760b24ef22 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -55,6 +55,7 @@ smb.conf changes
Parameter Name Description Default
-------------- ----------- -------
winbind debug traceid Add traceid No
+ directory name cache size Removed
KNOWN ISSUES
diff --git a/docs-xml/manpages/vfs_full_audit.8.xml b/docs-xml/manpages/vfs_full_audit.8.xml
index 401ac5a0d8f..9a9f1efc33b 100644
--- a/docs-xml/manpages/vfs_full_audit.8.xml
+++ b/docs-xml/manpages/vfs_full_audit.8.xml
@@ -126,7 +126,6 @@
<member>removexattr</member>
<member>renameat</member>
<member>rewinddir</member>
- <member>seekdir</member>
<member>sendfile</member>
<member>set_compression</member>
<member>set_offline</member>
@@ -142,7 +141,6 @@
<member>sys_acl_delete_def_fd</member>
<member>sys_acl_get_fd</member>
<member>sys_acl_set_fd</member>
- <member>telldir</member>
<member>translate_name</member>
<member>unlinkat</member>
<member>write</member>
diff --git a/lib/crypto/gnutls_helpers.h b/lib/crypto/gnutls_helpers.h
index 6719a599604..4e6f4f3f8b1 100644
--- a/lib/crypto/gnutls_helpers.h
+++ b/lib/crypto/gnutls_helpers.h
@@ -22,6 +22,7 @@
#include "libcli/util/ntstatus.h"
#include "libcli/util/werror.h"
+#include "lib/util/data_blob.h"
/* Those macros are only available in GnuTLS >= 3.6.4 */
#ifndef GNUTLS_FIPS140_SET_LAX_MODE
diff --git a/libcli/security/dom_sid.c b/libcli/security/dom_sid.c
index 52d4454e4e5..9a91760ff62 100644
--- a/libcli/security/dom_sid.c
+++ b/libcli/security/dom_sid.c
@@ -290,7 +290,6 @@ struct dom_sid *dom_sid_parse_length(TALLOC_CTX *mem_ctx, const DATA_BLOB *sid)
struct dom_sid *dom_sid_dup(TALLOC_CTX *mem_ctx, const struct dom_sid *dom_sid)
{
struct dom_sid *ret;
- int i;
if (!dom_sid) {
return NULL;
@@ -300,19 +299,7 @@ struct dom_sid *dom_sid_dup(TALLOC_CTX *mem_ctx, const struct dom_sid *dom_sid)
if (!ret) {
return NULL;
}
-
- ret->sid_rev_num = dom_sid->sid_rev_num;
- ret->id_auth[0] = dom_sid->id_auth[0];
- ret->id_auth[1] = dom_sid->id_auth[1];
- ret->id_auth[2] = dom_sid->id_auth[2];
- ret->id_auth[3] = dom_sid->id_auth[3];
- ret->id_auth[4] = dom_sid->id_auth[4];
- ret->id_auth[5] = dom_sid->id_auth[5];
- ret->num_auths = dom_sid->num_auths;
-
- for (i=0;i<dom_sid->num_auths;i++) {
- ret->sub_auths[i] = dom_sid->sub_auths[i];
- }
+ sid_copy(ret, dom_sid);
return ret;
}
diff --git a/libcli/security/security_token.c b/libcli/security/security_token.c
index 31be678941e..a80637f0ce1 100644
--- a/libcli/security/security_token.c
+++ b/libcli/security/security_token.c
@@ -67,13 +67,13 @@ void security_token_debug(int dbg_class, int dbg_lev, const struct security_toke
bool security_token_is_sid(const struct security_token *token, const struct dom_sid *sid)
{
+ bool ret;
+
if (token->sids == NULL) {
return false;
}
- if (dom_sid_equal(&token->sids[PRIMARY_USER_SID_INDEX], sid)) {
- return true;
- }
- return false;
+ ret = dom_sid_equal(&token->sids[PRIMARY_USER_SID_INDEX], sid);
+ return ret;
}
bool security_token_is_system(const struct security_token *token)
diff --git a/python/samba/tests/smb1posix.py b/python/samba/tests/smb1posix.py
index 52b0312ac8b..d77c49d0664 100644
--- a/python/samba/tests/smb1posix.py
+++ b/python/samba/tests/smb1posix.py
@@ -19,6 +19,7 @@ from samba.samba3 import libsmb_samba_internal as libsmb
from samba import (ntstatus,NTSTATUSError)
from samba.dcerpc import security as sec
import samba.tests.libsmb
+import stat
class Smb1PosixTests(samba.tests.libsmb.LibsmbTests):
@@ -47,6 +48,25 @@ class Smb1PosixTests(samba.tests.libsmb.LibsmbTests):
conn.rmdir("lower/second")
conn.rmdir("lower")
+ def test_mknod(self):
+ """Test SMB1 posix mknod"""
+ conn = libsmb.Conn(
+ self.server_ip,
+ "posix_share",
+ self.lp,
+ self.creds,
+ force_smb1=True)
+ conn.smb1_posix()
+
+ def do_test(name, filetype):
+ conn.mknod(name, filetype | 0o755)
+ st = conn.smb1_stat(name)
+ self.assertEqual(st["mode"], filetype | 0o755)
+ conn.unlink(name)
+
+ do_test("fifo", stat.S_IFIFO)
+ do_test("sock", stat.S_IFSOCK)
+
if __name__ == '__main__':
import unittest
unittest.main()
diff --git a/selftest/skip.opath-required b/selftest/skip.opath-required
index 0faf0c4bd6c..c3a13f5ec6e 100644
--- a/selftest/skip.opath-required
+++ b/selftest/skip.opath-required
@@ -7,3 +7,10 @@
# These fail because become_root() doesn't work in make test
^samba3.blackbox.dropbox.*
^samba3.raw.samba3hide.*
+
+# samba.tests.smb1posix.samba.tests.smb1posix.Smb1PosixTests.test_mknod
+# creates a socket and posix stat() gives an error because opening the
+# socket from filename_covert_dirfsp() returns ENXIO. With O_PATH
+# available this works fine. So for now restrict testing posix
+# extensions to environments where we have O_PATH around
+^samba.tests.smb1posix
diff --git a/source3/include/smbprofile.h b/source3/include/smbprofile.h
index 62873a5532b..91af220051d 100644
--- a/source3/include/smbprofile.h
+++ b/source3/include/smbprofile.h
@@ -21,6 +21,10 @@
*/
+#include "replace.h"
+#include <tdb.h>
+#include "lib/util/time.h"
+
struct tevent_context;
#ifdef WITH_PROFILE
@@ -514,6 +518,10 @@ void smbprofile_dump(void);
void smbprofile_cleanup(pid_t pid, pid_t dst);
void smbprofile_stats_accumulate(struct profile_stats *acc,
const struct profile_stats *add);
+int smbprofile_magic(const struct profile_stats *stats, uint64_t *_magic);
+void smbprofile_collect_tdb(struct tdb_context *tdb,
+ uint64_t magic,
+ struct profile_stats *stats);
void smbprofile_collect(struct profile_stats *stats);
static inline uint64_t profile_timestamp(void)
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 9fd913ba729..922b7ad83d9 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -119,11 +119,8 @@ uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf)
bool check_same_dev_ino(const SMB_STRUCT_STAT *sbuf1,
const SMB_STRUCT_STAT *sbuf2)
{
- if (sbuf1->st_ex_dev != sbuf2->st_ex_dev ||
- sbuf1->st_ex_ino != sbuf2->st_ex_ino) {
- return false;
- }
- return true;
+ return ((sbuf1->st_ex_dev == sbuf2->st_ex_dev) &&
+ (sbuf1->st_ex_ino == sbuf2->st_ex_ino));
}
/****************************************************************************
@@ -131,14 +128,11 @@ bool check_same_dev_ino(const SMB_STRUCT_STAT *sbuf1,
****************************************************************************/
bool check_same_stat(const SMB_STRUCT_STAT *sbuf1,
- const SMB_STRUCT_STAT *sbuf2)
+ const SMB_STRUCT_STAT *sbuf2)
{
- if (sbuf1->st_ex_uid != sbuf2->st_ex_uid ||
- sbuf1->st_ex_gid != sbuf2->st_ex_gid ||
- !check_same_dev_ino(sbuf1, sbuf2)) {
- return false;
- }
- return true;
+ return ((sbuf1->st_ex_uid == sbuf2->st_ex_uid) &&
+ (sbuf1->st_ex_gid == sbuf2->st_ex_gid) &&
+ check_same_dev_ino(sbuf1, sbuf2));
}
/*******************************************************************
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index ecc652c81e6..6acca11211e 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -1178,6 +1178,140 @@ NTSTATUS cli_posix_chown(struct cli_state *cli,
return status;
}
+struct cli_smb1_posix_mknod_state {
+ uint8_t data[100];
+};
+
+static void cli_smb1_posix_mknod_done(struct tevent_req *subreq);
+
+static struct tevent_req *cli_smb1_posix_mknod_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname,
+ mode_t mode,
+ dev_t dev)
+{
+ struct tevent_req *req = NULL, *subreq = NULL;
+ struct cli_smb1_posix_mknod_state *state = NULL;
+ mode_t type = mode & S_IFMT;
+ uint32_t smb_unix_type = 0xFFFFFFFF;
+
+ req = tevent_req_create(
+ mem_ctx, &state, struct cli_smb1_posix_mknod_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ /*
+ * Set all sizes/times/ids to no change.
+ */
+ memset(state->data, 0xff, 56);
+
+ switch (type) {
+ case S_IFREG:
+ smb_unix_type = UNIX_TYPE_FILE;
+ break;
+ case S_IFDIR:
+ smb_unix_type = UNIX_TYPE_DIR;
+ break;
+ case S_IFLNK:
+ smb_unix_type = UNIX_TYPE_SYMLINK;
+ break;
+ case S_IFCHR:
+ smb_unix_type = UNIX_TYPE_CHARDEV;
+ break;
+ case S_IFBLK:
+ smb_unix_type = UNIX_TYPE_BLKDEV;
+ break;
+ case S_IFIFO:
+ smb_unix_type = UNIX_TYPE_FIFO;
+ break;
+ case S_IFSOCK:
+ smb_unix_type = UNIX_TYPE_SOCKET;
+ break;
+ }
+ PUSH_LE_U32(state->data, 56, smb_unix_type);
+
+ if ((type == S_IFCHR) || (type == S_IFBLK)) {
+ PUSH_LE_U64(state->data, 60, unix_dev_major(dev));
+ PUSH_LE_U64(state->data, 68, unix_dev_minor(dev));
+ }
+
+ PUSH_LE_U32(state->data, 84, unix_perms_to_wire(mode));
+
+ subreq = cli_setpathinfo_send(
+ state,
+ ev,
+ cli,
+ SMB_SET_FILE_UNIX_BASIC,
+ fname,
+ state->data,
+ sizeof(state->data));
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, cli_smb1_posix_mknod_done, req);
+ return req;
+}
+
+static void cli_smb1_posix_mknod_done(struct tevent_req *subreq)
+{
+ NTSTATUS status = cli_setpathinfo_recv(subreq);
+ tevent_req_simple_finish_ntstatus(subreq, status);
+}
+
+static NTSTATUS cli_smb1_posix_mknod_recv(struct tevent_req *req)
+{
+ return tevent_req_simple_recv_ntstatus(req);
+}
+
+struct cli_mknod_state {
+ uint8_t dummy;
+};
+
+static void cli_mknod_done1(struct tevent_req *subreq);
+
+struct tevent_req *cli_mknod_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname,
+ mode_t mode,
+ dev_t dev)
+{
+ struct tevent_req *req = NULL, *subreq = NULL;
+ struct cli_mknod_state *state = NULL;
+
+ req = tevent_req_create(mem_ctx, &state, struct cli_mknod_state);
+ if (req == NULL) {
+ return NULL;
+ }
+
+ if (cli->requested_posix_capabilities != 0) {
+ subreq = cli_smb1_posix_mknod_send(
+ state, ev, cli, fname, mode, dev);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, cli_mknod_done1, req);
+ return req;
+ }
+
+ tevent_req_nterror(req, NT_STATUS_NOT_IMPLEMENTED);
+ return tevent_req_post(req, ev);
+}
+
+static void cli_mknod_done1(struct tevent_req *subreq)
+{
+ NTSTATUS status = cli_smb1_posix_mknod_recv(subreq);
+ tevent_req_simple_finish_ntstatus(subreq, status);
+}
+
+NTSTATUS cli_mknod_recv(struct tevent_req *req)
+{
+ return tevent_req_simple_recv_ntstatus(req);
+}
+
/****************************************************************************
Rename a file.
****************************************************************************/
diff --git a/source3/libsmb/proto.h b/source3/libsmb/proto.h
index 3bac88c2ee4..4905702c0dc 100644
--- a/source3/libsmb/proto.h
+++ b/source3/libsmb/proto.h
@@ -327,6 +327,14 @@ NTSTATUS cli_posix_chown(struct cli_state *cli,
const char *fname,
uid_t uid,
gid_t gid);
+struct tevent_req *cli_mknod_send(
+ TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname,
+ mode_t mode,
+ dev_t dev);
+NTSTATUS cli_mknod_recv(struct tevent_req *req);
struct tevent_req *cli_rename_send(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct cli_state *cli,
diff --git a/source3/libsmb/pylibsmb.c b/source3/libsmb/pylibsmb.c
index bace98ddd3a..6199f7b32dc 100644
--- a/source3/libsmb/pylibsmb.c
+++ b/source3/libsmb/pylibsmb.c
@@ -2508,6 +2508,116 @@ static PyObject *py_smb_smb1_symlink(
Py_RETURN_NONE;
}
+static PyObject *py_smb_smb1_stat(
+ struct py_cli_state *self, PyObject *args)
+{
+ NTSTATUS status;
+ const char *fname = NULL;
+ struct tevent_req *req = NULL;
+ struct stat_ex sbuf = { .st_ex_nlink = 0, };
+
+ if (!PyArg_ParseTuple(args, "s:smb1_stat", &fname)) {
+ return NULL;
+ }
+
+ req = cli_posix_stat_send(NULL, self->ev, self->cli, fname);
+ if (!py_tevent_req_wait_exc(self, req)) {
+ return NULL;
+ }
+ status = cli_posix_stat_recv(req, &sbuf);
+ TALLOC_FREE(req);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return NULL;
+ }
+
+ return Py_BuildValue(
+ "{sLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsLsL}",
+ "dev",
+ (unsigned long long)sbuf.st_ex_dev,
+ "ino",
+ (unsigned long long)sbuf.st_ex_ino,
+ "mode",
+ (unsigned long long)sbuf.st_ex_mode,
+ "nlink",
+ (unsigned long long)sbuf.st_ex_nlink,
+ "uid",
+ (unsigned long long)sbuf.st_ex_uid,
+ "gid",
+ (unsigned long long)sbuf.st_ex_gid,
+ "rdev",
+ (unsigned long long)sbuf.st_ex_size,
+ "atime_sec",
+ (unsigned long long)sbuf.st_ex_atime.tv_sec,
+ "atime_nsec",
+ (unsigned long long)sbuf.st_ex_atime.tv_nsec,
+ "mtime_sec",
+ (unsigned long long)sbuf.st_ex_mtime.tv_sec,
+ "mtime_nsec",
+ (unsigned long long)sbuf.st_ex_mtime.tv_nsec,
+ "ctime_sec",
+ (unsigned long long)sbuf.st_ex_ctime.tv_sec,
+ "ctime_nsec",
+ (unsigned long long)sbuf.st_ex_ctime.tv_nsec,
+ "btime_sec",
+ (unsigned long long)sbuf.st_ex_btime.tv_sec,
+ "btime_nsec",
+ (unsigned long long)sbuf.st_ex_btime.tv_nsec,
+ "cached_dos_attributes",
+ (unsigned long long)sbuf.cached_dos_attributes,
+ "blksize",
+ (unsigned long long)sbuf.st_ex_blksize,
+ "blocks",
+ (unsigned long long)sbuf.st_ex_blocks,
+ "flags",
+ (unsigned long long)sbuf.st_ex_flags,
+ "iflags",
+ (unsigned long long)sbuf.st_ex_iflags);
+}
+
+static PyObject *py_cli_mknod(
+ struct py_cli_state *self, PyObject *args, PyObject *kwds)
+{
+ char *fname = NULL;
+ int mode = 0, major = 0, minor = 0, dev = 0;
+ struct tevent_req *req = NULL;
+ static const char *kwlist[] = {
+ "fname", "mode", "major", "minor", NULL,
+ };
+ NTSTATUS status;
+ bool ok;
+
+ ok = ParseTupleAndKeywords(
+ args,
+ kwds,
+ "sI|II:mknod",
+ kwlist,
+ &fname,
+ &mode,
+ &major,
+ &minor);
+ if (!ok) {
+ return NULL;
+ }
+
+#if defined(HAVE_MAKEDEV)
+ dev = makedev(major, minor);
+#endif
+
+ req = cli_mknod_send(
+ NULL, self->ev, self->cli, fname, mode, dev);
+ if (!py_tevent_req_wait_exc(self, req)) {
+ return NULL;
+ }
+ status = cli_mknod_recv(req);
+ TALLOC_FREE(req);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
static PyObject *py_cli_fsctl(
struct py_cli_state *self, PyObject *args, PyObject *kwds)
{
--
Samba Shared Repository
More information about the samba-cvs
mailing list