예제 #1
0
파일: vfs.c 프로젝트: Rotte/osm-k
int vfs_file(char *pathname, int idx, char *buffer)
{
    char volumename[VFS_NAME_LENGTH];
    char dirname[VFS_NAME_LENGTH];
    fs_t *fs = NULL;
    int ret;

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

    if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) {
        vfs_end_op();
        return VFS_ERROR;
    }

    semaphore_P(vfs_table.sem);

    fs = vfs_get_filesystem(volumename);

    if(fs == NULL) {
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_NO_SUCH_FS;
    }

    ret = fs->file(fs, dirname, idx, buffer);

    semaphore_V(vfs_table.sem);

    vfs_end_op();
    return ret;
}
예제 #2
0
파일: vfs.c 프로젝트: Rotte/osm-k
int vfs_create(char *pathname, int size)
{
    char volumename[VFS_NAME_LENGTH];
    char filename[VFS_NAME_LENGTH];
    fs_t *fs = NULL;
    int ret;

    KERNEL_ASSERT(size >= 0);

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

    if(vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) {
        vfs_end_op();
        return VFS_ERROR;
    }

    semaphore_P(vfs_table.sem);

    fs = vfs_get_filesystem(volumename);

    if(fs == NULL) {
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_NO_SUCH_FS;
    }

    ret = fs->create(fs, filename, size);

    semaphore_V(vfs_table.sem);

    vfs_end_op();
    return ret;
}
예제 #3
0
파일: vfs.c 프로젝트: mrb852/osm
/**
 * Removes given file from filesystem.
 *
 * @param pathname Full name of the file, including mountpoint.
 *
 * @return VFS_OK on success, negative (VFS_*) on failure.
 *
 */
int vfs_remove(const char *pathname)
{
  char volumename[VFS_NAME_LENGTH];
  char filename[VFS_NAME_LENGTH];
  fs_t *fs = NULL;
  int ret;

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

  if (vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) {
    vfs_end_op();
    return VFS_INVALID_PARAMS;
  }

  semaphore_P(vfs_table.sem);

  fs = vfs_get_filesystem(volumename);

  if(fs == NULL) {
    semaphore_V(vfs_table.sem);
    vfs_end_op();
    return VFS_NO_SUCH_FS;
  }

  ret = fs->remove(fs, filename);

  semaphore_V(vfs_table.sem);

  vfs_end_op();
  return ret;
}
예제 #4
0
파일: vfs.c 프로젝트: CasperBHansen/OSM
int vfs_file(char *pathname, int idx, char *buffer)
{
    char volumename[VFS_NAME_LENGTH];
    char dirname[VFS_NAME_LENGTH];
    fs_t *fs = NULL;
    int ret;

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

    if (pathname == NULL) {
        semaphore_P(vfs_table.sem);
        for (ret = 0; ret < CONFIG_MAX_FILESYSTEMS && idx != 0; ret++) {
            if (vfs_table.filesystems[ret].filesystem != NULL)
                idx--;
        }
        /* Error can be caused if idx was <= 0 or idx was higher than the
         * number of mounted volumes
         */
        if (idx != 0) {
            semaphore_V(vfs_table.sem);
            vfs_end_op();
            return VFS_ERROR;
        }
        stringcopy(buffer, vfs_table.filesystems[ret].mountpoint, VFS_NAME_LENGTH);
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_OK;
    }

    if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) {
        vfs_end_op();
        return VFS_ERROR;
    }

    semaphore_P(vfs_table.sem);

    fs = vfs_get_filesystem(volumename);

    if(fs == NULL) {
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_NO_SUCH_FS;
    }

    ret = fs->file(fs, dirname, idx, buffer);

    semaphore_V(vfs_table.sem);

    vfs_end_op();
    return ret;
}
예제 #5
0
파일: vfs.c 프로젝트: CasperBHansen/OSM
int vfs_filecount(char *pathname)
{
    char volumename[VFS_NAME_LENGTH];
    char dirname[VFS_NAME_LENGTH];
    fs_t *fs = NULL;
    int ret;

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

     if (pathname == NULL) {
         semaphore_P(vfs_table.sem);
         for (ret = 0; ret < CONFIG_MAX_FILESYSTEMS; ret++) {
             if (vfs_table.filesystems[ret].filesystem == NULL)
                 break;
         }
         semaphore_V(vfs_table.sem);
         vfs_end_op();
         return ret;
     }

    if (vfs_parse_pathname(pathname, volumename, dirname) != VFS_OK) {
        vfs_end_op();
        return VFS_ERROR;
    }

    semaphore_P(vfs_table.sem);

    fs = vfs_get_filesystem(volumename);

    if(fs == NULL) {
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_NO_SUCH_FS;
    }

    ret = fs->filecount(fs, dirname);

    semaphore_V(vfs_table.sem);

    vfs_end_op();
    return ret;
}
예제 #6
0
파일: vfs.c 프로젝트: Rotte/osm-k
openfile_t vfs_open(char *pathname)
{
    openfile_t file;
    int fileid;
    char volumename[VFS_NAME_LENGTH];
    char filename[VFS_NAME_LENGTH];
    fs_t *fs = NULL;

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

    if (vfs_parse_pathname(pathname, volumename, filename) != VFS_OK) {
        vfs_end_op();
        return VFS_ERROR;
    }

    semaphore_P(vfs_table.sem);
    semaphore_P(openfile_table.sem);

    for(file=0; file<CONFIG_MAX_OPEN_FILES; file++) {
        if(openfile_table.files[file].filesystem == NULL) {
            break;
        }
    }

    if(file >= CONFIG_MAX_OPEN_FILES) {
        semaphore_V(openfile_table.sem);
        semaphore_V(vfs_table.sem);
        kprintf("VFS: Warning, maximum number of open files exceeded.");
        vfs_end_op();
        return VFS_LIMIT;
    }

    fs = vfs_get_filesystem(volumename);

    if(fs == NULL) {
        semaphore_V(openfile_table.sem);
        semaphore_V(vfs_table.sem);
        vfs_end_op();
        return VFS_NO_SUCH_FS;
    }

    openfile_table.files[file].filesystem = fs;

    semaphore_V(openfile_table.sem);
    semaphore_V(vfs_table.sem);

    fileid = fs->open(fs, filename);

    if(fileid < 0) {
        semaphore_P(openfile_table.sem);
        openfile_table.files[file].filesystem = NULL;
        semaphore_V(openfile_table.sem);
        vfs_end_op();
        return fileid; /* negative -> error*/
    }

    openfile_table.files[file].fileid = fileid;
    openfile_table.files[file].seek_position = 0;

    vfs_end_op();
    return file;
}