svn commit: samba r21644 - in branches: SAMBA_3_0/source/libsmb SAMBA_3_0/source/smbd SAMBA_3_0_25/source/libsmb SAMBA_3_0_25/source/smbd

jra at samba.org jra at samba.org
Thu Mar 1 22:44:05 GMT 2007


Author: jra
Date: 2007-03-01 22:44:02 +0000 (Thu, 01 Mar 2007)
New Revision: 21644

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=21644

Log:
Allow mkdir on platforms with no O_DIRECTORY.
Add proper debug to all possible setfilepathinfo
functions.
Jeremy.

Modified:
   branches/SAMBA_3_0/source/libsmb/clifile.c
   branches/SAMBA_3_0/source/smbd/trans2.c
   branches/SAMBA_3_0_25/source/libsmb/clifile.c
   branches/SAMBA_3_0_25/source/smbd/trans2.c


Changeset:
Modified: branches/SAMBA_3_0/source/libsmb/clifile.c
===================================================================
--- branches/SAMBA_3_0/source/libsmb/clifile.c	2007-03-01 22:15:30 UTC (rev 21643)
+++ branches/SAMBA_3_0/source/libsmb/clifile.c	2007-03-01 22:44:02 UTC (rev 21644)
@@ -1822,7 +1822,7 @@
  Open a file - POSIX semantics. Returns fnum. Doesn't request oplock.
 ****************************************************************************/
 
-int cli_posix_open(struct cli_state *cli, const char *fname, int flags, mode_t mode)
+static int cli_posix_open_internal(struct cli_state *cli, const char *fname, int flags, mode_t mode, BOOL is_dir)
 {
 	unsigned int data_len = 0;
 	unsigned int param_len = 0;
@@ -1832,6 +1832,7 @@
 	char *rparam=NULL, *rdata=NULL;
 	char *p;
 	int fnum = -1;
+	uint32 wire_flags = open_flags_to_wire(flags);
 
 	memset(param, 0, sizeof(param));
 	SSVAL(param,0, SMB_POSIX_PATH_OPEN);
@@ -1840,11 +1841,14 @@
 	p += clistr_push(cli, p, fname, sizeof(param)-6, STR_TERMINATE);
 	param_len = PTR_DIFF(p, param);
 
-	/* Convert flags to wire_open_mode. */
+	if (is_dir) {
+		wire_flags &= ~(SMB_O_RDONLY|SMB_O_RDWR|SMB_O_WRONLY);
+		wire_flags |= SMB_O_DIRECTORY;
+	}
 
 	p = data;
 	SIVAL(p,0,0); /* No oplock. */
-	SIVAL(p,4,open_flags_to_wire(flags));
+	SIVAL(p,4,wire_flags);
 	SIVAL(p,8,unix_perms_to_wire(mode));
 	SSVAL(p,12,SMB_NO_INFO_LEVEL_RETURNED); /* No info level returned. */
 
@@ -1875,17 +1879,21 @@
 }
 
 /****************************************************************************
+ open - POSIX semantics.
+****************************************************************************/
+
+int cli_posix_open(struct cli_state *cli, const char *fname, int flags, mode_t mode)
+{
+	return cli_posix_open_internal(cli, fname, flags, mode, False);
+}
+
+/****************************************************************************
  mkdir - POSIX semantics.
 ****************************************************************************/
 
 int cli_posix_mkdir(struct cli_state *cli, const char *fname, mode_t mode)
 {
-#if defined(O_DIRECTORY)
-	return (cli_posix_open(cli, fname, O_CREAT|O_DIRECTORY, mode) == -1) ? -1 : 0;
-#else
-	cli_set_nt_error(cli, NT_STATUS_NOT_IMPLEMENTED);
-	return -1;
-#endif
+	return (cli_posix_open_internal(cli, fname, O_CREAT, mode, True) == -1) ? -1 : 0;
 }
 
 /****************************************************************************

Modified: branches/SAMBA_3_0/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0/source/smbd/trans2.c	2007-03-01 22:15:30 UTC (rev 21643)
+++ branches/SAMBA_3_0/source/smbd/trans2.c	2007-03-01 22:44:02 UTC (rev 21644)
@@ -4305,6 +4305,11 @@
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
+	DEBUG(10,("smb_set_posix_acl: file %s num_file_acls = %u, num_def_acls = %u\n",
+		fname ? fname : fsp->fsp_name,
+		(unsigned int)num_file_acls,
+		(unsigned int)num_def_acls));
+
 	if (valid_file_acls && !set_unix_posix_acl(conn, fsp, fname, num_file_acls,
 			pdata + SMB_POSIX_ACL_HEADER_SIZE)) {
 		return map_nt_error_from_unix(errno);
@@ -4386,6 +4391,14 @@
 	count = (SMB_BIG_UINT)IVAL(pdata,POSIX_LOCK_LEN_OFFSET);
 #endif /* HAVE_LONGLONG */
 
