@@ -237,10 +237,11 @@ OFString *fileName = [entry fileName]; OFString *outFileName = [fileName stringByStandardizingPath]; OFArray OF_GENERIC(OFString *) *pathComponents; OFString *directory; OFFile *output; + OFStream *stream; uint64_t written = 0, size = [entry size]; int8_t percent = -1, newPercent; if (!all && ![files containsObject: fileName]) continue; @@ -317,12 +318,14 @@ output = [OFFile fileWithPath: outFileName mode: @"w"]; setPermissions(outFileName, entry); - while (![entry isAtEndOfStream]) { - ssize_t length = [app copyBlockFromStream: entry + stream = [_archive streamForReadingCurrentEntry]; + + while (![stream isAtEndOfStream]) { + ssize_t length = [app copyBlockFromStream: stream toStream: output fileName: fileName]; if (length < 0) { app->_exitStatus = 1; @@ -386,16 +389,19 @@ files = [OFMutableSet setWithArray: files_]; while ((entry = [_archive nextEntry]) != nil) { OFString *fileName = [entry fileName]; + OFStream *stream; if (![files containsObject: fileName]) continue; - while (![entry isAtEndOfStream]) { - ssize_t length = [app copyBlockFromStream: entry + stream = [_archive streamForReadingCurrentEntry]; + + while (![stream isAtEndOfStream]) { + ssize_t length = [app copyBlockFromStream: stream toStream: of_stdout fileName: fileName]; if (length < 0) { app->_exitStatus = 1; @@ -402,11 +408,11 @@ return; } } [files removeObject: fileName]; - [entry close]; + [stream close]; if ([files count] == 0) break; }