/*- * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * * This was developed by Christopher W. Olsen for the UbixOS Project. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, this list of * conditions, the following disclaimer and the list of authors. * 2) Redistributions in binary form must reproduce the above copyright notice, this list of * conditions, the following disclaimer and the list of authors in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _UBIXFS_UBIXFS_H #define _UBIXFS_UBIXFS_H #include <sys/types.h> #include <vfs/vfs.h> #include <sys/device.h> #include <mpi/mpi.h> #include <ubixfs/dirCache.h> #define UBIXFS_BLOCKSIZE_BYTES blockSize*512 #define UBIXFS_ALIGN(size) (size + ((((size) % (UBIXFS_BLOCKSIZE_BYTES)) == 0)? 0 : ((UBIXFS_BLOCKSIZE_BYTES) - ((size) % (UBIXFS_BLOCKSIZE_BYTES))))) #define UBIXDISKMAGIC ((uInt32)0x45) /* The disk magic number */ #define MAXUBIXPARTITIONS 16 #define blockSize 8 #define EOBC -1 #define typeFile 1 #define typeContainer 2 #define typeDirectory 4 #define typeDeleted 8 /* Start */ struct directoryList { char dirName[256]; char *dirCache; uInt32 dirBlock; struct directoryList *next; struct directoryList *prev; }; typedef struct directoryList * dirList_t; dirList_t ubixFSLoadDir(char *); /* End */ //Partition Information struct ubixDiskLabel { uInt32 magicNum; uInt32 magicNum2; uInt16 driveType; uInt16 numPartitions; struct ubixPartitions { //the partition table uInt32 pSize; //number of sectors in partition uInt32 pOffset; //starting sector uInt32 pFsSize; //filesystem basic fragment size uInt32 pBatSize; //BAT size uInt8 pFsType; //filesystem type, see below uInt8 pFrag; //filesystem fragments per block } partitions[MAXUBIXPARTITIONS]; }; struct partitionInformation { uInt32 size; //Size In Sectors uInt32 startSector; //Base Sector Of Partition uInt32 blockAllocationTable; //Base Sector Of BAT uInt32 rootDirectory; //Base Sector Of Root Directory }; //Block Allocation Table Entry struct blockAllocationTableEntry { long attributes; //Block Attributes long realSector; //Real Sector long nextBlock; //Sector Of Next Block long reserved; //Reserved }; //UbixFS Directory Entry struct directoryEntry { uInt32 startCluster; //Starting Cluster Of File uInt32 size; //Size Of File uInt32 creationDate; //Date Created uInt32 lastModified; //Date Last Modified uInt32 uid; //UID Of Owner uInt32 gid; //GID Of Owner uInt16 attributes; //Files Attributes uInt16 permissions; //Files Permissions char fileName[256]; //File Name }; struct bootSect { uInt8 jmp[4]; uInt8 id[6]; uInt16 version; uInt16 tmp; uInt16 fsStart; uInt16 tmp2; uInt32 krnl_start; uInt BytesPerSector; uInt SectersPerTrack; uInt TotalHeads; uInt32 TotalSectors; uInt8 code[479]; }; struct ubixFSInfo { struct blockAllocationTableEntry *blockAllocationTable; struct cacheNode * dirCache; uInt32 batEntries; uInt32 rootDir; }; /* ubixFSInfo */ int readFile(char *file); int writeFileByte(int ch, fileDescriptor *fd, long offset); //int openFileUbixFS(char *file,fileDescriptor *fd); int getFreeBlocks(int count, fileDescriptor *fd); //extern struct ubixDiskLabel *diskLabel; //Good Functions //void initUbixFS(struct mountPoints *mp); int readUbixFS(fileDescriptor *fd, char *data, uInt32, long size); int writeUbixFS(fileDescriptor *fd, char *data, long offset, long size); void syncBat(struct vfs_mountPoint *mp); int freeBlocks(int block, fileDescriptor *fd); int addDirEntry(struct directoryEntry *dir, fileDescriptor *fd); void ubixFSUnlink(char *path, struct vfs_mountPoint *mp); int ubixFSmkDir(char *dir, fileDescriptor *fd); int ubixfs_init(); int ubixfs_initialize(); void ubixfs_thread(); #endif /* END _UBIXFS_UBIXFS_H */