+	DEBUG(10,("smb_set_posix_lock: file %s, lock_type = %u,"
+			"lock_pid = %u, count = %.0f, offset = %.0f\n",
+		fsp->fsp_name,
+		(unsigned int)lock_type,
+		(unsigned int)lock_pid,
+		(double)count,
+		(double)offset ));
+
 	if (lock_type == UNLOCK_LOCK) {
 		status = do_unlock(fsp,
 				lock_pid,
@@ -4450,6 +4463,9 @@
 	/* write time */
 	tvs.modtime = srv_make_unix_date2(pdata+l1_fdateLastWrite);
 
+	DEBUG(10,("smb_set_info_standard: file %s\n",
+		fname ? fname : fsp->fsp_name ));
+
 	return smb_set_file_time(conn,
 				fsp,
 				fname,
@@ -4507,6 +4523,9 @@
 		tvs.modtime = null_mtime(write_time) ? changed_time : write_time;
 	}
 
+	DEBUG(10,("smb_set_file_basic_info: file %s\n",
+		fname ? fname : fsp->fsp_name ));
+
 	return smb_set_file_time(conn,
 				fsp,
 				fname,
@@ -4910,6 +4929,9 @@
 
 	mod_unixmode = (uint32)unixmode | FILE_FLAG_POSIX_SEMANTICS;
 
+	DEBUG(10,("smb_posix_mkdir: file %s, mode 0%o\n",
+		fname, (unsigned int)unixmode ));
+
 	status = open_directory(conn,
 				fname,
 				psbuf,
@@ -5056,6 +5078,11 @@
 		mod_unixmode |= FILE_FLAG_NO_BUFFERING;
 	}
 
+	DEBUG(10,("smb_posix_open: file %s, smb_posix_flags = %u, mode 0%o\n",
+		fname,
+		(unsigned int)wire_open_mode,
+		(unsigned int)unixmode ));
+
 	status = open_file_ntcreate(conn,
 				fname,
 				psbuf,
@@ -5150,6 +5177,10 @@
 		return NT_STATUS_NOT_A_DIRECTORY;
 	}
 
+	DEBUG(10,("smb_posix_unlink: %s %s\n",
+		(flags == SMB_POSIX_UNLINK_DIRECTORY_TARGET) ? "directory" : "file",
+		fname));
+
 	if (VALID_STAT_OF_DIR(*psbuf)) {
 		status = open_directory(conn,
 					fname,

Modified: branches/SAMBA_3_0_25/source/libsmb/clifile.c
===================================================================
--- branches/SAMBA_3_0_25/source/libsmb/clifile.c	2007-03-01 22:15:30 UTC (rev 21643)
+++ branches/SAMBA_3_0_25/source/libsmb/clifile.c	2007-03-01 22:44:02 UTC (rev 21644)
@@ -1831,7 +1831,7 @@
  Open a file - POSIX semantics. Returns fnum. Doesn't request oplock.
 ****************************************************************************/
 
-int cli_posix_open(struct cli_state *cli, const char *fname, int flags, mode_t mode)
+static int cli_posix_open_internal(struct cli_state *cli, const char *fname, int flags, mode_t mode, BOOL is_dir)
 {
 	unsigned int data_len = 0;
 	unsigned int param_len = 0;
@@ -1841,6 +1841,7 @@
 	char *rparam=NULL, *rdata=NULL;
 	char *p;
 	int fnum = -1;
+	uint32 wire_flags = open_flags_to_wire(flags);
 
 	memset(param, 0, sizeof(param));
 	SSVAL(param,0, SMB_POSIX_PATH_OPEN);
@@ -1849,11 +1850,14 @@
 	p += clistr_push(cli, p, fname, sizeof(param)-6, STR_TERMINATE);
 	param_len = PTR_DIFF(p, param);
 
-	/* Convert flags to wire_open_mode. */
+	if (is_dir) {
+		wire_flags &= ~(SMB_O_RDONLY|SMB_O_RDWR|SMB_O_WRONLY);
+		wire_flags |= SMB_O_DIRECTORY;
+	}
 
 	p = data;
 	SIVAL(p,0,0); /* No oplock. */
-	SIVAL(p,4,open_flags_to_wire(flags));
+	SIVAL(p,4,wire_flags);
 	SIVAL(p,8,unix_perms_to_wire(mode));
 	SSVAL(p,12,SMB_NO_INFO_LEVEL_RETURNED); /* No info level returned. */
 
@@ -1884,17 +1888,21 @@
 }
 
 /****************************************************************************
+ open - POSIX semantics.
+****************************************************************************/
+
+int cli_posix_open(struct cli_state *cli, const char *fname, int flags, mode_t mode)
+{
+	return cli_posix_open_internal(cli, fname, flags, mode, False);
+}
+
+/****************************************************************************
  mkdir - POSIX semantics.
 ****************************************************************************/
 
 int cli_posix_mkdir(struct cli_state *cli, const char *fname, mode_t mode)
 {
-#if defined(O_DIRECTORY)
-	return (cli_posix_open(cli, fname, O_CREAT|O_DIRECTORY, mode) == -1) ? -1 : 0;
-#else
-	cli_set_nt_error(cli, NT_STATUS_NOT_IMPLEMENTED);
-	return -1;
-#endif
+	return (cli_posix_open_internal(cli, fname, O_CREAT, mode, True) == -1) ? -1 : 0;
 }
 
 /****************************************************************************

Modified: branches/SAMBA_3_0_25/source/smbd/trans2.c
===================================================================
--- branches/SAMBA_3_0_25/source/smbd/trans2.c	2007-03-01 22:15:30 UTC (rev 21643)
+++ branches/SAMBA_3_0_25/source/smbd/trans2.c	2007-03-01 22:44:02 UTC (rev 21644)
@@ -4305,6 +4305,11 @@
 		return NT_STATUS_INVALID_PARAMETER;
 	}
 
+	DEBUG(10,("smb_set_posix_acl: file %s num_file_acls = %u, num_def_acls = %u\n",
+		fname ? fname : fsp->fsp_name,
+		(unsigned int)num_file_acls,
+		(unsigned int)num_def_acls));
+
 	if (valid_file_acls && !set_unix_posix_acl(conn, fsp, fname, num_file_acls,
 			pdata + SMB_POSIX_ACL_HEADER_SIZE)) {
 		return map_nt_error_from_unix(errno);
@@ -4386,6 +4391,14 @@
 	count = (SMB_BIG_UINT)IVAL(pdata,POSIX_LOCK_LEN_OFFSET);
 #endif /* HAVE_LONGLONG */
 
+	DEBUG(10,("smb_set_posix_lock: file %s, lock_type = %u,"
+			"lock_pid = %u, count = %.0f, offset = %.0f\n",
+		fsp->fsp_name,
+		(unsigned int)lock_type,
+		(unsigned int)lock_pid,
+		(double)count,
+		(double)offset ));
+
 	if (lock_type == UNLOCK_LOCK) {
 		status = do_unlock(fsp,
 				lock_pid,
@@ -4450,6 +4463,9 @@
 	/* write time */
 	tvs.modtime = srv_make_unix_date2(pdata+l1_fdateLastWrite);
 
+	DEBUG(10,("smb_set_info_standard: file %s\n",
+		fname ? fname : fsp->fsp_name ));
+
 	return smb_set_file_time(conn,
 				fsp,
 				fname,
@@ -4507,6 +4523,9 @@
 		tvs.modtime = null_mtime(write_time) ? changed_time : write_time;
 	}
 
+	DEBUG(10,("smb_set_file_basic_info: file %s\n",
+		fname ? fname : fsp->fsp_name ));
+
 	return smb_set_file_time(conn,
 				fsp,
 				fname,
@@ -4910,6 +4929,9 @@
 
 	mod_unixmode = (uint32)unixmode | FILE_FLAG_POSIX_SEMANTICS;
 
+	DEBUG(10,("smb_posix_mkdir: file %s, mode 0%o\n",
+		fname, (unsigned int)unixmode ));
+
 	status = open_directory(conn,
 				fname,
 				psbuf,
@@ -5056,6 +5078,11 @@
 		mod_unixmode |= FILE_FLAG_NO_BUFFERING;
 	}
 
+	DEBUG(10,("smb_posix_open: file %s, smb_posix_flags = %u, mode 0%o\n",
+		fname,
+		(unsigned int)wire_open_mode,
+		(unsigned int)unixmode ));
+
 	status = open_file_ntcreate(conn,
 				fname,
 				psbuf,
@@ -5150,6 +5177,10 @@
 		return NT_STATUS_NOT_A_DIRECTORY;
 	}
 
+	DEBUG(10,("smb_posix_unlink: %s %s\n",
+		(flags == SMB_POSIX_UNLINK_DIRECTORY_TARGET) ? "directory" : "file",
+		fname));
+
 	if (VALID_STAT_OF_DIR(*psbuf)) {
 		status = open_directory(conn,
 					fname,



More information about the samba-cvs mailing list