[devel] zlib/gzio.c: inconsistent gzeof()

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Чт Мар 6 15:54:11 MSK 2008


On Thu, Mar 06, 2008 at 03:25:11PM +0300, Alexey Tourbin wrote:
> Я обнаружил, что gzeof() ведёт себя по-разному, в зависимости от того,
> находимся ли мы режиме "transparent" (cat) или же в режиме настоящего
> разжатия.
> 
> А именно, в режиме настоящего разжатия, если прочитано батйтов меньше,
> чем запрошено, то (автоматически) выставляется флаг EOF.  В transparent
> режиме, если прочитано меньше, чем требуется, то флаг EOF выставляется
> только после следующего gzread(), который возвращает 0.
> 
> $ cat test.c
> #include <stdio.h>
> #include <stdlib.h>
> #include <assert.h>
> #include <zlib.h>
> int main(int argc, char *argv[])
> {
> 	gzFile gz = gzopen(argv[1], "rb");
> 	assert(gz);
> 
> 	char buf[BUFSIZ];
> 	int n = gzread(gz, buf, sizeof(buf));
> 	printf("n=%d eof=%d\n", n, gzeof(gz));
> 
> 	return 0;
> }
> $ echo a >a
> $ echo a |gzip >a.gz
> $ gcc -Wall test.c -lz
> $ ./a.out a.gz
> n=2 eof=1
> $ ./a.out a   
> n=2 eof=0
> $ 
> 
> Хотел спросить, надо это фиксить или нет.

Ещё одно любопытное обстоятельство: если прочитано ровно столько байтов,
сколько запрошено, то в режиме разжатия gzeof() возвращает 1 (флаг z_eof
на самом деле не установлен, но в gzeof() есть дополнительная проверка
z_err == Z_STREAM_END).

А стандартный feof(3) в этом случае вроде бы возвращает 0.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 197 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20080306/8c158d67/attachment-0002.bin>


Подробная информация о списке рассылки Devel