125-createtime.diff   [plain text]


--- samba/source/lib/time.c.orig	2005/01/06 23:22:10	1.1.1.9
+++ samba/source/lib/time.c	2005/03/18 00:59:36
@@ -709,6 +709,33 @@
 	return(TimeBuf);
 }
 
+#if defined(ATTR_CMN_CRTIME)
+int get_creation_time_attr(char *path, time_t *createTime, int dontFollowSymLink) 
+{
+    int error;
+	struct attrlist alist;
+	struct replyBlock {
+		unsigned long   length;
+		struct timespec	createTime;
+	} reply;
+	unsigned long options = 0;
+	
+	if (dontFollowSymLink)
+		options |= FSOPT_NOFOLLOW;
+		
+	memset( &alist, 0, sizeof(alist));
+	memset( &reply, 0, sizeof(reply));
+	
+	alist.bitmapcount = ATTR_BIT_MAP_COUNT;
+	alist.commonattr = ATTR_CMN_CRTIME;
+	error = getattrlist( path, &alist, &reply, sizeof(reply), options);
+	if (error == 0) {
+		*createTime = reply.createTime.tv_sec;
+	}
+
+	return (error);
+}
+#endif
 /****************************************************************************
   return the best approximation to a 'create time' under UNIX from a stat
   structure.
--- samba/source/smbd/nttrans.c.orig	2005/01/06 23:23:12	1.1.1.15
+++ samba/source/smbd/nttrans.c	2005/03/18 00:59:36
@@ -972,7 +972,13 @@
 	p += 4;
 	
 	/* Create time. */  
+	#if defined(ATTR_CMN_CRTIME)
+		if (!(get_creation_time_attr(fname, &c_time, 1) == 0))  {
+	#endif
 	c_time = get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn)));
+	#if defined(ATTR_CMN_CRTIME)
+		}
+	#endif
 
 	if (lp_dos_filetime_resolution(SNUM(conn))) {
 		c_time &= ~1;
@@ -1468,7 +1474,13 @@
 	p += 8;
 
 	/* Create time. */
+	#if defined(ATTR_CMN_CRTIME)
+		if (!(get_creation_time_attr(fname, &c_time, 1) == 0))  {
+	#endif
 	c_time = get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn)));
+	#if defined(ATTR_CMN_CRTIME)
+		}
+	#endif
 
 	if (lp_dos_filetime_resolution(SNUM(conn))) {
 		c_time &= ~1;
Index: samba/source/smbd/reply.c
===================================================================
RCS file: /cvs/root/samba/samba/source/smbd/reply.c,v
retrieving revision 1.1.1.16
diff -u -d -b -r1.1.1.16 reply.c
--- samba/source/smbd/reply.c.orig	2005/01/06 23:23:18	1.1.1.16
+++ samba/source/smbd/reply.c	2005/03/18 00:59:36
@@ -5025,6 +5025,9 @@
 	int outsize = 0;
 	int mode;
 	files_struct *fsp = file_fsp(inbuf,smb_vwv0);
+	#if defined(ATTR_CMN_CRTIME)
+	time_t c_time;
+	#endif
 	START_PROFILE(SMBgetattrE);
 
 	outsize = set_message(outbuf,11,0,True);
@@ -5047,8 +5050,14 @@
 	 * date to be last modify date as UNIX doesn't save
 	 * this.
 	 */
-
+	#if defined(ATTR_CMN_CRTIME)
+		if (!(get_creation_time_attr(fsp->fsp_name, &c_time, 1) == 0))  {
+			c_time = get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn)));
+		}
+		put_dos_date2(outbuf,smb_vwv0,c_time);		
+	#else
 	put_dos_date2(outbuf,smb_vwv0,get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn))));
+	#endif
 	put_dos_date2(outbuf,smb_vwv2,sbuf.st_atime);
 	put_dos_date2(outbuf,smb_vwv4,sbuf.st_mtime);
 
--- samba/source/smbd/trans2.c.orig	2005/01/06 23:37:07	1.7
+++ samba/source/smbd/trans2.c	2005/03/18 00:59:36
@@ -954,8 +954,13 @@
 			allocation_size = get_allocation_size(NULL,&sbuf);
 			mdate = sbuf.st_mtime;
 			adate = sbuf.st_atime;
+		#if defined(ATTR_CMN_CRTIME)
+			if (!(get_creation_time_attr(fname, &cdate, 1) == 0))  {
+		#endif
 			cdate = get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn)));
-
+		#if defined(ATTR_CMN_CRTIME)
+			}
+		#endif
 			if (lp_dos_filetime_resolution(SNUM(conn))) {
 				cdate &= ~1;
 				mdate &= ~1;
@@ -2414,8 +2419,13 @@
 
 	memset((char *)pdata,'\0',data_size);
 
+#if defined(ATTR_CMN_CRTIME)
+	if (!(get_creation_time_attr(fname, &c_time, 1) == 0))  {
+#endif
 	c_time = get_create_time(&sbuf,lp_fake_dir_create_times(SNUM(conn)));
-
+#if defined(ATTR_CMN_CRTIME)
+	}
+#endif
 	if (lp_dos_filetime_resolution(SNUM(conn))) {
 		c_time &= ~1;
 		sbuf.st_atime &= ~1;