adding file timestamps to file_status
This commit is contained in:
		
							parent
							
								
									15a8e2ae22
								
							
						
					
					
						commit
						a275b3da28
					
				|  | @ -85,6 +85,7 @@ void oc_clock_init() | |||
|     //RandomSeedFromDevice();
 | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| u64 oc_clock_timestamp(oc_clock_kind clock) | ||||
| { | ||||
|     u64 ts = 0; | ||||
|  | @ -120,16 +121,9 @@ u64 oc_clock_timestamp(oc_clock_kind clock) | |||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     /*
 | ||||
| 	//NOTE(martin): add a random fuzz between 0 and 1 times the system fuzz
 | ||||
| 	//TODO(martin): ensure that we always return a value greater than the last value
 | ||||
| 	f64 fuzz = RandomU32()/(f64)(~(0UL)) * OC_CLOCK_FUZZ; | ||||
| 	ts_timediff tdfuzz = TimediffFromSeconds(fuzz); | ||||
| 	ts = TimestampAdd(ts, tdfuzz); | ||||
| 	*/ | ||||
| 
 | ||||
|     return (ts); | ||||
| } | ||||
| */ | ||||
| 
 | ||||
| f64 oc_clock_time(oc_clock_kind clock) | ||||
| { | ||||
|  |  | |||
|  | @ -13,20 +13,21 @@ | |||
| #include "util/typedefs.h" | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" | ||||
| { | ||||
| extern "C" { | ||||
| #endif // __cplusplus
 | ||||
| 
 | ||||
|     typedef enum | ||||
|     { | ||||
|         OC_CLOCK_MONOTONIC, // clock that increment monotonically
 | ||||
|         OC_CLOCK_UPTIME,    // clock that increment monotonically during uptime
 | ||||
|         OC_CLOCK_DATE       // clock that is driven by the platform time
 | ||||
|     } oc_clock_kind; | ||||
| typedef enum | ||||
| { | ||||
|     OC_CLOCK_MONOTONIC, // clock that increment monotonically
 | ||||
|     OC_CLOCK_UPTIME,    // clock that increment monotonically during uptime
 | ||||
|     OC_CLOCK_DATE       // clock that is driven by the platform time
 | ||||
| } oc_clock_kind; | ||||
| 
 | ||||
|     ORCA_API void oc_clock_init(); // initialize the clock subsystem
 | ||||
|     ORCA_API u64 oc_clock_timestamp(oc_clock_kind clock); | ||||
|     ORCA_API f64 oc_clock_time(oc_clock_kind clock); | ||||
| #if !defined(OC_PLATFORM_ORCA) || !OC_PLATFORM_ORCA | ||||
| ORCA_API void oc_clock_init(); // initialize the clock subsystem
 | ||||
| #endif | ||||
| 
 | ||||
| ORCA_API f64 oc_clock_time(oc_clock_kind clock); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } // extern "C"
 | ||||
|  |  | |||
|  | @ -206,6 +206,13 @@ enum oc_file_perm | |||
|     OC_FILE_SET_UID = 1 << 11, | ||||
| }; | ||||
| 
 | ||||
| typedef struct oc_datestamp | ||||
| { | ||||
|     i64 seconds;  // seconds relative to NTP epoch.
 | ||||
|     u64 fraction; // fraction of seconds elapsed since the time specified by seconds.
 | ||||
| 
 | ||||
| } oc_datestamp; | ||||
| 
 | ||||
| typedef struct oc_file_status | ||||
| { | ||||
|     u64 uid; | ||||
|  | @ -213,7 +220,9 @@ typedef struct oc_file_status | |||
|     oc_file_perm perm; | ||||
|     u64 size; | ||||
| 
 | ||||
|     //TODO times
 | ||||
|     oc_datestamp creationDate; | ||||
|     oc_datestamp accessDate; | ||||
|     oc_datestamp modificationDate; | ||||
| 
 | ||||
| } oc_file_status; | ||||
| 
 | ||||
|  |  | |||
|  | @ -280,6 +280,17 @@ static oc_file_type oc_io_convert_type_from_stat(u16 mode) | |||
|     return (type); | ||||
| } | ||||
| 
 | ||||
| static const u64 OC_NTP_JAN_1970 = 2208988800ULL; // seconds from january 1900 to january 1970
 | ||||
| 
 | ||||
