Пример #1
0
Файл: vfs.c Проект: Rotte/osm-k
int vfs_write(openfile_t file, void *buffer, int datasize)
{
    openfile_entry_t *openfile;
    fs_t *fs;
    int ret;

    if (vfs_start_op() != VFS_OK)
        return VFS_UNUSABLE;

    openfile = vfs_verify_open(file);
    fs = openfile->filesystem;

    KERNEL_ASSERT(datasize >= 0 && buffer != NULL);

    ret = fs->write(fs, openfile->fileid, buffer, datasize,
                    openfile->seek_position);

    if(ret > 0) {
        semaphore_P(openfile_table.sem);
        openfile->seek_position += ret;
        semaphore_V(openfile_table.sem);
    }

    vfs_end_op();
    return ret;
}
Пример #2
0
Файл: vfs.c Проект: mrb852/osm
/**
 * Seek given file to given position. The position is not verified
 * to be within the file's size.
 *
 * @param file Open file
 *
 * @param seek_position New positive seek position.
 *
 * @return VFS_OK, panics on invalid arguments.
 *
 */
int vfs_seek(openfile_t file, int seek_position)
{
  openfile_entry_t *openfile;

  if (vfs_start_op() != VFS_OK)
    return VFS_UNUSABLE;

  if(seek_position < 0) {
    return VFS_INVALID_PARAMS;
  }

  semaphore_P(openfile_table.sem);

  openfile = vfs_verify_open(file);
  if (openfile == NULL) {
    semaphore_V(openfile_table.sem);
    return VFS_NOT_OPEN;
  }

  openfile->seek_position = seek_position;

  semaphore_V(openfile_table.sem);

  vfs_end_op();
  return VFS_OK;
}
Пример #3
0
Файл: vfs.c Проект: mrb852/osm
/**
 * Close open file.
 *
 * @param file Openfile id
 *
 * @return VFS_OK on success, negative (VFS_*) on error.
 *
 */
int vfs_close(openfile_t file)
{
  openfile_entry_t *openfile;
  fs_t *fs;
  int ret;

  if (vfs_start_op() != VFS_OK)
    return VFS_UNUSABLE;

  semaphore_P(openfile_table.sem);

  openfile = vfs_verify_open(file);
  if (openfile == NULL) {
    semaphore_V(openfile_table.sem);
    return VFS_NOT_OPEN;
  }

  fs = openfile->filesystem;

  ret = fs->close(fs, openfile->fileid);
  openfile->filesystem = NULL;

  semaphore_V(openfile_table.sem);

  vfs_end_op();
  return ret;
}
Пример #4
0
Файл: vfs.c Проект: Rotte/osm-k
int vfs_seek(openfile_t file, int seek_position)
{
    openfile_entry_t *openfile;

    if (vfs_start_op() != VFS_OK)
        return VFS_UNUSABLE;

    KERNEL_ASSERT(seek_position >= 0);
    semaphore_P(openfile_table.sem);

    openfile = vfs_verify_open(file);
    openfile->seek_position = seek_position;

    semaphore_V(openfile_table.sem);

    vfs_end_op();
    return VFS_OK;
}
Пример #5
0
Файл: vfs.c Проект: mrb852/osm
/**
 * Tells the given file's position.
 *
 * @param file Open file
 *
 * @return the file's seek position. Negative values on error
 *
 */
int vfs_tell(openfile_t file)
{
  openfile_entry_t *openfile;

  if (vfs_start_op() != VFS_OK)
    return VFS_UNUSABLE;

  semaphore_P(openfile_table.sem);

  openfile = vfs_verify_open(file);
  if (openfile == NULL) {
    semaphore_V(openfile_table.sem);
    return VFS_NOT_OPEN;
  }

  int seek_position = openfile->seek_position;

  semaphore_V(openfile_table.sem);

  vfs_end_op();
  return seek_position;
}
Пример #6
0
Файл: vfs.c Проект: mrb852/osm
/**
 * Writes datasize bytes from given buffer to given open file.
 * The write is started from current seek position and after writing, the
 * position is updated.
 *
 * @param file Open file
 *
 * @param buffer Buffer to be written to file.
 *
 * @param datasize Number of bytes to write.
 *
 * @return Number of bytes written. All bytes are written unless error
 * prevented to do that. Negative values are specific error conditions.
 *
 */
int vfs_write(openfile_t file, void *buffer, int datasize)
{
  openfile_entry_t *openfile;
  fs_t *fs;
  int fileid, seek_position, ret;

  if (datasize < 0 || buffer == NULL) {
    return VFS_INVALID_PARAMS;
  }

  if (vfs_start_op() != VFS_OK)
    return VFS_UNUSABLE;

  semaphore_P(openfile_table.sem);

  openfile = vfs_verify_open(file);
  if (openfile == NULL) {
    semaphore_V(openfile_table.sem);
    return VFS_NOT_OPEN;
  }

  fs = openfile->filesystem;
  fileid = openfile->fileid;
  seek_position = openfile->seek_position;

  semaphore_V(openfile_table.sem);

  ret = fs->write(fs, fileid, buffer, datasize, seek_position);

  if(ret > 0) {
    semaphore_P(openfile_table.sem);
    openfile->seek_position += ret;
    semaphore_V(openfile_table.sem);
  }

  vfs_end_op();
  return ret;
}