Beispiel #1
0
int memfile_open(
  rtems_libio_t *iop,
  const char    *pathname,
  int            oflag,
  mode_t         mode
)
{
  IMFS_jnode_t  *the_jnode;

  the_jnode = iop->pathinfo.node_access;

  /*
   * Perform 'copy on write' for linear files
   */
  if ((iop->flags & LIBIO_FLAGS_WRITE)
   && (IMFS_type( the_jnode ) == IMFS_LINEAR_FILE)) {
    uint32_t   count = the_jnode->info.linearfile.size;
    const unsigned char *buffer = the_jnode->info.linearfile.direct;

    the_jnode->control = &IMFS_node_control_memfile;
    the_jnode->info.file.size            = 0;
    the_jnode->info.file.indirect        = 0;
    the_jnode->info.file.doubly_indirect = 0;
    the_jnode->info.file.triply_indirect = 0;
    if ((count != 0)
     && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
        return -1;
  }

  return 0;
}
Beispiel #2
0
int memfile_open(
  rtems_libio_t *iop,
  const char    *pathname,
  uint32_t       flag,
  uint32_t       mode
)
{
  IMFS_jnode_t  *the_jnode;

  the_jnode = iop->file_info;

  /*
   * Perform 'copy on write' for linear files
   */
  if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND))
   && (the_jnode->type == IMFS_LINEAR_FILE)) {
    uint32_t   count = the_jnode->info.linearfile.size;
    const unsigned char *buffer = the_jnode->info.linearfile.direct;

    the_jnode->type = IMFS_MEMORY_FILE;
    the_jnode->info.file.size            = 0;
    the_jnode->info.file.indirect        = 0;
    the_jnode->info.file.doubly_indirect = 0;
    the_jnode->info.file.triply_indirect = 0;
    if ((count != 0)
     && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1))
        return -1;
  }
  if (iop->flags & LIBIO_FLAGS_APPEND)
    iop->offset = the_jnode->info.file.size;

  iop->size = the_jnode->info.file.size;
  return 0;
}
Beispiel #3
0
/*
 *  memfile_write
 *
 *  This routine processes the write() system call.
 */
ssize_t memfile_write(
  rtems_libio_t *iop,
  const void    *buffer,
  size_t         count
)
{
  IMFS_jnode_t   *the_jnode;
  ssize_t         status;

  the_jnode = iop->pathinfo.node_access;

  status = IMFS_memfile_write( the_jnode, iop->offset, buffer, count );
  iop->size = the_jnode->info.file.size;

  return status;
}
Beispiel #4
0
static ssize_t memfile_write(
  rtems_libio_t *iop,
  const void    *buffer,
  size_t         count
)
{
  IMFS_memfile_t *memfile = IMFS_iop_to_memfile( iop );
  ssize_t         status;

  if (rtems_libio_iop_is_append(iop))
    iop->offset = memfile->File.size;

  status = IMFS_memfile_write( memfile, iop->offset, buffer, count );

  if ( status > 0 )
    iop->offset += status;

  return status;
}
Beispiel #5
0
static ssize_t memfile_write(
  rtems_libio_t *iop,
  const void    *buffer,
  size_t         count
)
{
  IMFS_memfile_t *memfile = IMFS_iop_to_memfile( iop );
  ssize_t         status;

  if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
    iop->offset = memfile->File.size;

  status = IMFS_memfile_write( memfile, iop->offset, buffer, count );

  if ( status > 0 )
    iop->offset += status;

  return status;
}
Beispiel #6
0
ssize_t memfile_write(
  rtems_libio_t *iop,
  const void    *buffer,
  size_t         count
)
{
  IMFS_jnode_t   *the_jnode;
  ssize_t         status;

  the_jnode = iop->pathinfo.node_access;

  if ((iop->flags & LIBIO_FLAGS_APPEND) != 0)
    iop->offset = the_jnode->info.file.size;

  status = IMFS_memfile_write( the_jnode, iop->offset, buffer, count );

  if ( status > 0 )
    iop->offset += status;

  return status;
}