[SCM] Samba Shared Repository - branch master updated - release-4-0-0alpha8-970-gd6270df

Stefan (metze) Metzmacher metze at samba.org
Thu Aug 13 02:53:36 MDT 2009


Hi Jeremy,

> - Log -----------------------------------------------------------------
> commit d6270df748dcfd8d5a02c328518c2332da8fbed5
> Author: Jeremy Allison <jra at samba.org>
> Date:   Wed Aug 12 13:00:54 2009 -0700
> 
>     Add "store create time" parameter (docs to follow)
>     that stores the create time in the user.DosTimestamps EA.
>     Jeremy.

Can we please use an idl based union to store this information?

Also user.DosTimestamps is misleading when it only stores the create time.

It would be nice if we could use a single EA to store all timestamps
and maybe all other info like the current xattr_DosAttrib struct used by
samba4.

But I think we should rename xattr_DosAttrib into
xattr_DosInforation or xattr_DosMetaData.

As *XATTR_DOSATTRIB_NAME = "user.DosAttrib";
and #define SAMBA_XATTR_DOS_ATTRIB "user.DOSATTRIB" are different.

metze
> -----------------------------------------------------------------------
> 
> Summary of changes:
>  source3/include/proto.h          |   12 ++++-
>  source3/include/smb.h            |    2 +
>  source3/modules/vfs_default.c    |    9 ++++
>  source3/param/loadparm.c         |   12 +++++
>  source3/script/tests/selftest.sh |    1 +
>  source3/smbd/dosmode.c           |   91 ++++++++++++++++++++++++++++++++++++--
>  source3/smbd/nttrans.c           |    8 ++--
>  source3/smbd/open.c              |    9 ++++
>  source3/smbd/reply.c             |    2 +-
>  source3/smbd/trans2.c            |    9 ++--
>  10 files changed, 140 insertions(+), 15 deletions(-)
> 
> 
> Changeset truncated at 500 lines:
> 
> diff --git a/source3/include/proto.h b/source3/include/proto.h
> index 8b3e029..963e6df 100644
> --- a/source3/include/proto.h
> +++ b/source3/include/proto.h
> @@ -4187,6 +4187,7 @@ bool lp_administrative_share(int );
>  bool lp_print_ok(int );
>  bool lp_map_hidden(int );
>  bool lp_map_archive(int );
> +bool lp_store_create_time(int );
>  bool lp_store_dos_attributes(int );
>  bool lp_dmapi_support(int );
>  bool lp_locking(const struct share_params *p );
> @@ -6266,10 +6267,17 @@ bool set_sticky_write_time_fsp(struct files_struct *fsp,
>  			       struct timespec mtime);
>  bool update_write_time(struct files_struct *fsp);
>  
> -struct timespec get_create_timespec(struct files_struct *fsp,
> +NTSTATUS set_create_timespec_ea(connection_struct *conn,
> +				struct files_struct *fsp,
> +				const struct smb_filename *smb_fname,
> +				struct timespec create_time);
> +
> +struct timespec get_create_timespec(connection_struct *conn,
> +				struct files_struct *fsp,
>  				const struct smb_filename *smb_fname);
>  
> -struct timespec get_change_timespec(struct files_struct *fsp,
> +struct timespec get_change_timespec(connection_struct *conn,
> +				struct files_struct *fsp,
>  				const struct smb_filename *smb_fname);
>  
>  /* The following definitions come from smbd/error.c  */
> diff --git a/source3/include/smb.h b/source3/include/smb.h
> index fb01a92..28bd60a 100644
> --- a/source3/include/smb.h
> +++ b/source3/include/smb.h
> @@ -1859,6 +1859,8 @@ struct ea_list {
>  #define SAMBA_XATTR_DOS_ATTRIB "user.DOSATTRIB"
>  /* Prefix for DosStreams in the vfs_streams_xattr module */
>  #define SAMBA_XATTR_DOSSTREAM_PREFIX "user.DosStream."
> +/* Prefix for DOS timestamps. */
> +#define SAMBA_XATTR_DOSTIMESTAMPS "user.DosTimestamps"
>  
>  #define UUID_SIZE 16
>  
> diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
> index 2ee2fd1..a793b33 100644
> --- a/source3/modules/vfs_default.c
> +++ b/source3/modules/vfs_default.c
> @@ -817,6 +817,15 @@ static int vfswrap_ntimes(vfs_handle_struct *handle,
>  	errno = ENOSYS;
>  	result = -1;
>  #endif
> +
> +	if (!null_timespec(ft->create_time) &&
> +			lp_store_create_time(SNUM(handle->conn))) {
> +		set_create_timespec_ea(handle->conn,
> +				NULL,
> +				smb_fname,
> +				ft->create_time);
> +	}
> +
>   out:
>  	END_PROFILE(syscall_ntimes);
>  	return result;
> diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
> index dbbd6e3..3598471 100644
> --- a/source3/param/loadparm.c
> +++ b/source3/param/loadparm.c
> @@ -446,6 +446,7 @@ struct service {
>  	bool bMap_system;
>  	bool bMap_hidden;
>  	bool bMap_archive;
> +	bool bStoreCreateTime;
>  	bool bStoreDosAttributes;
>  	bool bDmapiSupport;
>  	bool bLocking;
> @@ -589,6 +590,7 @@ static struct service sDefault = {
>  	False,			/* bMap_system */
>  	False,			/* bMap_hidden */
>  	True,			/* bMap_archive */
> +	False,			/* bStoreCreateTime */
>  	False,			/* bStoreDosAttributes */
>  	False,			/* bDmapiSupport */
>  	True,			/* bLocking */
> @@ -3066,6 +3068,15 @@ static struct parm_struct parm_table[] = {
>  		.flags		= FLAG_ADVANCED,
>  	},
>  	{
> +		.label		= "store create time",
> +		.type		= P_BOOL,
> +		.p_class	= P_LOCAL,
> +		.ptr		= &sDefault.bStoreCreateTime,
> +		.special	= NULL,
> +		.enum_list	= NULL,
> +		.flags		= FLAG_ADVANCED | FLAG_SHARE | FLAG_GLOBAL,
> +	},
> +	{
>  		.label		= "store dos attributes",
>  		.type		= P_BOOL,
>  		.p_class	= P_LOCAL,
> @@ -5564,6 +5575,7 @@ FN_LOCAL_BOOL(lp_administrative_share, bAdministrative_share)
>  FN_LOCAL_BOOL(lp_print_ok, bPrint_ok)
>  FN_LOCAL_BOOL(lp_map_hidden, bMap_hidden)
>  FN_LOCAL_BOOL(lp_map_archive, bMap_archive)
> +FN_LOCAL_BOOL(lp_store_create_time, bStoreCreateTime)
>  FN_LOCAL_BOOL(lp_store_dos_attributes, bStoreDosAttributes)
>  FN_LOCAL_BOOL(lp_dmapi_support, bDmapiSupport)
>  FN_LOCAL_PARM_BOOL(lp_locking, bLocking)
> diff --git a/source3/script/tests/selftest.sh b/source3/script/tests/selftest.sh
> index e387113..3fcfa4d 100755
> --- a/source3/script/tests/selftest.sh
> +++ b/source3/script/tests/selftest.sh
> @@ -243,6 +243,7 @@ cat >$SERVERCONFFILE<<EOF
>  	map hidden = yes
>  	map system = yes
>  	create mask = 755
> +	store create time = yes
>  	vfs objects = $BINDIR/xattr_tdb.so $BINDIR/streams_depot.so
>  
>  	#Include user defined custom parameters if set
> diff --git a/source3/smbd/dosmode.c b/source3/smbd/dosmode.c
> index f4803cb..e9e92ad 100644
> --- a/source3/smbd/dosmode.c
> +++ b/source3/smbd/dosmode.c
> @@ -853,20 +853,103 @@ bool update_write_time(struct files_struct *fsp)
>  }
>  
>  /******************************************************************
> - Return a create time (may look at EA in future).
> + Set a create time EA.
>  ******************************************************************/
>  
> -struct timespec get_create_timespec(struct files_struct *fsp,
> +NTSTATUS set_create_timespec_ea(connection_struct *conn,
> +				struct files_struct *fsp,
> +                                const struct smb_filename *smb_fname,
> +				struct timespec create_time)
> +{
> +	int ret;
> +	char buf[8];
> +
> +	if (!lp_store_create_time(SNUM(conn))) {
> +		return NT_STATUS_OK;
> +	}
> +
> +	put_long_date_timespec(buf, create_time);
> +	if (fsp && fsp->fh->fd != -1) {
> +		ret = SMB_VFS_FSETXATTR(fsp,
> +				SAMBA_XATTR_DOSTIMESTAMPS,
> +				buf,
> +				sizeof(buf),
> +				0);
> +	} else {
> +		ret = SMB_VFS_SETXATTR(conn,
> +				smb_fname->base_name,
> +				SAMBA_XATTR_DOSTIMESTAMPS,
> +				buf,
> +				sizeof(buf),
> +				0);
> +	}
> +
> +	if (ret == -1) {
> +		map_nt_error_from_unix(errno);
> +	}
> +	return NT_STATUS_OK;
> +}
> +
> +/******************************************************************
> + Returns an EA create timespec, or a zero timespec if fail.
> +******************************************************************/
> +
> +static struct timespec get_create_timespec_ea(connection_struct *conn,
> +                                struct files_struct *fsp,
> +                                const struct smb_filename *smb_fname)
> +{
> +	ssize_t ret;
> +	char buf[8];
> +	struct timespec ts;
> +
> +	ZERO_STRUCT(ts);
> +
> +	if (!lp_store_create_time(SNUM(conn))) {
> +		return ts;
> +	}
> +
> +	if (fsp && fsp->fh->fd != -1) {
> +		ret = SMB_VFS_FGETXATTR(fsp,
> +				SAMBA_XATTR_DOSTIMESTAMPS,
> +				buf,
> +				sizeof(buf));
> +	} else {
> +		ret = SMB_VFS_GETXATTR(conn,
> +				smb_fname->base_name,
> +				SAMBA_XATTR_DOSTIMESTAMPS,
> +				buf,
> +				sizeof(buf));
> +	}
> +	if (ret == sizeof(buf)) {
> +		return interpret_long_date(buf);
> +	} else {
> +		return ts;
> +	}
> +}
> +
> +/******************************************************************
> + Return a create time - looks at EA.
> +******************************************************************/
> +
> +struct timespec get_create_timespec(connection_struct *conn,
> +				struct files_struct *fsp,
>  				const struct smb_filename *smb_fname)
>  {
> -	return smb_fname->st.st_ex_btime;
> +	struct timespec ts = get_create_timespec_ea(conn, fsp, smb_fname);
> +
> +	if (!null_timespec(ts)) {
> +		return ts;
> +	} else {
> +		return smb_fname->st.st_ex_btime;
> +	}
>  }
>  
>  /******************************************************************
>   Return a change time (may look at EA in future).
>  ******************************************************************/
>  
> -struct timespec get_change_timespec(struct files_struct *fsp,
> +struct timespec get_change_timespec(connection_struct *conn,
> +				struct files_struct *fsp,
>  				const struct smb_filename *smb_fname)
>  {
>  	return smb_fname->st.st_ex_mtime;
> diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c
> index 9f4074c..03fdff3 100644
> --- a/source3/smbd/nttrans.c
> +++ b/source3/smbd/nttrans.c
> @@ -596,10 +596,10 @@ void reply_ntcreate_and_X(struct smb_request *req)
>  	}
>  
>  	/* Create time. */
> -	create_timespec = get_create_timespec(fsp, smb_fname);
> +	create_timespec = get_create_timespec(conn, fsp, smb_fname);
>  	a_timespec = smb_fname->st.st_ex_atime;
>  	m_timespec = smb_fname->st.st_ex_mtime;
> -	c_timespec = get_change_timespec(fsp, smb_fname);
> +	c_timespec = get_change_timespec(conn, fsp, smb_fname);
>  
>  	if (lp_dos_filetime_resolution(SNUM(conn))) {
>  		dos_filetime_timespec(&create_timespec);
> @@ -1094,10 +1094,10 @@ static void call_nt_transact_create(connection_struct *conn,
>  	}
>  
>  	/* Create time. */
> -	create_timespec = get_create_timespec(fsp, smb_fname);
> +	create_timespec = get_create_timespec(conn, fsp, smb_fname);
>  	a_timespec = smb_fname->st.st_ex_atime;
>  	m_timespec = smb_fname->st.st_ex_mtime;
> -	c_timespec = get_change_timespec(fsp, smb_fname);
> +	c_timespec = get_change_timespec(conn, fsp, smb_fname);
>  
>  	if (lp_dos_filetime_resolution(SNUM(conn))) {
>  		dos_filetime_timespec(&create_timespec);
> diff --git a/source3/smbd/open.c b/source3/smbd/open.c
> index 62a0fa7..6398234 100644
> --- a/source3/smbd/open.c
> +++ b/source3/smbd/open.c
> @@ -3280,6 +3280,15 @@ static NTSTATUS create_file_unixpath(connection_struct *conn,
>  		SMB_VFS_FSTAT(fsp, &smb_fname->st);
>  		fsp->fsp_name->st = smb_fname->st;
>  	}
> +
> +	/* Try and make a create timestamp, if required. */
> +	if ((info == FILE_WAS_CREATED) || (info == FILE_WAS_OVERWRITTEN)) {
> +		if (lp_store_create_time(SNUM(conn))) {
> +			set_create_timespec_ea(conn, fsp,
> +				smb_fname, smb_fname->st.st_ex_btime);
> +		}
> +	}
> +
>  	return NT_STATUS_OK;
>  
>   fail:
> diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
> index de187e9..7b290a6 100644
> --- a/source3/smbd/reply.c
> +++ b/source3/smbd/reply.c
> @@ -7793,7 +7793,7 @@ void reply_getattrE(struct smb_request *req)
>  
>  	reply_outbuf(req, 11, 0);
>  
> -	create_ts = get_create_timespec(fsp, fsp->fsp_name);
> +	create_ts = get_create_timespec(conn, fsp, fsp->fsp_name);
>  	srv_put_dos_date2((char *)req->outbuf, smb_vwv0, create_ts.tv_sec);
>  	srv_put_dos_date2((char *)req->outbuf, smb_vwv2,
>  			  convert_timespec_to_time_t(sbuf.st_ex_atime));
> diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c
> index 93b2175..b14d505 100644
> --- a/source3/smbd/trans2.c
> +++ b/source3/smbd/trans2.c
> @@ -72,6 +72,7 @@ static bool samba_private_attr_name(const char *unix_ea_name)
>  	static const char * const prohibited_ea_names[] = {
>  		SAMBA_POSIX_INHERITANCE_EA_NAME,
>  		SAMBA_XATTR_DOS_ATTRIB,
> +		SAMBA_XATTR_DOSTIMESTAMPS,
>  		NULL
>  	};
>  
> @@ -1490,8 +1491,8 @@ static bool smbd_marshall_dir_entry(TALLOC_CTX *ctx,
>  
>  	mdate_ts = smb_fname->st.st_ex_mtime;
>  	adate_ts = smb_fname->st.st_ex_atime;
> -	create_date_ts = get_create_timespec(NULL, smb_fname);
> -	cdate_ts = get_change_timespec(NULL, smb_fname);
> +	create_date_ts = get_create_timespec(conn, NULL, smb_fname);
> +	cdate_ts = get_change_timespec(conn, NULL, smb_fname);
>  
>  	if (lp_dos_filetime_resolution(SNUM(conn))) {
>  		dos_filetime_timespec(&create_date_ts);
> @@ -4057,10 +4058,10 @@ NTSTATUS smbd_do_qfilepathinfo(connection_struct *conn,
>  		update_stat_ex_mtime(&sbuf, write_time_ts);
>  	}
>  
> -	create_time_ts = get_create_timespec(fsp, smb_fname);
> +	create_time_ts = get_create_timespec(conn, fsp, smb_fname);
>  	mtime_ts = sbuf.st_ex_mtime;
>  	atime_ts = sbuf.st_ex_atime;
> -	ctime_ts = get_change_timespec(fsp, smb_fname);
> +	ctime_ts = get_change_timespec(conn, fsp, smb_fname);
>  
>  	if (lp_dos_filetime_resolution(SNUM(conn))) {
>  		dos_filetime_timespec(&create_time_ts);
> 
> 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 252 bytes
Desc: OpenPGP digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20090813/565334ad/attachment.pgp>


More information about the samba-technical mailing list