[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Mon Jan 7 19:40:02 MST 2013


The branch, master has been updated
       via  eae01b0 samba-tool Add --service argument to samba-tool ntacl get/set
       via  cef5f46 pysmbd: Change to keyword based arguments
       via  4741cda scripting-provision: Set sysvol ACLs on the sysvol share
       via  0533905 scripting-ntacls: Optionally allow the service to be specified.
       via  813a3f0 pysmbd: Convert pysmbd to take an optional service to connect to
       via  5a3e915 smbd: Fix calls to create_conn_struct_cwd to be correctly indented.
       via  6c80cf7 smbd: Split create_conn_struct into a fn that does not change the working dir
      from  6a5afa2 spoolss: add stubs for new JobNamedProperty dcerpc calls.

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit eae01b0d3daf5bae9edada73669e3af879b000bb
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Dec 15 21:24:26 2012 +1100

    samba-tool Add --service argument to samba-tool ntacl get/set
    
    This also ensures a VFS connect is done to the correct service.
    
    Andrew Bartlett
    
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Jan  8 03:39:21 CET 2013 on sn-devel-104

commit cef5f466af80406d9a1ce0b37d1ed1d237d59be1
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Dec 15 21:17:30 2012 +1100

    pysmbd: Change to keyword based arguments
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 4741cda95668bee184cd2760848924fa4ad1e2bc
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Dec 14 22:17:23 2012 +1100

    scripting-provision: Set sysvol ACLs on the sysvol share
    
    This allows us to correctly load any modules that have been specified
    by the smb.conf for [sysvol] and issue a VFS connect operation which
    may be required by some VFS modules.
    
    Andrew Bartlett
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 0533905c5df2c0de4f2714df3e29ad90b48b1892
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Fri Dec 14 22:09:18 2012 +1100

    scripting-ntacls: Optionally allow the service to be specified.
    
    Providing a service allows a VFS connect to be issued on the correct
    service, and so ensures that the correct modules are loaded rather
    than just what is specified in [globals].
    
    Andrew Bartlett
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 813a3f0df91251dd7f920074ff8cd2b45bf48749
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Wed Oct 10 13:48:27 2012 +1100

    pysmbd: Convert pysmbd to take an optional service to connect to
    
    This uses create_conn_struct to correctly call VFS_CONNECT(), but only
    if a service has been specified.
    
    Andrew Bartlett
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5a3e915d20bb11984c42081bf25ce09baa58e04e
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jan 8 09:29:48 2013 +1100

    smbd: Fix calls to create_conn_struct_cwd to be correctly indented.
    
    These are whitespace changes only, left out of the previous commit to preserve clarity.
    
    Andrew Bartlett.
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6c80cf747d75e648a1d88d477bcf476e6874c4b3
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Wed Oct 10 13:47:49 2012 +1100

    smbd: Split create_conn_struct into a fn that does not change the working dir
    
    The python bindings do not want the current working directory changed
    during operations, so we provide two functions, one providing the
    original behaviour, and other providing the python bindings with just
    the memory allocation and initilisation stuff.
    
    Andrew Bartlett
    
    Reviewed-by: Jeremy Allison <jra at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/printing/nt_printing.c                     |   42 ++--
 source3/rpc_server/srvsvc/srv_srvsvc_nt.c          |   24 +-
 source3/smbd/msdfs.c                               |   90 ++++--
 source3/smbd/proto.h                               |   16 +-
 source3/smbd/pysmbd.c                              |  333 +++++++++++---------
 source4/scripting/python/samba/netcmd/ntacl.py     |   16 +-
 source4/scripting/python/samba/ntacls.py           |   12 +-
 .../scripting/python/samba/provision/__init__.py   |   37 ++-
 8 files changed, 336 insertions(+), 234 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/printing/nt_printing.c b/source3/printing/nt_printing.c
index 252fbb8..e09ee89 100644
--- a/source3/printing/nt_printing.c
+++ b/source3/printing/nt_printing.c
@@ -616,13 +616,13 @@ static uint32 get_correct_cversion(struct auth_session_info *session_info,
 		return -1;
 	}
 
-	nt_status = create_conn_struct(talloc_tos(),
-				       server_event_context(),
-				       server_messaging_context(),
-				       &conn,
-				       printdollar_snum,
-				       lp_pathname(talloc_tos(), printdollar_snum),
-				       session_info, &oldcwd);
+	nt_status = create_conn_struct_cwd(talloc_tos(),
+					   server_event_context(),
+					   server_messaging_context(),
+					   &conn,
+					   printdollar_snum,
+					   lp_pathname(talloc_tos(), printdollar_snum),
+					   session_info, &oldcwd);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DEBUG(0,("get_correct_cversion: create_conn_struct "
 			 "returned %s\n", nt_errstr(nt_status)));
@@ -1003,13 +1003,13 @@ WERROR move_driver_to_download_area(struct auth_session_info *session_info,
 		return WERR_NO_SUCH_SHARE;
 	}
 
-	nt_status = create_conn_struct(talloc_tos(),
-				       server_event_context(),
-				       server_messaging_context(),
-				       &conn,
-				       printdollar_snum,
-				       lp_pathname(talloc_tos(), printdollar_snum),
-				       session_info, &oldcwd);
+	nt_status = create_conn_struct_cwd(talloc_tos(),
+					   server_event_context(),
+					   server_messaging_context(),
+					   &conn,
+					   printdollar_snum,
+					   lp_pathname(talloc_tos(), printdollar_snum),
+					   session_info, &oldcwd);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DEBUG(0,("move_driver_to_download_area: create_conn_struct "
 			 "returned %s\n", nt_errstr(nt_status)));
@@ -1539,13 +1539,13 @@ bool delete_driver_files(const struct auth_session_info *session_info,
 		return false;
 	}
 
-	nt_status = create_conn_struct(talloc_tos(),
-				       server_event_context(),
-				       server_messaging_context(),
-				       &conn,
-				       printdollar_snum,
-				       lp_pathname(talloc_tos(), printdollar_snum),
-				       session_info, &oldcwd);
+	nt_status = create_conn_struct_cwd(talloc_tos(),
+					   server_event_context(),
+					   server_messaging_context(),
+					   &conn,
+					   printdollar_snum,
+					   lp_pathname(talloc_tos(), printdollar_snum),
+					   session_info, &oldcwd);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DEBUG(0,("delete_driver_files: create_conn_struct "
 			 "returned %s\n", nt_errstr(nt_status)));
diff --git a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
index a6472a6..2d58466 100644
--- a/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
+++ b/source3/rpc_server/srvsvc/srv_srvsvc_nt.c
@@ -2037,12 +2037,12 @@ WERROR _srvsvc_NetGetFileSecurity(struct pipes_struct *p,
 		goto error_exit;
 	}
 
-	nt_status = create_conn_struct(talloc_tos(),
-				       server_event_context(),
-				       server_messaging_context(),
-				       &conn,
-				       snum, lp_pathname(talloc_tos(), snum),
-				       p->session_info, &oldcwd);
+	nt_status = create_conn_struct_cwd(talloc_tos(),
+					   server_event_context(),
+					   server_messaging_context(),
+					   &conn,
+					   snum, lp_pathname(talloc_tos(), snum),
+					   p->session_info, &oldcwd);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DEBUG(10, ("create_conn_struct failed: %s\n",
 			   nt_errstr(nt_status)));
@@ -2184,12 +2184,12 @@ WERROR _srvsvc_NetSetFileSecurity(struct pipes_struct *p,
 		goto error_exit;
 	}
 
-	nt_status = create_conn_struct(talloc_tos(),
-				       server_event_context(),
-				       server_messaging_context(),
-				       &conn,
-				       snum, lp_pathname(talloc_tos(), snum),
-				       p->session_info, &oldcwd);
+	nt_status = create_conn_struct_cwd(talloc_tos(),
+					   server_event_context(),
+					   server_messaging_context(),
+					   &conn,
+					   snum, lp_pathname(talloc_tos(), snum),
+					   p->session_info, &oldcwd);
 	if (!NT_STATUS_IS_OK(nt_status)) {
 		DEBUG(10, ("create_conn_struct failed: %s\n",
 			   nt_errstr(nt_status)));
diff --git a/source3/smbd/msdfs.c b/source3/smbd/msdfs.c
index b6ebaca..e8a0610 100644
--- a/source3/smbd/msdfs.c
+++ b/source3/smbd/msdfs.c
@@ -218,8 +218,9 @@ static NTSTATUS parse_dfs_path(connection_struct *conn,
 }
 
 /********************************************************
- Fake up a connection struct for the VFS layer.
- Note: this performs a vfs connect and CHANGES CWD !!!! JRA.
+ Fake up a connection struct for the VFS layer, for use in
+ applications (such as the python bindings), that do not want the
+ global working directory changed under them.
 *********************************************************/
 
 NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
@@ -228,12 +229,10 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 			    connection_struct **pconn,
 			    int snum,
 			    const char *path,
-			    const struct auth_session_info *session_info,
-			    char **poldcwd)
+			    const struct auth_session_info *session_info)
 {
 	connection_struct *conn;
 	char *connpath;
-	char *oldcwd;
 	const char *vfs_user;
 
 	conn = talloc_zero(ctx, connection_struct);
@@ -247,9 +246,9 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 		return NT_STATUS_NO_MEMORY;
 	}
 	connpath = talloc_string_sub(conn,
-				connpath,
-				"%S",
-				lp_servicename(talloc_tos(), snum));
+				     connpath,
+				     "%S",
+				     lp_servicename(talloc_tos(), snum));
 	if (!connpath) {
 		TALLOC_FREE(conn);
 		return NT_STATUS_NO_MEMORY;
@@ -341,6 +340,37 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 	}
 
 	conn->fs_capabilities = SMB_VFS_FS_CAPABILITIES(conn, &conn->ts_res);
