From 9a3844a96b07ffa7b677460d0a9f0dbffd774e03 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 1 Apr 2005 00:36:04 +0000 Subject: [PATCH] windows-time-20050331 Replace the time translation hack based on smb_NowTZ with a purely mathematical conversion from UTC based unixTime (time_t) to UTC based FILETIME --- src/WINNT/afsd/cm_vnodeops.c | 2 +- src/WINNT/afsd/smb.c | 78 +++++++++++++++++++++++++----------- src/WINNT/afsd/smb.h | 10 +++-- src/WINNT/afsd/smb3.c | 15 ++++--- 4 files changed, 68 insertions(+), 37 deletions(-) diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 21747e98a..3ccc13a06 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -324,7 +324,7 @@ long cm_CheckNTOpen(cm_scache_t *scp, unsigned int desiredAccess, * When CAP_NT_SMBS has been negotiated, deletion (of files or directories) is * done in three steps: * (1) open for deletion (NT_CREATE_AND_X) - * (2) set for deletion on close (NTWTRANSACTION2, SET_FILE_INFO) + * (2) set for deletion on close (NT_TRANSACTION2, SET_FILE_INFO) * (3) close (CLOSE) * We must not do the RPC until step 3. But if we are going to return an error * code (e.g. directory not empty), we must return it by step 2, otherwise most diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 5ba1b800f..df404130f 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -161,8 +161,12 @@ extern HANDLE WaitToTerminate; */ time_t smb_localZero = 0; +#define USE_NUMERIC_TIME_CONV 1 + +#ifndef USE_NUMERIC_TIME_CONV /* Time difference for converting to kludge-GMT */ -int smb_NowTZ; +afs_uint32 smb_NowTZ; +#endif /* USE_NUMERIC_TIME_CONV */ char *smb_localNamep = NULL; @@ -543,7 +547,7 @@ void GetTimeZoneInfo(BOOL *pDST, LONG *pDstBias, LONG *pBias) #endif /* DJGPP */ -void CompensateForSmbClientLastWriteTimeBugs(long *pLastWriteTime) +void CompensateForSmbClientLastWriteTimeBugs(afs_uint32 *pLastWriteTime) { BOOL dst; /* Will be TRUE if observing DST */ LONG dstBias; /* Offset from local time if observing DST */ @@ -579,6 +583,7 @@ void CompensateForSmbClientLastWriteTimeBugs(long *pLastWriteTime) *pLastWriteTime -= (-bias * 60); /* Convert bias to seconds */ } +#ifndef USE_NUMERIC_TIME_CONV /* * Calculate the difference (in seconds) between local time and GMT. * This enables us to convert file times to kludge-GMT. @@ -595,21 +600,26 @@ smb_CalculateNowTZ() local_tm = *(localtime(&t)); days = local_tm.tm_yday - gmt_tm.tm_yday; - hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour -#ifdef COMMENT - /* There is a problem with DST immediately after the time change - * which may continue to exist until the machine is rebooted - */ - - (local_tm.tm_isdst ? 1 : 0) -#endif /* COMMENT */ - ; + hours = 24 * days + local_tm.tm_hour - gmt_tm.tm_hour; minutes = 60 * hours + local_tm.tm_min - gmt_tm.tm_min; seconds = 60 * minutes + local_tm.tm_sec - gmt_tm.tm_sec; smb_NowTZ = seconds; } +#endif /* USE_NUMERIC_TIME_CONV */ #ifndef DJGPP +#ifdef USE_NUMERIC_TIME_CONV +void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) +{ + // Note that LONGLONG is a 64-bit value + LONGLONG ll; + + ll = Int32x32To64(unixTime, 10000000) + 116444736000000000; + largeTimep->dwLowDateTime = (DWORD)(ll & 0xFFFFFFFF); + largeTimep->dwHighDateTime = (DWORD)(ll >> 32); +} +#else void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) { struct tm *ltp; @@ -649,6 +659,7 @@ void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) SystemTimeToFileTime(&stm, largeTimep); } +#endif /* USE_NUMERIC_TIME_CONV */ #else /* DJGPP */ void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) { @@ -672,6 +683,22 @@ void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTime) #endif /* !DJGPP */ #ifndef DJGPP +#ifdef USE_NUMERIC_TIME_CONV +void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) +{ + // Note that LONGLONG is a 64-bit value + LONGLONG ll; + + ll = largeTimep->dwHighDateTime; + ll <<= 32; + ll += largeTimep->dwLowDateTime; + + ll -= 116444736000000000; + ll /= 10000000; + + *unixTimep = (DWORD)ll; +} +#else /* USE_NUMERIC_TIME_CONV */ void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) { SYSTEMTIME stm; @@ -694,6 +721,7 @@ void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) *unixTimep = mktime(<); _timezone = save_timezone; } +#endif /* USE_NUMERIC_TIME_CONV */ #else /* DJGPP */ void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) { @@ -716,7 +744,7 @@ void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep) } #endif /* !DJGPP */ -void smb_SearchTimeFromUnixTime(time_t *dosTimep, time_t unixTime) +void smb_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime) { struct tm *ltp; int dosDate; @@ -739,10 +767,10 @@ void smb_SearchTimeFromUnixTime(time_t *dosTimep, time_t unixTime) dosDate = ((ltp->tm_year-80)<<9) | ((ltp->tm_mon+1) << 5) | (ltp->tm_mday); dosTime = (ltp->tm_hour<<11) | (ltp->tm_min << 5) | (ltp->tm_sec / 2); - *dosTimep = (dosDate<<16) | dosTime; + *searchTimep = (dosDate<<16) | dosTime; } -void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime) +void smb_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime) { unsigned short dosDate; unsigned short dosTime; @@ -762,12 +790,12 @@ void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime) *unixTimep = mktime(&localTm); } -void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime) +void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime) { *dosUTimep = unixTime - smb_localZero; } -void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t dosTime) +void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosTime) { #ifndef DJGPP *unixTimep = dosTime + smb_localZero; @@ -2712,7 +2740,7 @@ long smb_ReceiveNegotiate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) char protocol_array[10][1024]; /* protocol signature of the client */ int caps; /* capabilities */ time_t unixTime; - time_t dosTime; + afs_uint32 dosTime; TIME_ZONE_INFORMATION tzi; osi_Log1(smb_logp, "SMB receive negotiate; %d + 1 ongoing ops", @@ -2952,8 +2980,9 @@ void smb_Daemon(void *parmp) myTime.tm_sec = 0; smb_localZero = mktime(&myTime); +#ifndef USE_NUMERIC_TIME_CONV smb_CalculateNowTZ(); - +#endif /* USE_NUMERIC_TIME_CONV */ #ifdef AFS_FREELANCE if ( smb_localZero != old_localZero ) cm_noteLocalMountPointChange(); @@ -3304,7 +3333,7 @@ long smb_ApplyDirListPatches(smb_dirListPatch_t **dirPatchespp, long code = 0; cm_scache_t *scp; char *dptr; - time_t dosTime; + afs_uint32 dosTime; u_short shortTemp; char attr; smb_dirListPatch_t *patchp; @@ -3991,7 +4020,7 @@ long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack unsigned short attribute; cm_attr_t attr; cm_scache_t *newScp; - time_t dosTime; + afs_uint32 dosTime; cm_user_t *userp; int caseFold; char *tidPathp; @@ -4101,7 +4130,7 @@ long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack long code = 0; cm_scache_t *rootScp; cm_scache_t *newScp, *dscp; - time_t dosTime; + afs_uint32 dosTime; int attrs; cm_user_t *userp; int caseFold; @@ -4283,7 +4312,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) long code = 0; cm_user_t *userp; cm_scache_t *scp; - time_t dosTime; + afs_uint32 dosTime; int caseFold; cm_space_t *spacep; char *tidPathp; @@ -5208,7 +5237,7 @@ long smb_ReceiveCoreClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) unsigned short fid; smb_fid_t *fidp; cm_user_t *userp; - long dosTime; + afs_uint32 dosTime; long code = 0; cm_req_t req; @@ -6194,7 +6223,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) int attributes; char *lastNamep; int caseFold; - long dosTime; + afs_uint32 dosTime; char *tidPathp; cm_req_t req; @@ -7848,9 +7877,10 @@ void smb_Init(osi_log_t *logp, char *snamep, int useV3, int LANadapt, myTime.tm_sec = 0; smb_localZero = mktime(&myTime); +#ifndef USE_NUMERIC_TIME_CONV /* Initialize kludge-GMT */ smb_CalculateNowTZ(); - +#endif /* USE_NUMERIC_TIME_CONV */ #ifdef AFS_FREELANCE_CLIENT /* Make sure the root.afs volume has the correct time */ cm_noteLocalMountPointChange(); diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index e0c790052..78a145d4f 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -440,13 +440,15 @@ extern void smb_LargeSearchTimeFromUnixTime(FILETIME *largeTimep, time_t unixTim extern void smb_UnixTimeFromLargeSearchTime(time_t *unixTimep, FILETIME *largeTimep); -extern void smb_SearchTimeFromUnixTime(time_t *dosTimep, time_t unixTime); +extern void smb_SearchTimeFromUnixTime(afs_uint32 *searchTimep, time_t unixTime); -extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, time_t searchTime); +extern void smb_UnixTimeFromSearchTime(time_t *unixTimep, afs_uint32 searchTime); -extern void smb_DosUTimeFromUnixTime(time_t *dosUTimep, time_t unixTime); +extern void smb_DosUTimeFromUnixTime(afs_uint32 *dosUTimep, time_t unixTime); -extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, time_t dosUTime); +extern void smb_UnixTimeFromDosUTime(time_t *unixTimep, afs_uint32 dosUTime); + +extern void CompensateForSmbClientLastWriteTimeBugs(afs_uint32 *dosTimep); extern smb_vc_t *smb_FindVC(unsigned short lsn, int flags, int lana); diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 356d76cd7..13989b490 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -2065,7 +2065,7 @@ long smb_ReceiveTran2Open(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *op) smb_fid_t *fidp; int attributes; char *lastNamep; - time_t dosTime; + afs_uint32 dosTime; int openFun; int trunc; int openMode; @@ -2602,7 +2602,7 @@ long cm_GetShortName(char *pathp, cm_user_t *userp, cm_req_t *reqp, long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t *opx) { smb_tran2Packet_t *outp; - time_t dosTime; + afs_uint32 dosTime; FILETIME ft; unsigned short infoLevel; int nbytesRequired; @@ -3054,8 +3054,7 @@ long smb_ReceiveTran2SetFileInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet if (LargeIntegerNotEqualToZero(*((LARGE_INTEGER *)&lastMod)) && lastMod.dwLowDateTime != -1 && lastMod.dwHighDateTime != -1) { attr.mask |= CM_ATTRMASK_CLIENTMODTIME; - smb_UnixTimeFromLargeSearchTime(&attr.clientModTime, - &lastMod); + smb_UnixTimeFromLargeSearchTime(&attr.clientModTime, &lastMod); fidp->flags |= SMB_FID_MTIMESETDONE; } @@ -3297,7 +3296,7 @@ smb_ApplyV3DirListPatches(cm_scache_t *dscp, cm_scache_t *scp; cm_scache_t *targetScp; /* target if scp is a symlink */ char *dptr; - time_t dosTime; + afs_uint32 dosTime; FILETIME ft; int shortTemp; unsigned short attr; @@ -4499,7 +4498,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) smb_fid_t *fidp; int attributes; char *lastNamep; - time_t dosTime; + afs_uint32 dosTime; int openFun; int trunc; int openMode; @@ -4923,7 +4922,7 @@ long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t * smb_fid_t *fidp; cm_scache_t *scp; long code = 0; - time_t searchTime; + afs_uint32 searchTime; cm_user_t *userp; cm_req_t req; @@ -4985,7 +4984,7 @@ long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t * smb_fid_t *fidp; cm_scache_t *scp; long code = 0; - time_t searchTime; + afs_uint32 searchTime; time_t unixTime; cm_user_t *userp; cm_attr_t attrs; -- 2.39.5