/* * Copyright (c) 2016-2020 Belledonne Communications SARL. * * This file is part of bctoolbox. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef BCTBX_VFS_H #define BCTBX_VFS_H #include #include #if !defined(_WIN32_WCE) #include #include #if _MSC_VER #include #endif #endif /*_WIN32_WCE*/ #ifndef _WIN32 #include #endif #ifdef _WIN32 #ifndef S_IRUSR #define S_IRUSR S_IREAD #endif #ifndef S_IWUSR #define S_IWUSR S_IWRITE #endif #endif /*!_WIN32*/ #define BCTBX_VFS_OK 0 /* Successful result */ #define BCTBX_VFS_ERROR -255 /* Some kind of disk I/O error occurred */ #ifdef __cplusplus extern "C"{ #endif /** * Methods associated with the bctbx_vfs_t. */ typedef struct bctbx_io_methods_t bctbx_io_methods_t; /** * VFS file handle. */ typedef struct bctbx_vfs_file_t bctbx_vfs_file_t; struct bctbx_vfs_file_t { const struct bctbx_io_methods_t *pMethods; /* Methods for an open file: all Developpers must supply this field at open step*/ /*the fields below are used by the default implementation. Developpers are not required to supply them, but may use them if they find * them useful*/ void* pUserData; /*Developpers can store private data under this pointer */ int fd; /* File descriptor */ off_t offset; /*File offset used by lseek*/ }; /** */ struct bctbx_io_methods_t { int (*pFuncClose)(bctbx_vfs_file_t *pFile); ssize_t (*pFuncRead)(bctbx_vfs_file_t *pFile, void* buf, size_t count, off_t offset); ssize_t (*pFuncWrite)(bctbx_vfs_file_t *pFile, const void* buf, size_t count, off_t offset); int (*pFuncTruncate)(bctbx_vfs_file_t *pFile, int64_t size); int64_t (*pFuncFileSize)(bctbx_vfs_file_t *pFile); int (*pFuncGetLineFromFd)(bctbx_vfs_file_t *pFile, char* s, int count); off_t (*pFuncSeek)(bctbx_vfs_file_t *pFile, off_t offset, int whence); }; /** * VFS definition */ typedef struct bctbx_vfs_t bctbx_vfs_t; struct bctbx_vfs_t { const char *vfsName; /* Virtual file system name */ int (*pFuncOpen)(bctbx_vfs_t *pVfs, bctbx_vfs_file_t *pFile, const char *fName, int openFlags); }; /* API to use the VFS */ /* * This function returns a pointer to the VFS implemented in this file. */ BCTBX_PUBLIC bctbx_vfs_t *bc_create_vfs(void); /** * Attempts to read count bytes from the open file given by pFile, at the position starting at offset * in the file and and puts them in the buffer pointed by buf. * @param pFile bctbx_vfs_file_t File handle pointer. * @param buf Buffer holding the read bytes. * @param count Number of bytes to read. * @param offset Where to start reading in the file (in bytes). * @return Number of bytes read on success, BCTBX_VFS_ERROR otherwise. */ BCTBX_PUBLIC ssize_t bctbx_file_read(bctbx_vfs_file_t *pFile, void *buf, size_t count, off_t offset); /** * Close the file from its descriptor pointed by thw bctbx_vfs_file_t handle. * @param pFile File handle pointer. * @return return value from the pFuncClose VFS Close function on success, * BCTBX_VFS_ERROR otherwise. */ BCTBX_PUBLIC int bctbx_file_close(bctbx_vfs_file_t *pFile); /** * Allocates a bctbx_vfs_file_t file handle pointer. Opens the file fName * with the mode specified by the mode argument. Calls bctbx_file_open. * @param pVfs Pointer to the vfs instance in use. * @param fName Absolute file path. * @param mode File access mode (char*). * @return pointer to bctbx_vfs_file_t on success, NULL otherwise. */ BCTBX_PUBLIC bctbx_vfs_file_t* bctbx_file_open(bctbx_vfs_t *pVfs, const char *fName, const char *mode); /** * Allocates a bctbx_vfs_file_t file handle pointer. Opens the file fName * with the mode specified by the mode argument. Calls bctbx_file_open. * @param pVfs Pointer to the vfs instance in use. * @param fName Absolute file path. * @param openFlags File access flags(integer). * @return pointer to bctbx_vfs_file_t on success, NULL otherwise. */ BCTBX_PUBLIC bctbx_vfs_file_t* bctbx_file_open2(bctbx_vfs_t *pVfs, const char *fName, const int openFlags); /** * Returns the file size. * @param pFile bctbx_vfs_file_t File handle pointer. * @return BCTBX_VFS_ERROR if an error occured, file size otherwise. */ BCTBX_PUBLIC int64_t bctbx_file_size(bctbx_vfs_file_t *pFile); /** * Truncates/ Extends a file. * @param pFile bctbx_vfs_file_t File handle pointer. * @param size New size of the file. * @return BCTBX_VFS_ERROR if an error occured, 0 otherwise. */ BCTBX_PUBLIC int bctbx_file_truncate(bctbx_vfs_file_t *pFile, int64_t size); /** * Write count bytes contained in buf to a file associated with pFile at the position * offset. Calls pFuncWrite (set to bc_Write by default). * @param pFile File handle pointer. * @param buf Buffer hodling the values to write. * @param count Number of bytes to write to the file. * @param offset Position in the file where to start writing. * @return Number of bytes written on success, BCTBX_VFS_ERROR if an error occurred. */ BCTBX_PUBLIC ssize_t bctbx_file_write(bctbx_vfs_file_t *pFile, const void *buf, size_t count, off_t offset); /** * Writes to file. * @param pFile File handle pointer. * @param offset where to write in the file * @param fmt format argument, similar to that of printf * @return Number of bytes written if success, BCTBX_VFS_ERROR otherwise. */ BCTBX_PUBLIC ssize_t bctbx_file_fprintf(bctbx_vfs_file_t *pFile, off_t offset, const char *fmt, ...); /** * Wrapper to pFuncGetNxtLine. Returns a line with at most maxlen characters * from the file associated to pFile and writes it into s. * @param pFile File handle pointer. * @param s Buffer where to store the read line. * @param maxlen Number of characters to read to find a line in the file. * @return BCTBX_VFS_ERROR if an error occurred, size of line read otherwise. */ BCTBX_PUBLIC int bctbx_file_get_nxtline(bctbx_vfs_file_t *pFile, char *s, int maxlen); /** * Wrapper to pFuncSeek VFS method call. Set the position to offset in the file. * @param pFile File handle pointer. * @param offset File offset where to set the position to. * @param whence Either SEEK_SET, SEEK_CUR,SEEK_END * @return BCTBX_VFS_ERROR on error, offset otherwise. */ BCTBX_PUBLIC off_t bctbx_file_seek(bctbx_vfs_file_t *pFile, off_t offset, int whence); /** * Set default VFS pointer pDefault to my_vfs. * By default, the global pointer is set to use VFS implemnted in vfs.c * @param my_vfs Pointer to a bctbx_vfs_t structure. */ BCTBX_PUBLIC void bctbx_vfs_set_default(bctbx_vfs_t *my_vfs); /** * Returns the value of the global variable pDefault, * pointing to the default vfs used. * @return Pointer to bctbx_vfs_t set to operate as default VFS. */ BCTBX_PUBLIC bctbx_vfs_t* bctbx_vfs_get_default(void); /** * Return pointer to standard VFS impletentation. * @return pointer to bcVfs */ BCTBX_PUBLIC bctbx_vfs_t* bctbx_vfs_get_standard(void); #ifdef __cplusplus } #endif #endif /* BCTBX_VFS_H */