?? win32.c
字號:
ef_len - EB_HEADSIZE)); break; } switch (eb_id) { /* process security descriptor extra data if: Caller is WinNT AND Target local/remote drive supports acls AND Target file is not a directory (else we defer processing until later) */ case EF_NTSD: if (IsWinNT()) { VOLUMECAPS VolumeCaps; /* provide useful input */ VolumeCaps.dwFileAttributes = G.pInfo->file_attr; VolumeCaps.bUsePrivileges = (uO.X_flag > 1); /* check target volume capabilities - just fall through * and try if fail */ if (GetVolumeCaps(G.rootpath, path, &VolumeCaps) && !(VolumeCaps.dwFileSystemFlags & FS_PERSISTENT_ACLS)) { rc = PK_OK; break; } rc = SetSD(__G__ path, &VolumeCaps, ef_ptr, eb_len); } else rc = PK_OK; break;#if 0 /* perhaps later we can add support for unzipping OS/2 EAs to NT */ case EF_OS2: rc = SetEAs(__G__ path, ef_ptr); break;#else /* ! 0 */#ifdef DEBUG case EF_OS2:#endif /* DEBUG */#endif /* ? 0 */#ifdef DEBUG case EF_AV: case EF_PKVMS: case EF_PKW32: case EF_PKUNIX: case EF_IZVMS: case EF_IZUNIX: case EF_IZUNIX2: case EF_TIME: case EF_MAC3: case EF_JLMAC: case EF_ZIPIT: case EF_VMCMS: case EF_MVS: case EF_ACL: case EF_BEOS: case EF_QDOS: case EF_AOSVS: case EF_SPARK: case EF_MD5: case EF_ASIUNIX: break; /* shut up for other known e.f. blocks */#endif /* DEBUG */ default: Trace((stderr, "EvalExtraFields: unknown extra field block, ID=%u\n", eb_id)); break; } ef_ptr += (eb_len + EB_HEADSIZE); ef_len -= (eb_len + EB_HEADSIZE); if (rc != PK_OK) break; } return rc;}#ifndef SFX/**************************//* Function test_NTSD() */ /* returns PK_WARN when NTSD data is invalid *//**************************/#ifdef __BORLANDC__/* Turn off warning about not using all parameters for this function only */#pragma argsused#endifint test_NTSD(__G__ eb, eb_size, eb_ucptr, eb_ucsize) __GDEF uch *eb; unsigned eb_size; uch *eb_ucptr; ulg eb_ucsize;{ int r = PK_OK; if (!ValidateSecurity(eb_ucptr)) r = PK_WARN; return r;} /* end function test_NTSD() */#endif /* !SFX */#endif /* NTSD_EAS *//**********************//* Function IsWinNT() *//**********************/int IsWinNT(void) /* returns TRUE if real NT, FALSE if Win95 or Win32s */{ static DWORD g_PlatformId = 0xFFFFFFFF; /* saved platform indicator */ if (g_PlatformId == 0xFFFFFFFF) { /* note: GetVersionEx() doesn't exist on WinNT 3.1 */ if (GetVersion() < 0x80000000) g_PlatformId = TRUE; else g_PlatformId = FALSE; } return (int)g_PlatformId;}/* DEBUG_TIME insertion: */#ifdef DEBUG_TIMEstatic int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft);static int show_NTFileTime(FILE *hdo, char *TTmsg, int isloc, FILETIME *pft){ SYSTEMTIME w32tm; int rval; rval = FileTimeToSystemTime(pft, &w32tm); if (!rval) { fprintf(hdo, "%s\n %08lX,%08lX (%s) -> Conversion failed !!!\n", TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime), (isloc ? "local" : "UTC")); } else { fprintf(hdo, "%s\n %08lx,%08lx -> %04u-%02u-%02u, %02u:%02u:%02u %s\n", TTmsg, (ulg)(pft->dwHighDateTime), (ulg)(pft->dwLowDateTime), w32tm.wYear, w32tm.wMonth, w32tm.wDay, w32tm.wHour, w32tm.wMinute, w32tm.wSecond, (isloc ? "local" : "UTC")); } return rval;}#define FTTrace(x) show_NTFileTime x#else#define FTTrace(x)#endif /* DEBUG_TIME *//* end of TIME_DEBUG insertion */#if (defined(USE_EF_UT_TIME) || defined(NT_TZBUG_WORKAROUND) || \ defined(TIMESTAMP))#ifndef IZ_USE_INT64# if (defined(__GNUC__) || defined(ULONG_LONG_MAX)) typedef long long LLONG64; typedef unsigned long long ULLNG64;# define IZ_USE_INT64# elif (defined(__WATCOMC__) && (__WATCOMC__ >= 1100)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64;# define IZ_USE_INT64# elif (defined(_MSC_VER) && (_MSC_VER >= 1100)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64;# define IZ_USE_INT64# elif (defined(__IBMC__) && (__IBMC__ >= 350)) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64;# define IZ_USE_INT64# elif defined(HAVE_INT64) typedef __int64 LLONG64; typedef unsigned __int64 ULLNG64;# define IZ_USE_INT64# endif#endif/*****************************//* Function utime2FileTime() */ /* convert Unix time_t format into the *//*****************************/ /* form used by SetFileTime() in NT/95 */#define UNIX_TIME_ZERO_HI 0x019DB1DEUL#define UNIX_TIME_ZERO_LO 0xD53E8000UL#define NT_QUANTA_PER_UNIX 10000000Lstatic void utime2FileTime(time_t ut, FILETIME *pft){#ifdef IZ_USE_INT64 ULLNG64 NTtime; /* NT_QUANTA_PER_UNIX is small enough so that "ut * NT_QUANTA_PER_UNIX" * cannot overflow in 64-bit signed calculation, regardless wether "ut" * is signed or unsigned. */ NTtime = ((LLONG64)ut * NT_QUANTA_PER_UNIX) + ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32)); pft->dwLowDateTime = (DWORD)NTtime; pft->dwHighDateTime = (DWORD)(NTtime >> 32);#else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */ unsigned int b1, b2, carry = 0; unsigned long r0, r1, r2, r3; long r4; /* signed, to catch environments with signed time_t */ b1 = ut & 0xFFFF; b2 = (ut >> 16) & 0xFFFF; /* if ut is over 32 bits, too bad */ r1 = b1 * (NT_QUANTA_PER_UNIX & 0xFFFF); r2 = b1 * (NT_QUANTA_PER_UNIX >> 16); r3 = b2 * (NT_QUANTA_PER_UNIX & 0xFFFF); r4 = b2 * (NT_QUANTA_PER_UNIX >> 16); r0 = (r1 + (r2 << 16)) & 0xFFFFFFFFL; if (r0 < r1) carry++; r1 = r0; r0 = (r0 + (r3 << 16)) & 0xFFFFFFFFL; if (r0 < r1) carry++; pft->dwLowDateTime = r0 + UNIX_TIME_ZERO_LO; if (pft->dwLowDateTime < r0) carry++; pft->dwHighDateTime = r4 + (r2 >> 16) + (r3 >> 16) + UNIX_TIME_ZERO_HI + carry;#endif /* ?IZ_USE_INT64 */} /* end function utime2FileTime() *//******************************//* Function FStampIsLocTime() *//******************************/static int FStampIsLocTime(__GPRO__ const char *path){ return (NTQueryVolInfo(__G__ path) ? G.lastVolLocTim : FALSE);}#endif /* USE_EF_UT_TIME || NT_TZBUG_WORKAROUND || TIMESTAMP */#ifndef NT_TZBUG_WORKAROUND# define UTIME_BOUNDCHECK_1(utimval) \ if (fs_uses_loctime) { \ utime_dosmin = dos_to_unix_time(DOSTIME_MINIMUM); \ if ((ulg)utimval < (ulg)utime_dosmin) \ utimval = utime_dosmin; \ }# define UTIME_BOUNDCHECK_N(utimval) \ if (fs_uses_loctime && ((ulg)utimval < (ulg)utime_dosmin)) \ utimval = utime_dosmin;# define NT_TZBUG_PRECOMPENSATE(ut, pft)#else /* NT_TZBUG_WORKAROUND */# define UNIX_TIME_UMAX_HI 0x0236485EUL# define UNIX_TIME_UMAX_LO 0xD4A5E980UL# define UNIX_TIME_SMIN_HI 0x0151669EUL# define UNIX_TIME_SMIN_LO 0xD53E8000UL# define UNIX_TIME_SMAX_HI 0x01E9FD1EUL# define UNIX_TIME_SMAX_LO 0xD4A5E980UL# define UTIME_1980_JAN_01_00_00 315532800L# define UTIME_BOUNDCHECK_1(utimval)# define UTIME_BOUNDCHECK_N(utimval)# define NT_TZBUG_PRECOMPENSATE(ut, pft) \ if (fs_uses_loctime) NTtzbugWorkaround(ut, pft); /* nonzero if `y' is a leap year, else zero */# define leap(y) (((y)%4 == 0 && (y)%100 != 0) || (y)%400 == 0) /* number of leap years from 1970 to `y' (not including `y' itself) */# define nleap(y) (((y)-1969)/4 - ((y)-1901)/100 + ((y)-1601)/400)extern ZCONST ush ydays[]; /* defined in fileio.c *//*****************************//* Function FileTime2utime() *//*****************************/static int FileTime2utime(const FILETIME *pft, time_t *ut){#ifdef IZ_USE_INT64 ULLNG64 NTtime; NTtime = ((ULLNG64)pft->dwLowDateTime + ((ULLNG64)pft->dwHighDateTime << 32));#ifndef TIME_T_TYPE_DOUBLE /* underflow and overflow handling */#ifdef CHECK_UTIME_SIGNED_UNSIGNED if ((time_t)0x80000000L < (time_t)0L) { if (NTtime < ((ULLNG64)UNIX_TIME_SMIN_LO + ((ULLNG64)UNIX_TIME_SMIN_HI << 32))) { *ut = (time_t)LONG_MIN; return FALSE; } if (NTtime > ((ULLNG64)UNIX_TIME_SMAX_LO + ((ULLNG64)UNIX_TIME_SMAX_HI << 32))) { *ut = (time_t)LONG_MAX; return FALSE; } } else#endif /* CHECK_UTIME_SIGNED_UNSIGNED */ { if (NTtime < ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32))) { *ut = (time_t)0; return FALSE; } if (NTtime > ((ULLNG64)UNIX_TIME_UMAX_LO + ((ULLNG64)UNIX_TIME_UMAX_HI << 32))) { *ut = (time_t)ULONG_MAX; return FALSE; } }#endif /* !TIME_T_TYPE_DOUBLE */ NTtime -= ((ULLNG64)UNIX_TIME_ZERO_LO + ((ULLNG64)UNIX_TIME_ZERO_HI << 32)); *ut = (time_t)(NTtime / (unsigned long)NT_QUANTA_PER_UNIX); return TRUE;#else /* !IZ_USE_INT64 (64-bit integer arithmetics may not be supported) */ time_t days; SYSTEMTIME w32tm;#ifndef TIME_T_TYPE_DOUBLE /* underflow and overflow handling */#ifdef CHECK_UTIME_SIGNED_UNSIGNED if ((time_t)0x80000000L < (time_t)0L) { if ((pft->dwHighDateTime < UNIX_TIME_SMIN_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMIN_HI) && (pft->dwLowDateTime < UNIX_TIME_SMIN_LO))) { *ut = (time_t)LONG_MIN; return FALSE; if ((pft->dwHighDateTime > UNIX_TIME_SMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_SMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_SMAX_LO))) { *ut = (time_t)LONG_MAX; return FALSE; } } else#endif /* CHECK_UTIME_SIGNED_UNSIGNED */ { if ((pft->dwHighDateTime < UNIX_TIME_ZERO_HI) || ((pft->dwHighDateTime == UNIX_TIME_ZERO_HI) && (pft->dwLowDateTime < UNIX_TIME_ZERO_LO))) { *ut = (time_t)0; return FALSE; } if ((pft->dwHighDateTime > UNIX_TIME_UMAX_HI) || ((pft->dwHighDateTime == UNIX_TIME_UMAX_HI) && (pft->dwLowDateTime > UNIX_TIME_UMAX_LO))) { *ut = (time_t)ULONG_MAX; return FALSE; } }#endif /* !TIME_T_TYPE_DOUBLE */ FileTimeToSystemTime(pft, &w32tm); /* set `days' to the number of days into the year */ days = w32tm.wDay - 1 + ydays[w32tm.wMonth-1] + (w32tm.wMonth > 2 && leap (w32tm.wYear)); /* now set `days' to the number of days since 1 Jan 1970 */ days += 365 * (time_t)(w32tm.wYear - 1970) + (time_t)(nleap(w32tm.wYear)); *ut = (time_t)(86400L * days + 3600L * (time_t)w32tm.wHour + (time_t)(60 * w32tm.wMinute + w32tm.wSecond)); return TRUE;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -