summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>1998-01-24 09:28:00 +0000
committerJeremy Allison <jra@samba.org>1998-01-24 09:28:00 +0000
commitc5023940995b6d2281fe7b2f85a6377f5ae605e7 (patch)
tree860ca37bf08bc33f7237bd129045c848e433d69d /source
parent0cf19efb8561647f032ee4447b3e41443328ab76 (diff)
downloadsamba-c5023940995b6d2281fe7b2f85a6377f5ae605e7.tar.gz
samba-c5023940995b6d2281fe7b2f85a6377f5ae605e7.tar.xz
samba-c5023940995b6d2281fe7b2f85a6377f5ae605e7.zip
Added the minimum time from a stat structure for create
time. Jeremy.
Diffstat (limited to 'source')
-rw-r--r--source/include/proto.h1
-rw-r--r--source/lib/time.c19
-rw-r--r--source/smbd/reply.c2
-rw-r--r--source/smbd/trans2.c15
4 files changed, 30 insertions, 7 deletions
diff --git a/source/include/proto.h b/source/include/proto.h
index 3d478b92468..f422b8fc901 100644
--- a/source/include/proto.h
+++ b/source/include/proto.h
@@ -1338,6 +1338,7 @@ time_t make_unix_date(void *date_ptr);
time_t make_unix_date2(void *date_ptr);
time_t make_unix_date3(void *date_ptr);
char *timestring(void );
+time_t get_create_time(struct stat *st);
/*The following definitions come from trans2.c */
diff --git a/source/lib/time.c b/source/lib/time.c
index 5e6d01215f7..f60af60c7aa 100644
--- a/source/lib/time.c
+++ b/source/lib/time.c
@@ -480,3 +480,22 @@ char *timestring(void )
return(TimeBuf);
}
+/****************************************************************************
+ return the best approximation to a 'create time' under UNIX from a stat
+ structure.
+****************************************************************************/
+
+time_t get_create_time(struct stat *st)
+{
+ time_t ret = MIN(st->st_ctime, st->st_mtime);
+ time_t ret1 = MIN(ret, st->st_atime);
+
+ if(ret1 != (time_t)0)
+ return ret1;
+
+ /*
+ * One of ctime, mtime or atime was zero (probably atime).
+ * Just return MIN(ctime, mtime).
+ */
+ return ret;
+}
diff --git a/source/smbd/reply.c b/source/smbd/reply.c
index 746c79db21a..4703dea4751 100644
--- a/source/smbd/reply.c
+++ b/source/smbd/reply.c
@@ -3916,7 +3916,7 @@ int reply_getattrE(char *inbuf,char *outbuf)
/* Convert the times into dos times. Set create
date to be last modify date as UNIX doesn't save
this */
- put_dos_date2(outbuf,smb_vwv0,sbuf.st_mtime);
+ put_dos_date2(outbuf,smb_vwv0,get_create_time(&sbuf));
put_dos_date2(outbuf,smb_vwv2,sbuf.st_atime);
put_dos_date2(outbuf,smb_vwv4,sbuf.st_mtime);
if (mode & aDIR)
diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c
index 56843e04238..eb8356cc537 100644
--- a/source/smbd/trans2.c
+++ b/source/smbd/trans2.c
@@ -362,7 +362,7 @@ static int get_lanman2_dir_entry(int cnum,char *path_mask,int dirtype,int info_l
size = sbuf.st_size;
mdate = sbuf.st_mtime;
adate = sbuf.st_atime;
- cdate = sbuf.st_ctime;
+ cdate = get_create_time(&sbuf);
if(mode & aDIR)
size = 0;
@@ -1114,7 +1114,7 @@ static int call_trans2qfilepathinfo(char *inbuf, char *outbuf, int length,
case SMB_INFO_STANDARD:
case SMB_INFO_QUERY_EA_SIZE:
data_size = (info_level==1?22:26);
- put_dos_date2(pdata,l1_fdateCreation,sbuf.st_ctime); /* create = inode mod */
+ put_dos_date2(pdata,l1_fdateCreation,get_create_time(&sbuf));
put_dos_date2(pdata,l1_fdateLastAccess,sbuf.st_atime); /* access time */
put_dos_date2(pdata,l1_fdateLastWrite,sbuf.st_mtime); /* write time */
SIVAL(pdata,l1_cbFile,size);
@@ -1125,7 +1125,7 @@ static int call_trans2qfilepathinfo(char *inbuf, char *outbuf, int length,
case SMB_INFO_QUERY_EAS_FROM_LIST:
data_size = 24;
- put_dos_date2(pdata,0,sbuf.st_ctime); /* create time = inode mod time */
+ put_dos_date2(pdata,0,get_create_time(&sbuf));
put_dos_date2(pdata,4,sbuf.st_atime);
put_dos_date2(pdata,8,sbuf.st_mtime);
SIVAL(pdata,12,size);
@@ -1143,14 +1143,17 @@ static int call_trans2qfilepathinfo(char *inbuf, char *outbuf, int length,
case SMB_QUERY_FILE_BASIC_INFO:
data_size = 36; /* w95 returns 40 bytes not 36 - why ?. */
- put_long_date(pdata,sbuf.st_ctime); /* create time = inode mod time */
+ put_long_date(pdata,get_create_time(&sbuf));
put_long_date(pdata+8,sbuf.st_atime); /* access time */
put_long_date(pdata+16,sbuf.st_mtime); /* write time */
put_long_date(pdata+24,sbuf.st_mtime); /* change time */
SIVAL(pdata,32,mode);
DEBUG(5,("SMB_QFBI - "));
- DEBUG(5,("create: %s ", ctime(&sbuf.st_ctime)));
+ {
+ time_t create_time = get_create_time(&sbuf);
+ DEBUG(5,("create: %s ", ctime(&create_time)));
+ }
DEBUG(5,("access: %s ", ctime(&sbuf.st_atime)));
DEBUG(5,("write: %s ", ctime(&sbuf.st_mtime)));
DEBUG(5,("change: %s ", ctime(&sbuf.st_mtime)));
@@ -1204,7 +1207,7 @@ static int call_trans2qfilepathinfo(char *inbuf, char *outbuf, int length,
break;
case SMB_QUERY_FILE_ALL_INFO:
- put_long_date(pdata,sbuf.st_ctime); /* create time = inode mod time */
+ put_long_date(pdata,get_create_time(&sbuf));
put_long_date(pdata+8,sbuf.st_atime); /* access time */
put_long_date(pdata+16,sbuf.st_mtime); /* write time */
put_long_date(pdata+24,sbuf.st_mtime); /* change time */