Successfully opens any file name given to it and pretends that all files have a certain number of bytes (set by application at time of mounting the file system.) Can be used to simulate large files sourced from an ultra fast file system to find and correct bugs in other areas of an application.

Committer:
AdamGreen
Date:
Sun Dec 25 01:31:16 2011 +0000
Revision:
0:911b8403d557

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AdamGreen 0:911b8403d557 1 /* Copyright 2011 Adam Green (http://mbed.org/users/AdamGreen/)
AdamGreen 0:911b8403d557 2
AdamGreen 0:911b8403d557 3 Licensed under the Apache License, Version 2.0 (the "License");
AdamGreen 0:911b8403d557 4 you may not use this file except in compliance with the License.
AdamGreen 0:911b8403d557 5 You may obtain a copy of the License at
AdamGreen 0:911b8403d557 6
AdamGreen 0:911b8403d557 7 http://www.apache.org/licenses/LICENSE-2.0
AdamGreen 0:911b8403d557 8
AdamGreen 0:911b8403d557 9 Unless required by applicable law or agreed to in writing, software
AdamGreen 0:911b8403d557 10 distributed under the License is distributed on an "AS IS" BASIS,
AdamGreen 0:911b8403d557 11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AdamGreen 0:911b8403d557 12 See the License for the specific language governing permissions and
AdamGreen 0:911b8403d557 13 limitations under the License.
AdamGreen 0:911b8403d557 14 */
AdamGreen 0:911b8403d557 15 /* Specifies the classes used to implement the FakeFileSystem which is a
AdamGreen 0:911b8403d557 16 read-only file system that exists in the internal Fake of the mbed
AdamGreen 0:911b8403d557 17 device.
AdamGreen 0:911b8403d557 18 */
AdamGreen 0:911b8403d557 19 #include <mbed.h>
AdamGreen 0:911b8403d557 20 #include <assert.h>
AdamGreen 0:911b8403d557 21 #include "FakeFileSystem.h"
AdamGreen 0:911b8403d557 22
AdamGreen 0:911b8403d557 23
AdamGreen 0:911b8403d557 24 FakeFileSystemFileHandle::FakeFileSystemFileHandle(size_t FileSize)
AdamGreen 0:911b8403d557 25 {
AdamGreen 0:911b8403d557 26 SetEntry(FileSize);
AdamGreen 0:911b8403d557 27 }
AdamGreen 0:911b8403d557 28
AdamGreen 0:911b8403d557 29 FakeFileSystemFileHandle::FakeFileSystemFileHandle()
AdamGreen 0:911b8403d557 30 {
AdamGreen 0:911b8403d557 31 SetEntry(0);
AdamGreen 0:911b8403d557 32 }
AdamGreen 0:911b8403d557 33
AdamGreen 0:911b8403d557 34 ssize_t FakeFileSystemFileHandle::write(const void* pBuffer, size_t Length)
AdamGreen 0:911b8403d557 35 {
AdamGreen 0:911b8403d557 36 // This file system doesn't support writing.
AdamGreen 0:911b8403d557 37 return -1;
AdamGreen 0:911b8403d557 38 }
AdamGreen 0:911b8403d557 39
AdamGreen 0:911b8403d557 40
AdamGreen 0:911b8403d557 41 int FakeFileSystemFileHandle::close()
AdamGreen 0:911b8403d557 42 {
AdamGreen 0:911b8403d557 43 SetEntry(0);
AdamGreen 0:911b8403d557 44
AdamGreen 0:911b8403d557 45 return 0;
AdamGreen 0:911b8403d557 46 }
AdamGreen 0:911b8403d557 47
AdamGreen 0:911b8403d557 48 ssize_t FakeFileSystemFileHandle::read(void* pBuffer, size_t Length)
AdamGreen 0:911b8403d557 49 {
AdamGreen 0:911b8403d557 50 unsigned int BytesLeft;
AdamGreen 0:911b8403d557 51
AdamGreen 0:911b8403d557 52 // Don't read more bytes than what are left in the file.
AdamGreen 0:911b8403d557 53 BytesLeft = m_Size - m_Offset;
AdamGreen 0:911b8403d557 54 if (Length > BytesLeft)
AdamGreen 0:911b8403d557 55 {
AdamGreen 0:911b8403d557 56 Length = BytesLeft;
AdamGreen 0:911b8403d557 57 }
AdamGreen 0:911b8403d557 58
AdamGreen 0:911b8403d557 59 // Just leave buffer as is since we are just faking file reads.
AdamGreen 0:911b8403d557 60
AdamGreen 0:911b8403d557 61 // Update the file pointer.
AdamGreen 0:911b8403d557 62 m_Offset += Length;
AdamGreen 0:911b8403d557 63
AdamGreen 0:911b8403d557 64 return Length;
AdamGreen 0:911b8403d557 65 }
AdamGreen 0:911b8403d557 66
AdamGreen 0:911b8403d557 67 int FakeFileSystemFileHandle::isatty()
AdamGreen 0:911b8403d557 68 {
AdamGreen 0:911b8403d557 69 return 0;
AdamGreen 0:911b8403d557 70 }
AdamGreen 0:911b8403d557 71
AdamGreen 0:911b8403d557 72 off_t FakeFileSystemFileHandle::lseek(off_t offset, int whence)
AdamGreen 0:911b8403d557 73 {
AdamGreen 0:911b8403d557 74 switch(whence)
AdamGreen 0:911b8403d557 75 {
AdamGreen 0:911b8403d557 76 case SEEK_SET:
AdamGreen 0:911b8403d557 77 m_Offset = offset;
AdamGreen 0:911b8403d557 78 break;
AdamGreen 0:911b8403d557 79 case SEEK_CUR:
AdamGreen 0:911b8403d557 80 m_Offset += offset;
AdamGreen 0:911b8403d557 81 break;
AdamGreen 0:911b8403d557 82 case SEEK_END:
AdamGreen 0:911b8403d557 83 m_Offset = (m_Size - 1) + offset;
AdamGreen 0:911b8403d557 84 break;
AdamGreen 0:911b8403d557 85 default:
AdamGreen 0:911b8403d557 86 return -1;
AdamGreen 0:911b8403d557 87 }
AdamGreen 0:911b8403d557 88
AdamGreen 0:911b8403d557 89 return m_Offset;
AdamGreen 0:911b8403d557 90 }
AdamGreen 0:911b8403d557 91
AdamGreen 0:911b8403d557 92 int FakeFileSystemFileHandle::fsync()
AdamGreen 0:911b8403d557 93 {
AdamGreen 0:911b8403d557 94 return 0;
AdamGreen 0:911b8403d557 95 }
AdamGreen 0:911b8403d557 96
AdamGreen 0:911b8403d557 97 off_t FakeFileSystemFileHandle::flen()
AdamGreen 0:911b8403d557 98 {
AdamGreen 0:911b8403d557 99 return m_Size;
AdamGreen 0:911b8403d557 100 }
AdamGreen 0:911b8403d557 101
AdamGreen 0:911b8403d557 102
AdamGreen 0:911b8403d557 103
AdamGreen 0:911b8403d557 104
AdamGreen 0:911b8403d557 105 FakeFileSystem::FakeFileSystem(const char* pName, size_t FakeFileSize) : FileSystemLike(pName)
AdamGreen 0:911b8403d557 106 {
AdamGreen 0:911b8403d557 107 m_FakeFileSize = FakeFileSize;
AdamGreen 0:911b8403d557 108 }
AdamGreen 0:911b8403d557 109
AdamGreen 0:911b8403d557 110 FileHandle* FakeFileSystem::open(const char* pFilename, int Flags)
AdamGreen 0:911b8403d557 111 {
AdamGreen 0:911b8403d557 112 // Can't find the file if file system hasn't been mounted.
AdamGreen 0:911b8403d557 113 if (!IsMounted())
AdamGreen 0:911b8403d557 114 {
AdamGreen 0:911b8403d557 115 return NULL;
AdamGreen 0:911b8403d557 116 }
AdamGreen 0:911b8403d557 117
AdamGreen 0:911b8403d557 118 // Can only open fake files for read.
AdamGreen 0:911b8403d557 119 if (O_RDONLY != Flags)
AdamGreen 0:911b8403d557 120 {
AdamGreen 0:911b8403d557 121 return NULL;
AdamGreen 0:911b8403d557 122 }
AdamGreen 0:911b8403d557 123
AdamGreen 0:911b8403d557 124 // Attempt to find a free file handle.
AdamGreen 0:911b8403d557 125 FakeFileSystemFileHandle* pFileHandle = FindFreeFileHandle();
AdamGreen 0:911b8403d557 126 if (!pFileHandle)
AdamGreen 0:911b8403d557 127 {
AdamGreen 0:911b8403d557 128 return NULL;
AdamGreen 0:911b8403d557 129 }
AdamGreen 0:911b8403d557 130
AdamGreen 0:911b8403d557 131 // Initialize the file handle and return it to caller.
AdamGreen 0:911b8403d557 132 pFileHandle->SetEntry(m_FakeFileSize);
AdamGreen 0:911b8403d557 133 return pFileHandle;
AdamGreen 0:911b8403d557 134 }
AdamGreen 0:911b8403d557 135
AdamGreen 0:911b8403d557 136 DirHandle* FakeFileSystem::opendir(const char *pDirectoryName)
AdamGreen 0:911b8403d557 137 {
AdamGreen 0:911b8403d557 138 return NULL;
AdamGreen 0:911b8403d557 139 }
AdamGreen 0:911b8403d557 140
AdamGreen 0:911b8403d557 141 FakeFileSystemFileHandle* FakeFileSystem::FindFreeFileHandle()
AdamGreen 0:911b8403d557 142 {
AdamGreen 0:911b8403d557 143 size_t i;
AdamGreen 0:911b8403d557 144
AdamGreen 0:911b8403d557 145 // Iterate through the file handle array, looking for a close file handle.
AdamGreen 0:911b8403d557 146 for (i = 0 ; i < sizeof(m_FileHandles)/sizeof(m_FileHandles[0]) ; i++)
AdamGreen 0:911b8403d557 147 {
AdamGreen 0:911b8403d557 148 if (m_FileHandles[i].IsClosed())
AdamGreen 0:911b8403d557 149 {
AdamGreen 0:911b8403d557 150 return &(m_FileHandles[i]);
AdamGreen 0:911b8403d557 151 }
AdamGreen 0:911b8403d557 152 }
AdamGreen 0:911b8403d557 153
AdamGreen 0:911b8403d557 154 // If we get here, then no free entries were found.
AdamGreen 0:911b8403d557 155 return NULL;
AdamGreen 0:911b8403d557 156 }