diff options
Diffstat (limited to 'source3/lib')
| -rw-r--r-- | source3/lib/time.c | 40 | 
1 files changed, 30 insertions, 10 deletions
diff --git a/source3/lib/time.c b/source3/lib/time.c index 9db88b3fc8..3cf0cb4f64 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -826,14 +826,10 @@ void put_long_date(char *p, time_t t)   structure.  ****************************************************************************/ -time_t get_create_time(const SMB_STRUCT_STAT *st,bool fake_dirs) +static time_t calc_create_time(const SMB_STRUCT_STAT *st)  {  	time_t ret, ret1; -	if(S_ISDIR(st->st_mode) && fake_dirs) { -		return (time_t)315493200L;          /* 1/1/1980 */ -	} -      	ret = MIN(st->st_ctime, st->st_mtime);  	ret1 = MIN(ret, st->st_atime); @@ -848,12 +844,36 @@ time_t get_create_time(const SMB_STRUCT_STAT *st,bool fake_dirs)  	return ret;  } -struct timespec get_create_timespec(const SMB_STRUCT_STAT *st,bool fake_dirs) +/**************************************************************************** + Return the 'create time' from a stat struct if it exists (birthtime) or else + use the best approximation. +****************************************************************************/ + +struct timespec get_create_timespec(const SMB_STRUCT_STAT *pst,bool fake_dirs)  { -	struct timespec ts; -	ts.tv_sec = get_create_time(st, fake_dirs); -	ts.tv_nsec = 0; -	return ts; +	struct timespec ret; + +	if(S_ISDIR(pst->st_mode) && fake_dirs) { +		ret.tv_sec = 315493200L;          /* 1/1/1980 */ +		ret.tv_nsec = 0; +		return ret; +	} + +#if defined(HAVE_STAT_ST_BIRTHTIMESPEC) +	return pst->st_birthtimespec; +#elif defined(HAVE_STAT_ST_BIRTHTIMENSEC) +	ret.tv_sec = pst->st_birthtime; +	ret.tv_nsec = pst->st_birthtimenspec; +	return ret; +#elif defined(HAVE_STAT_ST_BIRTHTIME) +	ret.tv_sec = pst->st_birthtime; +	ret.tv_nsec = 0; +	return ret; +#else +	ret.tv_sec = calc_create_time(pst); +	ret.tv_nsec = 0; +	return ret; +#endif  }  /****************************************************************************  | 