+	*pconn = conn;
+
+	return NT_STATUS_OK;
+}
+
+/********************************************************
+ Fake up a connection struct for the VFS layer.
+ Note: this performs a vfs connect and CHANGES CWD !!!! JRA.
+
+ The old working directory is returned on *poldcwd, allocated on ctx.
+*********************************************************/
+
+NTSTATUS create_conn_struct_cwd(TALLOC_CTX *ctx,
+				struct tevent_context *ev,
+				struct messaging_context *msg,
+				connection_struct **pconn,
+				int snum,
+				const char *path,
+				const struct auth_session_info *session_info,
+				char **poldcwd)
+{
+	connection_struct *conn;
+	char *oldcwd;
+
+	NTSTATUS status = create_conn_struct(ctx, ev,
+					     msg, &conn,
+					     snum, path,
+					     session_info);
+	if (!NT_STATUS_IS_OK(status)) {
+		return status;
+	}
 
 	/*
 	 * Windows seems to insist on doing trans2getdfsreferral() calls on
@@ -350,14 +380,14 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 
 	oldcwd = vfs_GetWd(ctx, conn);
 	if (oldcwd == NULL) {
-		NTSTATUS status = map_nt_error_from_unix(errno);
+		status = map_nt_error_from_unix(errno);
 		DEBUG(3, ("vfs_GetWd failed: %s\n", strerror(errno)));
 		conn_free(conn);
 		return status;
 	}
 
 	if (vfs_ChDir(conn,conn->connectpath) != 0) {
-		NTSTATUS status = map_nt_error_from_unix(errno);
+		status = map_nt_error_from_unix(errno);
 		DEBUG(3,("create_conn_struct: Can't ChDir to new conn path %s. "
 			"Error was %s\n",
 			conn->connectpath, strerror(errno) ));
@@ -981,11 +1011,11 @@ NTSTATUS get_referred_path(TALLOC_CTX *ctx,
 		return NT_STATUS_OK;
 	}
 
-	status = create_conn_struct(ctx,
-				    server_event_context(),
-				    server_messaging_context(),
-				    &conn, snum,
-				    lp_pathname(talloc_tos(), snum), NULL, &oldpath);
+	status = create_conn_struct_cwd(ctx,
+					server_event_context(),
+					server_messaging_context(),
+					&conn, snum,
+					lp_pathname(talloc_tos(), snum), NULL, &oldpath);
 	if (!NT_STATUS_IS_OK(status)) {
 		TALLOC_FREE(pdp);
 		return status;
@@ -1160,11 +1190,11 @@ static bool junction_to_local_path(const struct junction_map *jucn,
 	if(snum < 0) {
 		return False;
 	}
-	status = create_conn_struct(talloc_tos(),
-				    server_event_context(),
-				    server_messaging_context(),
-				    conn_out,
-				    snum, lp_pathname(talloc_tos(), snum), NULL, oldpath);
+	status = create_conn_struct_cwd(talloc_tos(),
+					server_event_context(),
+					server_messaging_context(),
+					conn_out,
+					snum, lp_pathname(talloc_tos(), snum), NULL, oldpath);
 	if (!NT_STATUS_IS_OK(status)) {
 		return False;
 	}
@@ -1325,11 +1355,11 @@ static int count_dfs_links(TALLOC_CTX *ctx, int snum)
 	 * Fake up a connection struct for the VFS layer.
 	 */
 
-	status = create_conn_struct(talloc_tos(),
-				    server_event_context(),
-				    server_messaging_context(),
-				    &conn,
-				    snum, connect_path, NULL, &cwd);
+	status = create_conn_struct_cwd(talloc_tos(),
+					server_event_context(),
+					server_messaging_context(),
+					&conn,
+					snum, connect_path, NULL, &cwd);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(3, ("create_conn_struct failed: %s\n",
 			  nt_errstr(status)));
@@ -1401,11 +1431,11 @@ static int form_junctions(TALLOC_CTX *ctx,
 	 * Fake up a connection struct for the VFS layer.
 	 */
 
-	status = create_conn_struct(ctx,
-				    server_event_context(),
-				    server_messaging_context(),
-				    &conn, snum, connect_path, NULL,
-				    &cwd);
+	status = create_conn_struct_cwd(ctx,
+					server_event_context(),
+					server_messaging_context(),
+					&conn, snum, connect_path, NULL,
+					&cwd);
 	if (!NT_STATUS_IS_OK(status)) {
 		DEBUG(3, ("create_conn_struct failed: %s\n",
 			  nt_errstr(status)));
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index 9a9a010..d7bfa65 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -490,8 +490,15 @@ NTSTATUS create_conn_struct(TALLOC_CTX *ctx,
 			    connection_struct **pconn,
 			    int snum,
 			    const char *path,
-			    const struct auth_session_info *session_info,
-			    char **poldcwd);
+			    const struct auth_session_info *session_info);
+NTSTATUS create_conn_struct_cwd(TALLOC_CTX *ctx,
+				struct tevent_context *ev,
+				struct messaging_context *msg,
+				connection_struct **pconn,
+				int snum,
+				const char *path,
+				const struct auth_session_info *session_info,
+				char **poldcwd);
 
 /* The following definitions come from smbd/negprot.c  */
 
@@ -728,8 +735,9 @@ bool set_unix_posix_default_acl(connection_struct *conn, const char *fname,
 				const SMB_STRUCT_STAT *psbuf,
 				uint16 num_def_acls, const char *pdata);
 bool set_unix_posix_acl(connection_struct *conn, files_struct *fsp, const char *fname, uint16 num_acls, const char *pdata);
-NTSTATUS get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname, uint32 security_info_wanted,
-				struct security_descriptor **sd);
+NTSTATUS get_nt_acl_no_snum( TALLOC_CTX *ctx, const char *fname,
+			     uint32 security_info_wanted,
+			     struct security_descriptor **sd);
 NTSTATUS make_default_filesystem_acl(TALLOC_CTX *ctx,
 					const char *name,
 					SMB_STRUCT_STAT *psbuf,
diff --git a/source3/smbd/pysmbd.c b/source3/smbd/pysmbd.c
index 42694cb..1bac9c2 100644
--- a/source3/smbd/pysmbd.c
+++ b/source3/smbd/pysmbd.c
@@ -36,80 +36,98 @@ extern const struct generic_mapping file_generic_mapping;
 #undef  DBGC_CLASS
 #define DBGC_CLASS DBGC_ACLS
 
-static NTSTATUS set_sys_acl_no_snum(const char *fname,
-				     SMB_ACL_TYPE_T acltype,
-				     SMB_ACL_T theacl)
+static int conn_free_wrapper(connection_struct *conn)
+{
+	conn_free(conn);
+	return 0;
+};
+
+static connection_struct *get_conn(TALLOC_CTX *mem_ctx, const char *service)
 {
 	connection_struct *conn;
+	TALLOC_CTX *frame = talloc_stackframe();
+	if (!posix_locking_init(false)) {
+		PyErr_NoMemory();
+		TALLOC_FREE(frame);
+		return NULL;
+	}
+
+	if (service) {
+		NTSTATUS status;
+		int snum = lp_servicenumber(service);
+		if (snum == -1) {
+			TALLOC_FREE(frame);
+			PyErr_SetString(PyExc_RuntimeError, "unknown service");
+			return NULL;
+		}
+		status = create_conn_struct(mem_ctx, NULL, NULL, &conn, snum, "/",
+					    NULL);
+		PyErr_NTSTATUS_IS_ERR_RAISE(status);
+	} else {
+		conn = talloc_zero(mem_ctx, connection_struct);
+		if (conn == NULL) {
+			DEBUG(0, ("talloc failed\n"));
+			TALLOC_FREE(frame);
+			PyErr_NoMemory();
+			return NULL;
+		}
+
+		if (!(conn->params = talloc(conn, struct share_params))) {
+			TALLOC_FREE(frame);
+			DEBUG(0,("get_conn: talloc() failed!\n"));
+			PyErr_NoMemory();
+			return NULL;
+		}
+		conn->params->service = -1;
+
+		set_conn_connectpath(conn, "/");
+
+		smbd_vfs_init(conn);
+	}
+	TALLOC_FREE(frame);
+	conn->read_only = false;
+	talloc_set_destructor(conn, conn_free_wrapper);
+	return conn;
+}
+
+static NTSTATUS set_sys_acl_conn(const char *fname,
+				 SMB_ACL_TYPE_T acltype,
+				 SMB_ACL_T theacl, connection_struct *conn)
+{
 	NTSTATUS status = NT_STATUS_OK;
 	int ret;
 	mode_t saved_umask;
 
-	conn = talloc_zero(NULL, connection_struct);
-	if (conn == NULL) {
-		DEBUG(0, ("talloc failed\n"));
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	if (!(conn->params = talloc(conn, struct share_params))) {
-		DEBUG(0,("set_sys_acl_no_snum: talloc() failed!\n"));
-		TALLOC_FREE(conn);
-		return NT_STATUS_NO_MEMORY;
-	}
+	TALLOC_CTX *frame = talloc_stackframe();
 
 	/* we want total control over the permissions on created files,
 	   so set our umask to 0 */
 	saved_umask = umask(0);
 
-	conn->params->service = -1;
-
-	set_conn_connectpath(conn, "/");
-
-	smbd_vfs_init(conn);
-
 	ret = SMB_VFS_SYS_ACL_SET_FILE( conn, fname, acltype, theacl);
 	if (ret != 0) {
 		status = map_nt_error_from_unix_common(ret);
-		DEBUG(0,("set_sys_acl_no_snum: SMB_VFS_SYS_ACL_SET_FILE "
+		DEBUG(0,("set_sys_acl_conn: SMB_VFS_SYS_ACL_SET_FILE "
 			 "returned zero.\n"));
 	}
 
 	umask(saved_umask);
 
-	conn_free(conn);
-
+	TALLOC_FREE(frame);
 	return status;
 }
 
-static NTSTATUS set_nt_acl_no_snum(const char *fname,
-				   uint32 security_info_sent, const struct security_descriptor *sd)
+static NTSTATUS set_nt_acl_conn(const char *fname,
+				uint32 security_info_sent, const struct security_descriptor *sd,
+				connection_struct *conn)
 {
 	TALLOC_CTX *frame = talloc_stackframe();
-	connection_struct *conn;
 	NTSTATUS status = NT_STATUS_OK;
 	files_struct *fsp;
 	struct smb_filename *smb_fname = NULL;
 	int flags, ret;
 	mode_t saved_umask;
 
-	if (!posix_locking_init(false)) {
-		TALLOC_FREE(frame);
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	conn = talloc_zero(frame, connection_struct);
-	if (conn == NULL) {
-		TALLOC_FREE(frame);
-		DEBUG(0, ("talloc failed\n"));
-		return NT_STATUS_NO_MEMORY;
-	}
-
-	if (!(conn->params = talloc(conn, struct share_params))) {
-		DEBUG(0,("set_nt_acl_no_snum: talloc() failed!\n"));
-		TALLOC_FREE(frame);
-		return NT_STATUS_NO_MEMORY;
-	}
-
 	fsp = talloc_zero(frame, struct files_struct);
 	if (fsp == NULL) {
 		TALLOC_FREE(frame);
@@ -126,12 +144,6 @@ static NTSTATUS set_nt_acl_no_snum(const char *fname,
 	   so set our umask to 0 */
 	saved_umask = umask(0);
 
-	conn->params->service = -1;
-
-	set_conn_connectpath(conn, "/");
-
-	smbd_vfs_init(conn);
-
 	status = create_synthetic_smb_fname_split(fsp, fname, NULL,
 						  &smb_fname);
 	if (!NT_STATUS_IS_OK(status)) {
@@ -197,6 +209,24 @@ static NTSTATUS set_nt_acl_no_snum(const char *fname,
 	return status;
 }
 
+static NTSTATUS get_nt_acl_conn(TALLOC_CTX *mem_ctx,
+				const char *fname,
+				connection_struct *conn,
+				uint32 security_info_wanted,
+				struct security_descriptor **sd)
+{
+	TALLOC_CTX *frame = talloc_stackframe();
+	NTSTATUS status = SMB_VFS_GET_NT_ACL( conn, fname, security_info_wanted,
+				     mem_ctx, sd);
+	if (!NT_STATUS_IS_OK(status)) {
+		DEBUG(0,("get_nt_acl_conn: get_nt_acl returned %s.\n", nt_errstr(status)));
+	}
+
+	TALLOC_FREE(frame);
+
+	return status;
+}
+
 
 static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode)
 {
@@ -301,22 +331,31 @@ static SMB_ACL_T make_simple_acl(gid_t gid, mode_t chmod_mode)
 /*
   set a simple ACL on a file, as a test
  */
-static PyObject *py_smbd_set_simple_acl(PyObject *self, PyObject *args)
+static PyObject *py_smbd_set_simple_acl(PyObject *self, PyObject *args, PyObject *kwargs)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list