delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1997/03/07/01:13:19

From: James McCann <jmccann AT junkmailwolfenet DOT com>
Newsgroups: comp.os.msdos.djgpp
Subject: File system extensions -- write() doesn't work?
Date: Thu, 06 Mar 1997 19:07:03 -0800
Organization: Wolfe Internet Access, L.L.C.
Lines: 64
Message-ID: <331F8657.68B1707@junkmailwolfenet.com>
NNTP-Posting-Host: sea-ts1-p70.wolfenet.com
Mime-Version: 1.0
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp

This is a multi-part message in MIME format.

--------------69F4B1BE202C450B50DAB238
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

The attached program shows  behavior I did not expect.  It installs
a handler for file descriptors returned by __FSEXT_allocate_fd and 
installs the handler w/ FSEXT_set_function.  When the write function 
is called, the handler is called only for the first write.  Read and 
close work as expected, and if the write() calls are replaced w/ calls
to _write(), the handler is called as expected.  I am using the libc.a
from djdev201.zip dated 10/31/96.

Is this a bug, or am I doing something wrong?
-- 
James McCann
jmccann AT wolfenet DOT com
jmccann AT scn DOT org

--------------69F4B1BE202C450B50DAB238
Content-Type: text/plain; charset=us-ascii; name="fseerr.c"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="fseerr.c"

/* ---------------  cut here ------------------*/
#include <sys/fsext.h>
#include <stdio.h>
#include <unistd.h>
int handler(__FSEXT_Fnumber f, int *rv, va_list args)
{
  int fd = va_arg(args, int);
  fprintf(stderr, "calling handler, fd: %d:  ", fd);
  switch(f){
  case __FSEXT_write: fprintf(stderr, "write\n"); return 1;
  case __FSEXT_read: fprintf(stderr, "read\n"); return 1;
  case __FSEXT_close: fprintf(stderr, "close\n");
    __FSEXT_set_function(fd, 0); _close(fd); return 1;
  default:fprintf(stderr, "huh?\n"); return 0;
  }/* switch(f) */
}
main()
{
  int fd[2];
  FILE *f[2];
  char j[] = "junk";
  char b[10];
  fd[0] = __FSEXT_alloc_fd(handler);
  fd[1] = __FSEXT_alloc_fd(handler);
  if(fd[0]<0 || fd[1]<0){ fprintf(stderr, "bad fd\n", exit(1));}
  read(fd[0], b, 1); /*_*/write(fd[0], j, 1); close(fd[0]);
  read(fd[1], b, 1); /*_*/write(fd[1], j, 1); close(fd[1]);
  f[0] = tmpfile(); f[1] = tmpfile();
  if(!f[0] || !f[1]){ fprintf(stderr, "bad file *\n", exit(1));}
  fd[0] = fileno(f[0]); fd[1] = fileno(f[1]);
  if(fd[0]<0 || fd[1]<0){ fprintf(stderr, "bad fd\n", exit(1));}
  __FSEXT_set_function(fd[0], handler); __FSEXT_set_function(fd[1], handler);
  read(fd[0], b, 1); /*_*/write(fd[0], j, 1);
  read(fd[1], b, 1); /*_*/write(fd[1], j, 1);
}
/* ----------------- end ---------------------*/

--------------69F4B1BE202C450B50DAB238--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019