Message-Id: <199807152043.NAA16544@geocities.com> From: cssl AT geocities DOT com Sender: cssl AT mail DOT geocities DOT com To: djgpp-workers AT delorie DOT com Date: Sat, 11 Jul 1998 05:40:30 GMT0BST MIME-Version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7BIT Subject: FSEXT bug ? Reply-to: Diego Zuccato Precedence: bulk Getting strange results from FSEXT family of functions, I decided to investigate a bit, so I wrote a test program to see what really happens. Well, I think that's NOT the correct behaviour. Please try this little program. Shouldn't it call WRITE only once ? Or at least once for every character, but it shouldn't call it with different parts of the same string ! Uh, try both WITH and WITHOUT the setvbuf(). Without it apparently the first character is lost. Am I missing something ? -------8<-------------------8<------------------8<------------------------ #include #include #include #include // handles open() and creat() int _my_open_handler(__FSEXT_Fnumber, int *, va_list); // handles all other funcs int _my_handler(__FSEXT_Fnumber, int *, va_list); static void __attribute__((constructor)) init_FSEXT(void) { __FSEXT_add_open_handler(_my_open_handler); }; int _my_open_handler(__FSEXT_Fnumber n, int *rv, va_list args) { int my_handle; switch(n) { case __FSEXT_open: my_handle=__FSEXT_alloc_fd(_my_handler); printf("OPEN : Allocated handle #%d\n",my_handle); __FSEXT_set_function(my_handle,_my_handler); *rv=my_handle; break; case __FSEXT_creat: my_handle=__FSEXT_alloc_fd(_my_handler); printf("CREAT : Allocated handle #%d\n",my_handle); __FSEXT_set_function(my_handle,_my_handler); *rv=my_handle; break; default: printf("OOPS! Neither open() nor creat() ... :-(\n"); return 0; }; return 1; // Call handled }; int _my_handler(__FSEXT_Fnumber n, int *rv, va_list args) { int our_handle=va_arg(args, int); int handled=1; printf(" -> "); // tells when we're entering this fn // Just for testing ! *rv=10; switch(n) { case __FSEXT_nop: // Handled, but nothing done printf("Uh ? Please, tell me how you went here !\n"); break; case __FSEXT_read: printf("READ: handle #%d\n",our_handle); break; case __FSEXT_write: { char *b=va_arg(args, char*); int n=va_arg(args, int); printf("WRITE: handle #%d : ",our_handle); printf("buf=\"%s\", nbyte=%d\n", b, n); }; break; case __FSEXT_ready: printf("READY: handle #%d\n",our_handle); break; case __FSEXT_close: printf("CLOSE: handle #%d\n",our_handle); handled=0; // Don't handle close any more ! break; default: printf("Something REALLY BAD happened !!!"); printf("Called _my_handler fn #%d on handle #%d\n", n, our_handle); exit(1); // ARGH! }; return handled; }; int main(void) { FILE *hnd; char buff[10]; printf("\nfopen : "); hnd= fopen("!.tst", "r+b"); /* setvbuf(hnd, NULL, _IONBF, 0);*/ printf("\nfgets : "); fgets(buff, 10, hnd); printf("\nfputs : "); fputs("Hello, world ! I'm here !", hnd); printf("\nfclose: "); fclose(hnd); }; -------8<-------------------8<------------------8<------------------------ BYtE, Diego.