blob: a116860d6b01c92ebff5faa3ec39d5cc1c4d55d3 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (c) 2017, Linaro Limited
*/
#ifndef __TEE_FS_DIRFILE_H
#define __TEE_FS_DIRFILE_H
#include <tee/tee_fs.h>
#include <tee/fs_htree.h>
struct tee_fs_dirfile_dirh;
/**
* struct tee_fs_dirfile_fileh - file handle
* @file_number: sequence number of a file
* @hash: hash of file, to be supplied to tee_fs_htree_open()
* @idx: index of the file handle in the dirfile
*/
struct tee_fs_dirfile_fileh {
uint32_t file_number;
uint8_t hash[TEE_FS_HTREE_HASH_SIZE];
int idx;
};
/**
* struct tee_fs_dirfile_operations - file interface supplied by user of this
* interface
* @open: opens a file
* @close: closes a file, changes are discarded unless
* @commit_writes is called before
* @read: reads from an open file
* @write: writes to an open file
* @commit_writes: commits changes since the file was opened
*/
struct tee_fs_dirfile_operations {
TEE_Result (*open)(bool create, uint8_t *hash, const TEE_UUID *uuid,
struct tee_fs_dirfile_fileh *dfh,
struct tee_file_handle **fh);
void (*close)(struct tee_file_handle *fh);
TEE_Result (*read)(struct tee_file_handle *fh, size_t pos,
void *buf, size_t *len);
TEE_Result (*write)(struct tee_file_handle *fh, size_t pos,
const void *buf, size_t len);
TEE_Result (*commit_writes)(struct tee_file_handle *fh, uint8_t *hash);
};
/**
* tee_fs_dirfile_open() - opens a dirfile handle
* @create: true if a new dirfile is to be created, else the dirfile
* is read opened and verified
* @hash: hash of underlying file
* @fops: file interface
* @dirh: returned dirfile handle
*/
TEE_Result tee_fs_dirfile_open(bool create, uint8_t *hash,
const struct tee_fs_dirfile_operations *fops,
struct tee_fs_dirfile_dirh **dirh);
/**
* tee_fs_dirfile_close() - closes a dirfile handle
* @dirh: dirfile handle
*
* All changes since last call to tee_fs_dirfile_commit_writes() are
* discarded.
*/
void tee_fs_dirfile_close(struct tee_fs_dirfile_dirh *dirh);
/**
* tee_fs_dirfile_commit_writes() - commit updates of dirfile
* @dirh: dirfile handle
* @hash: hash of underlying file is copied here if not NULL
*/
TEE_Result tee_fs_dirfile_commit_writes(struct tee_fs_dirfile_dirh *dirh,
uint8_t *hash);
/**
* tee_fs_dirfile_get_tmp() - get a temporary file handle
* @dirh: dirfile handle
* @dfh: returned temporary file handle
*
* Note, nothing is queued up as changes to the dirfile with this function.
*/
TEE_Result tee_fs_dirfile_get_tmp(struct tee_fs_dirfile_dirh *dirh,
struct tee_fs_dirfile_fileh *dfh);
/**
* tee_fs_dirfile_find() - find a file handle
* @dirh: dirfile handle
* @uuid: uuid of requesting TA
* @oid: object id
* @oidlen: length of object id
* @dfh: returned file handle
*/
TEE_Result tee_fs_dirfile_find(struct tee_fs_dirfile_dirh *dirh,
const TEE_UUID *uuid, const void *oid,
size_t oidlen, struct tee_fs_dirfile_fileh *dfh);
/**
* tee_fs_dirfile_fileh_to_fname() - get string representation of file handle
* @dfh: file handle
* @fname: buffer
* @fnlen: length of buffer, updated to used length
*/
TEE_Result tee_fs_dirfile_fileh_to_fname(const struct tee_fs_dirfile_fileh *dfh,
char *fname, size_t *fnlen);
/**
* tee_fs_dirfile_rename() - changes/supplies file handle object id
* @dirh: dirfile handle
* @uuid: uuid of requesting TA
* @dfh: file handle
* @oid: object id
* @oidlen: length of object id
*
* If the supplied object id already is used by another file is that file
* removed from the dirfile.
*/
TEE_Result tee_fs_dirfile_rename(struct tee_fs_dirfile_dirh *dirh,
const TEE_UUID *uuid,
struct tee_fs_dirfile_fileh *dfh,
const void *oid, size_t oidlen);
/**
* tee_fs_dirfile_remove() - remove file
* @dirh: dirfile handle
* @dfh: file handle
*/
TEE_Result tee_fs_dirfile_remove(struct tee_fs_dirfile_dirh *dirh,
const struct tee_fs_dirfile_fileh *dfh);
/**
* tee_fs_dirfile_update_hash() - update hash of file handle
* @dirh: filefile handle
* @dfh: file handle
*/
TEE_Result tee_fs_dirfile_update_hash(struct tee_fs_dirfile_dirh *dirh,
const struct tee_fs_dirfile_fileh *dfh);
/**
* tee_fs_dirfile_get_next() - get object id of next file
* @dirh: dirfile handle
* @uuid: uuid of requesting TA
* @idx: pointer to index
* @oid: object id
* @oidlen: length of object id
*
* If @idx contains -1 the first object id is returned, *@idx is updated
* with the index of the file.
*/
TEE_Result tee_fs_dirfile_get_next(struct tee_fs_dirfile_dirh *dirh,
const TEE_UUID *uuid, int *idx, void *oid,
size_t *oidlen);
#endif /*__TEE_FS_DIRFILE_H*/