61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
-
-
+
+
|
if (length == 0)
return 0;
if (buffer[0] == 0x80) {
for (size_t i = 1; i < length; i++)
value = (value << 8) | buffer[i];
} else
value = [stringFromBuffer(buffer, length,
OF_STRING_ENCODING_ASCII) octalValue];
value = stringFromBuffer(buffer, length,
OF_STRING_ENCODING_ASCII).octalValue;
if (value > max)
@throw [OFOutOfRangeException exception];
return value;
}
|
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
-
+
-
+
|
_modificationDate = [[OFDate alloc]
initWithTimeIntervalSince1970:
(of_time_interval_t)octalValueFromBuffer(
header + 136, 12, UINTMAX_MAX)];
_type = header[156];
targetFileName = stringFromBuffer(header + 157, 100, encoding);
if ([targetFileName length] > 0)
if (targetFileName.length > 0)
_targetFileName = [targetFileName copy];
if (_type == '\0')
_type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE;
if (memcmp(header + 257, "ustar\0" "00", 8) == 0) {
OFString *prefix;
_owner = [stringFromBuffer(header + 265, 32, encoding)
copy];
_group = [stringFromBuffer(header + 297, 32, encoding)
copy];
_deviceMajor = (uint32_t)octalValueFromBuffer(
header + 329, 8, UINT32_MAX);
_deviceMinor = (uint32_t)octalValueFromBuffer(
header + 337, 8, UINT32_MAX);
prefix = stringFromBuffer(header + 345, 155, encoding);
if ([prefix length] > 0) {
if (prefix.length > 0) {
OFString *fileName = [OFString
stringWithFormat: @"%@/%@",
prefix, _fileName];
[_fileName release];
_fileName = [fileName copy];
}
}
|
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
|
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
-
-
+
+
-
|
@"\tType = %u\n"
@"\tTarget file name = %@\n"
@"\tOwner = %@\n"
@"\tGroup = %@\n"
@"\tDevice major = %" PRIu32 @"\n"
@"\tDevice minor = %" PRIu32 @"\n"
@">",
[self class], _fileName, _mode, _UID, _GID, _size,
_modificationDate, _type, _targetFileName, _owner, _group,
self.class, _fileName, _mode, _UID, _GID, _size, _modificationDate,
_type, _targetFileName, _owner, _group, _deviceMajor, _deviceMinor];
_deviceMajor, _deviceMinor];
[ret retain];
objc_autoreleasePoolPop(pool);
return [ret autorelease];
}
|
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
|
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
|
-
+
|
OF_STRING_ENCODING_ASCII);
stringToBuffer(buffer + 116,
[OFString stringWithFormat: @"%06" PRIo16 " ", _GID], 8,
OF_STRING_ENCODING_ASCII);
stringToBuffer(buffer + 124,
[OFString stringWithFormat: @"%011" PRIo64 " ", _size], 12,
OF_STRING_ENCODING_ASCII);
modificationDate = [_modificationDate timeIntervalSince1970];
modificationDate = _modificationDate.timeIntervalSince1970;
stringToBuffer(buffer + 136,
[OFString stringWithFormat: @"%011" PRIo64 " ", modificationDate],
12, OF_STRING_ENCODING_ASCII);
/*
* During checksumming, the checksum field is expected to be set to 8
* spaces.
|