| oc_datestamp oc_datestamp_from_timespec(struct timespec ts) | ||||
| { | ||||
|     oc_datestamp d = { 0 }; | ||||
|     d.seconds = ts.tv_sec + OC_NTP_JAN_1970; | ||||
|     d.fraction = (ts.tv_nsec * (1ULL << 32)) / 1000000000; | ||||
| 
 | ||||
|     return (d); | ||||
| } | ||||
| 
 | ||||
| oc_io_error oc_io_raw_fstat(oc_file_desc fd, oc_file_status* status) | ||||
| { | ||||
|     oc_io_error error = OC_IO_OK; | ||||
|  | @ -294,7 +305,10 @@ oc_io_error oc_io_raw_fstat(oc_file_desc fd, oc_file_status* status) | |||
|         status->perm = oc_io_convert_perm_from_stat(s.st_mode); | ||||
|         status->type = oc_io_convert_type_from_stat(s.st_mode); | ||||
|         status->size = s.st_size; | ||||
|         //TODO: times
 | ||||
| 
 | ||||
|         status->creationDate = oc_datestamp_from_timespec(s.st_birthtimespec); | ||||
|         status->accessDate = oc_datestamp_from_timespec(s.st_atimespec); | ||||
|         status->modificationDate = oc_datestamp_from_timespec(s.st_mtimespec); | ||||
|     } | ||||
|     return (error); | ||||
| } | ||||
|  |  | |||
|  | @ -229,6 +229,36 @@ bool oc_io_raw_file_exists_at(oc_file_desc dirFd, oc_str8 path, oc_file_open_fla | |||
|     return (result); | ||||
| } | ||||
| 
 | ||||
| enum | ||||
| { | ||||
|     OC_NTP_01_JAN_1601 = -9435484800LL, | ||||
|     OC_WIN32_TICKS_PER_SECOND = 10000000LL | ||||
| }; | ||||
| 
 | ||||
| oc_datestamp oc_datestamp_from_win32_filetime(FILETIME ft) | ||||
| { | ||||
|     oc_datestamp d = { 0 }; | ||||
| 
 | ||||
|     i64 win32Ticks = (((u64)ft.high) << 32) | (u64)ft.low; | ||||
| 
 | ||||
|     i64 win32Seconds = win32Ticks / OC_WIN32_TICKS_PER_SECOND; | ||||
|     u64 win32Rem = 0; | ||||
|     if(winTicks < 0) | ||||
|     { | ||||
|         win32Seconds -= OC_WIN32_TICKS_PER_SECOND; | ||||
|         win32Rem = win32Ticks - seconds * OC_WIN32_TICKS_PER_SECOND; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         win32Rem = win32Ticks % OC_WIN32_TICKS_PER_SECOND; | ||||
|     } | ||||
| 
 | ||||
|     d.seconds = win32Seconds + OC_NTP_01_JAN_1601; | ||||
|     d.fraction = (win32Rem * (1ULL << 32)) / OC_WIN32_TICKS_PER_SECOND; | ||||
| 
 | ||||
|     return (d); | ||||
| } | ||||
| 
 | ||||
| oc_io_error oc_io_raw_fstat(oc_file_desc fd, oc_file_status* status) | ||||
| { | ||||
|     oc_io_error error = OC_IO_OK; | ||||
|  | @ -290,7 +320,16 @@ oc_io_error oc_io_raw_fstat(oc_file_desc fd, oc_file_status* status) | |||
|         { | ||||
|             status->perm = OC_FILE_OWNER_WRITE | OC_FILE_GROUP_WRITE | OC_FILE_OTHER_WRITE; | ||||
|         } | ||||
|         //TODO: times
 | ||||
| 
 | ||||
|         FILETIME win32CreationDate; | ||||
|         FILETIME win32AccessDate; | ||||
|         FILETIME win32ModificationDate; | ||||
| 
 | ||||
|         GetFileTime(fd, &win32CreationDate, &win32AccessDate, &win32ModificationDate); | ||||
| 
 | ||||
|         status->creationDate = oc_datestamp_from_win32_filetime(win32CreationDate); | ||||
|         status->accessDate = oc_datestamp_from_win32_filetime(win32AccessDate); | ||||
|         status->modificationDate = oc_datestamp_from_win32_filetime(win32ModificationDate); | ||||
|     } | ||||
|     return (error); | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue