fopencookie problem in glibc 2.3.5?

kladit@t-online.de kladit@t-online.de
Fri Apr 8 16:17:00 GMT 2005


Arkadiusz Miskiewicz wrote:

>Hi,
>
>On glibc 2.3.5 (Linux 2.6.11, ppc32, x86) I'm getting different behaviour than on
>2.3.4 when using fopencookie. Example program attached.
>
>On glibc 2.3.4:
>[arekm@perfo1 arekm]$ gcc testcookie.c -Wall -O2; ./a.out .bashrc
>1: ftell 0
>2: fseek ret: 0 ftell 0
>3: fseek ret: 0 ftell 5
>4: char: s fread ret: 1 ftell: 6
>
>On glibc 2.3.5:
>[arekm@iarm ~]$ gcc testcookie.c -Wall -O2 ; ./a.out .bashrc
>1: ftell 0
>2: fseek ret: 0 ftell 0
>3: fseek ret: 0 ftell 0
>4: char: ð fread ret: 1 ftell: -1
>
>Could anyone try to run it on 2.3.5? Thanks.
>
># define _GNU_SOURCE 1
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>#include <errno.h>
>#include <zlib.h>
>#include <libio.h>
>
>static size_t myread(void* myhandle, char* buffer, size_t size)
>{
>  return fread(buffer, 1, size, (FILE*)myhandle);
>}
>static size_t mywrite(void* myhandle, char* buffer, size_t size)
>{
>  return fwrite(buffer, 1, size, (FILE*)myhandle);
>}
>static int myseek(void* myhandle, fpos_t* position, int whence)
>{
>  return fseek((FILE*)myhandle, *(unsigned int*)position, whence);
>}
>static int myclose(void* myhandle)
>{
>  return fclose((FILE*)myhandle);
>}
>
>cookie_io_functions_t myfunctions =
>{ 
>  (cookie_read_function_t*)myread, 
>  (cookie_write_function_t*)mywrite, 
>  (cookie_seek_function_t*)myseek, 
>  (cookie_close_function_t*)myclose
>};
>
>int main(int argc, char *argv[])
>{
>    char *path = argv[1];
>    FILE *zstream;
>    FILE *stream;
>    int c, d;
>    
>    if ((zstream = fopen(path, "r")) != NULL) {
>        stream = fopencookie(zstream, "r", myfunctions);
>	if (!stream) {
>		printf("fopencookie failed\n");
>		return 1;
>	}
>        printf("1: ftell %ld\n", ftell(stream));
>	d = fseek(stream, 0, SEEK_CUR);
>	printf("2: fseek ret: %d ftell %ld\n", d, ftell(stream));
>	d = fseek(stream, 5, SEEK_SET);
>	printf("3: fseek ret: %d ftell %ld\n", d, ftell(stream));
>        d = fread(&c, 1, 1, stream);
>        printf("4: char: %c fread ret: %d ftell: %ld\n", (unsigned char)c, d, ftell(stream));
>	fclose(zstream);
>    }
>    return 1;
>}
>
>
>  
>
Arkadiusz, same here with glibc-2.3.5 installed.

a.out a.out

1: ftell 0
2: fseek ret: 0 ftell 0
3: fseek ret: 0 ftell 0
4: char:  fread ret: 1 ftell: -1

--
Regards Klaus




More information about the Libc-alpha mailing list