| cvs.gedasymbols.org/djgpp/doc/libc/libc_361.html | search | 
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] | 
#include <sys/fsext.h> void * __FSEXT_set_data(int _fd, void *_data);  | 
This function is part of the File System Extensions.  It is used
to store a descriptor-specific pointer that can later be retrieved by
__FSEXT_get_data (see section __FSEXT_get_data).  The pointer is not
otherwise used.
This is useful when writing an extension that may be handling several
open pseudo-files.  __FSEXT_set_data can be used when creating or
opening the file to store a pointer to data about the specific file.  Later,
when specific operation needs to be done (e.g. read, write, etc.) a
pointer to pseudo-file associated with the file descriptor can  be fetched
with __FSEXT_get_data.
Returns the pointer you passed it, or NULL if there was an error.
| ANSI/ISO C | No | 
| POSIX | No | 
typedef struct
{
   void* Ptr;
   off_t Current_Ofs;
   size_t Size;
} _mem_file_t;
int my_fsext(__FSEXT_Fnumber Op, int* RV, va_list Args)
{
   const char* Path;
   void* Buffer;
   size_t Size;
   int fd;
   _mem_file_t* MPtr;
   switch (Op)
   {
      case __FSEXT_creat:
       /* Create a new memory file */
       Path = va_list(Args, const char*);
       /* Check to see if we should create a new file */
       if (strnicmp("/tmp/", Path, 5) != 0) return 0;
       /* Allocate some memory to keep info on our fake file */
       MPtr = malloc(sizeof(_mem_file_t));
       if (!MPtr) return 0;
       memset(MPtr, 0, sizeof(_mem_file_t));
       /* Get a file descriptor we can use */
       fd = __FSEXT_alloc_fd(my_fsext);
       if (fd < 0)
       {
          free(MPtr);
          return 0;
       }
       /* Now store our note about this file descriptor so we can
        * look it up quickly later. */
       __FSEXT_set_data(fd, MPtr);
       /* Return the file descriptor
       *RV = fd;
       return 1;
      case __FSEXT_read:
       /* Read from our memory file. */
       fd = va_list(Args, int);
       Buffer = va_list(Args, void*);
       Size = va_list(Args, size_t);
       /* Look up the information about this file */
       MPtr = __FSEXT_get_data(fd);
       if (!MPtr)
       {
           *RV = -1;
           return 1;
       }
       if (MPtr->Current_Ofs >= MPtr->Size)
       {
           *RV = 0;
           return 1;
       }
       if (Size > (MPtr->Size - MPtr->Current_Ofs))
        Size = MPtr->Size - MPtr->Current_Ofs;
       memcpy(Buffer, (char*) MPtr->Ptr+MPtr->Current_Ofs, Size);
       MPtr->Current_Ofs += Size;
       *RV = Size;
       return 1;
       
       ...
    }
}
 | 
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] | 
| webmaster | delorie software privacy | 
| Copyright © 2004 | Updated Apr 2004 |