| /* | |
| * FreeRTOS+FAT build 191128 - Note: FreeRTOS+FAT is still in the lab! | |
| * Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| * Authors include James Walmsley, Hein Tibosch and Richard Barry | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a copy of | |
| * this software and associated documentation files (the "Software"), to deal in | |
| * the Software without restriction, including without limitation the rights to | |
| * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
| * the Software, and to permit persons to whom the Software is furnished to do so, | |
| * subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be included in all | |
| * copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
| * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
| * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| * | |
| * https://www.FreeRTOS.org | |
| * | |
| */ | |
| /* | |
| ff_stdio.h | |
| An front-end which make +FAT look like the well-known stdio-functions | |
| */ | |
| #ifndef FF_STDIO_H | |
| #define FF_STDIO_H | |
| #if defined(__WIN32__) | |
| #include <dir.h> | |
| #endif | |
| /* Standard includes. */ | |
| #include <stdio.h> | |
| #include <stdarg.h> | |
| /* FreeRTOS+FAT includes. */ | |
| #include "ff_headers.h" | |
| #include "ff_sys.h" | |
| #if( ffconfigDEV_SUPPORT != 0 ) | |
| #include "ff_devices.h" | |
| #endif | |
| #ifdef __cplusplus | |
| extern "C" { | |
| #endif | |
| /* Error return from some functions. */ | |
| #define FF_EOF (-1) | |
| /* Bits used in the FF_Stat_t structure. */ | |
| #define FF_IFDIR 0040000u /* directory */ | |
| #define FF_IFCHR 0020000u /* character special */ | |
| #define FF_IFBLK 0060000u /* block special */ | |
| #define FF_IFREG 0100000u /* regular */ | |
| /* Bits used in the FF_FindData_t structure. */ | |
| #define FF_FA_NORMAL 0x00 | |
| #define FF_FA_RDONLY 0x01 | |
| #define FF_FA_HIDDEN 0x02 | |
| #define FF_FA_SYSTEM 0x04 | |
| #define FF_FA_LABEL 0x08 | |
| #define FF_FA_DIREC 0x10 | |
| #define FF_FA_ARCH 0x20 | |
| /* FreeRTOS+FAT uses three thread local buffers. The first stores errno, the | |
| second a pointer to the CWD structure (if one is used), and the third the more | |
| descriptive error code. */ | |
| #define stdioERRNO_THREAD_LOCAL_OFFSET ( ffconfigCWD_THREAD_LOCAL_INDEX + 0 ) | |
| #define stdioCWD_THREAD_LOCAL_OFFSET ( ffconfigCWD_THREAD_LOCAL_INDEX + 1 ) | |
| #define stdioFF_ERROR_THREAD_LOCAL_OFFSET ( ffconfigCWD_THREAD_LOCAL_INDEX + 2 ) | |
| /* Structure used with ff_stat(). */ | |
| typedef struct FF_STAT | |
| { | |
| uint32_t st_ino; /* First data cluster number. */ | |
| uint32_t st_size; /* Size of the object in number of bytes. */ | |
| uint16_t st_dev; /* The device on which the file can be found (see ff_sys.c) */ | |
| uint16_t st_mode; /* The mode (attribute bits) of this file or directory. */ | |
| #if( ffconfigTIME_SUPPORT == 1 ) | |
| uint32_t st_atime; | |
| uint32_t st_mtime; | |
| uint32_t st_ctime; | |
| #endif /* ffconfigTIME_SUPPORT */ | |
| } FF_Stat_t; | |
| /* Structure used with ff_findfirst(), ff_findnext(), etc. */ | |
| typedef struct | |
| { | |
| /* private */ | |
| UBaseType_t | |
| #if( ffconfigDEV_SUPPORT != 0 ) | |
| bIsDeviceDir : 1, | |
| #endif | |
| bEntryPOwner : 1; | |
| struct FF_DIR_HANDLER xDirectoryHandler; | |
| FF_DirEnt_t xDirectoryEntry; | |
| /* Public fields included so FF_DirEnt_t does not need to be public. */ | |
| const char * pcFileName; | |
| uint32_t ulFileSize; | |
| uint8_t ucAttributes; | |
| } FF_FindData_t; | |
| /*----------------------------------------------------------- | |
| * Get and set the task's file system errno | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| /* | |
| int FF_GetErrno( void ); | |
| void FF_SetErrno( int ff_errno ); | |
| _RB_ comments are incorrect and index should use the stdioERRNO_THREAD_LOCAL_OFFSET offset. | |
| */ | |
| /* The errno is stored in a thread local buffer. */ | |
| static portINLINE void stdioSET_ERRNO( int iErrno ) | |
| { | |
| vTaskSetThreadLocalStoragePointer( NULL, ffconfigCWD_THREAD_LOCAL_INDEX, ( void * ) ( iErrno ) ); | |
| } | |
| static portINLINE int stdioGET_ERRNO( void ) | |
| { | |
| void *pvResult; | |
| pvResult = pvTaskGetThreadLocalStoragePointer( ( TaskHandle_t )NULL, ffconfigCWD_THREAD_LOCAL_INDEX ); | |
| return ( int ) pvResult; | |
| } | |
| #if( ( configNUM_THREAD_LOCAL_STORAGE_POINTERS - ffconfigCWD_THREAD_LOCAL_INDEX ) < 3 ) | |
| #error Please define space for 3 entries | |
| #endif | |
| /* | |
| * Store the FreeRTOS+FAT error code, which provides more detail than errno. | |
| */ | |
| static portINLINE void stdioSET_FF_ERROR( FF_Error_t iFF_ERROR ) | |
| { | |
| vTaskSetThreadLocalStoragePointer( NULL, stdioFF_ERROR_THREAD_LOCAL_OFFSET, ( void * ) ( iFF_ERROR ) ); | |
| } | |
| /* | |
| * Read back the FreeRTOS+FAT error code, which provides more detail than | |
| * errno. | |
| */ | |
| static portINLINE FF_Error_t stdioGET_FF_ERROR( void ) | |
| { | |
| void *pvResult; | |
| pvResult = pvTaskGetThreadLocalStoragePointer( NULL, stdioFF_ERROR_THREAD_LOCAL_OFFSET ); | |
| return ( FF_Error_t ) pvResult; | |
| } | |
| /*----------------------------------------------------------- | |
| * Open and close a file | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| FF_FILE *ff_fopen( const char *pcFile, const char *pcMode ); | |
| int ff_fclose( FF_FILE *pxStream ); | |
| /*----------------------------------------------------------- | |
| * Seek and tell | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_fseek( FF_FILE *pxStream, long lOffset, int iWhence ); | |
| void ff_rewind( FF_FILE *pxStream ); | |
| long ff_ftell( FF_FILE *pxStream ); | |
| int ff_feof( FF_FILE *pxStream ); | |
| /*----------------------------------------------------------- | |
| * Read and write | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| size_t ff_fread( void *pvBuffer, size_t xSize, size_t xItems, FF_FILE * pxStream ); | |
| size_t ff_fwrite( const void *pvBuffer, size_t xSize, size_t xItems, FF_FILE * pxStream ); | |
| /* Whenever possible, use ellipsis parameter type checking. | |
| _RB_ Compiler specifics need to be moved to the compiler specific header files. */ | |
| #if defined(__GNUC__) | |
| /* The GNU-C compiler will check if the parameters are correct. */ | |
| int ff_fprintf( FF_FILE * pxStream, const char *pcFormat, ... ) | |
| __attribute__ ( ( format ( __printf__, 2, 3 ) ) ); | |
| #else | |
| int ff_fprintf( FF_FILE * pxStream, const char *pcFormat, ... ); | |
| #endif | |
| int ff_fgetc( FF_FILE * pxStream); | |
| int ff_fputc( int iChar, FF_FILE *pxStream ); | |
| char *ff_fgets( char *pcBuffer, size_t xCount, FF_FILE *pxStream ); | |
| /*----------------------------------------------------------- | |
| * Change length of file (truncate) | |
| * File should have been opened in "w" or "a" mode | |
| * The actual length of the file will be made equal to the current writing | |
| * position | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_seteof( FF_FILE *pxStream ); | |
| /*----------------------------------------------------------- | |
| * Open a file in append/update mode, truncate its length to a given value, | |
| * or write zero's up until the required length, and return a handle to the open | |
| * file. If NULL is returned, ff_errno contains an error code. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| FF_FILE *ff_truncate( const char * pcFileName, long lTruncateSize ); | |
| /*----------------------------------------------------------- | |
| * Flush to disk | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_fflush( FF_FILE *pxStream ); | |
| /*----------------------------------------------------------- | |
| * Create directory, remove and rename files | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| #if( ffconfigMKDIR_RECURSIVE == 0 ) | |
| int ff_mkdir( const char *pcPath ); | |
| #else | |
| /* If the parameter bRecursive is non-zero, the entire path will be checked | |
| and if necessary, created. */ | |
| int ff_mkdir( const char *pcPath, int bRecursive ); | |
| #endif | |
| /*----------------------------------------------------------- | |
| * Create path specified by the pcPath parameter. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_mkpath( const char *pcPath ); | |
| /*----------------------------------------------------------- | |
| * Remove the directory specified by the pcDirectory parameter. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_rmdir( const char *pcDirectory ); | |
| /*----------------------------------------------------------- | |
| * Delete a directory and, recursively, all of its contents. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| #if( ffconfigUSE_DELTREE != 0 ) | |
| /* By default, this function will not be compiled. The function will | |
| recursively call itself, which is against the FreeRTOS coding standards, so | |
| IT MUST BE USED WITH CARE. | |
| The cost of each recursion will be roughly: | |
| Stack : 48 (12 stack words) | |
| Heap : 112 + ffconfigMAX_FILENAME | |
| These numbers may change depending on CPU and compiler. */ | |
| int ff_deltree( const char *pcPath ); | |
| #endif | |
| /*----------------------------------------------------------- | |
| * Remove/delete a file. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_remove( const char *pcPath ); | |
| /*----------------------------------------------------------- | |
| * Move a file, also cross-directory but not across a file system. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_rename( const char *pcOldName, const char *pcNewName, int bDeleteIfExists ); | |
| /*----------------------------------------------------------- | |
| * Get the status of a file. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| int ff_stat( const char *pcFileName, FF_Stat_t *pxStatBuffer ); | |
| /* _HT_ Keep this for a while, until the new ff_stat() is wel tested */ | |
| int ff_old_stat( const char *pcName, FF_Stat_t *pxStatBuffer ); | |
| /*----------------------------------------------------------- | |
| * Get the length of a file in bytes. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| size_t ff_filelength( FF_FILE *pxFile ); | |
| /*----------------------------------------------------------- | |
| * Working directory and iterating through directories. | |
| * The most up to date API documentation is currently provided on the following URL: | |
| * http://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Standard_File_System_API.html | |
| *-----------------------------------------------------------*/ | |
| #if ffconfigHAS_CWD | |
| int ff_chdir( const char *pcDirectoryName ); | |
| char *ff_getcwd( char *pcBuffer, size_t xBufferLength ); | |
| #endif | |
| int ff_findfirst( const char *pcDirectory, FF_FindData_t *pxFindData ); | |
| int ff_findnext( FF_FindData_t *pxFindData ); | |
| int ff_isdirempty(const char *pcPath ); | |
| /* _RB_ What to do regarding documentation for the definitions below here. */ | |
| #if( ffconfig64_NUM_SUPPORT != 0 ) | |
| int64_t ff_diskfree(const char *pcPath, uint32_t *pxSectorCount ); | |
| #else | |
| int32_t ff_diskfree(const char *pcPath, uint32_t *pxSectorCount ); | |
| #endif | |
| int ff_finddir( const char *pcPath ); | |
| #if( ffconfigHAS_CWD == 1 ) | |
| /* Obtain the CWD used by the current task. */ | |
| void ff_free_CWD_space( void ); | |
| #endif | |
| typedef enum _EFileAction { | |
| eFileCreate, | |
| eFileRemove, | |
| eFileChange, | |
| eFileIsDir = 0x80, | |
| } eFileAction_t; | |
| void callFileEvents( const char *apPath, eFileAction_t aAction ); | |
| #ifdef __cplusplus | |
| } /* extern "C" */ | |
| #endif | |
| #endif /* FF_STDIO_H */ |