private int ProcessExtraFieldUnixTimes(byte[] buffer, int j, Int16 dataSize, long posn)
{
// The Unix filetimes are 32-bit unsigned integers,
// storing seconds since Unix epoch.
if (dataSize != 13 && dataSize != 9 && dataSize != 5)
throw new BadReadException(String.Format(" Unexpected size (0x{0:X4}) for Extended Timestamp extra field at position 0x{1:X16}", dataSize, posn));
int remainingData = dataSize;
var slurp = new Func<DateTime>( () => {
Int32 timet = BitConverter.ToInt32(buffer, j);
j += 4;
remainingData -= 4;
return _unixEpoch.AddSeconds(timet);
});
if (dataSize == 13 || _readExtraDepth > 0)
{
byte flag = buffer[j++];
remainingData--;
if ((flag & 0x0001) != 0 && remainingData >= 4)
this._Mtime = slurp();
this._Atime = ((flag & 0x0002) != 0 && remainingData >= 4)
? slurp()
: DateTime.UtcNow;
this._Ctime = ((flag & 0x0004) != 0 && remainingData >= 4)
? slurp()
:DateTime.UtcNow;
_timestamp |= ZipEntryTimestamp.Unix;
_ntfsTimesAreSet = true;
_emitUnixTimes = true;
}
else
ReadExtraField(); // will recurse
return j;
}