@@ -1,18 +1,22 @@
#ifndef _DIRCOMS
#define _DIRCOMS

int printdir(struct directory current);
struct directory finddir(struct directory current, unsigned int attr, char * name);
struct directory finddir_noattr(struct directory current, char * name);
struct directory parsedir(unsigned long sector, int print);

// High level functions for shell
int PrintDirectory(char args[][ACOLS]);
void ChangeDirectory(char args[][ACOLS]);
void CreateDirectory(char args[][ACOLS]);

// Low level operations
int removedir();
struct directory makedir();
int printdir(struct directory current);
struct directory finddir(struct directory current, unsigned int attr, char * name);
struct directory parsedir(unsigned long sector);

int checkdirerr(struct directory dir);
void convertdirname(struct directory dir, char * name);
unsigned int setclus(struct directory * dir);

int PrintDirectory(char args[][ACOLS]);
void ChangeDirectory(char args[][ACOLS]);
void PrintDirVerbose(struct directory dir);
void PrintDirStandard(struct directory dir);

@@ -7,19 +7,38 @@
#include "UTILS/filecoms.h"
#include "UTILS/utils.h"

int num_open_files = 0;

int openFile(char args[][ACOLS]) {
char * fileName = malloc(sizeof(char) * strlen(args[1]));
strcpy(fileName, args[1]);
struct directory found_dir;
found_dir = finddir_noattr(*fatcat.curDir, fileName);
found_dir = finddir(*fatcat.curDir, ATTR_ALL, fileName);

if (found_dir.name[0] == 0x00 || (found_dir.Attr & ATTR_LONG_NAME)) {
printf("%s does not exist in this directory\n", fileName);
return 0;
}

if (!(found_dir.Attr & ATTR_DIRECTORY)) {
printf("found file %s\n", fileName);
char * mode = malloc(sizeof(char) * strlen(args[2]));
strcpy(mode, args[2]);

printf("mode: %s\n", mode);

if (!strcmp(mode, "r"))
found_dir.Mode = R;
else if (!strcmp(mode, "rw") || !strcmp(mode, "wr"))
found_dir.Mode = RW;
else if (!strcmp(mode, "w"))
found_dir.Mode = W;
else {
printf("Incorrect mode or missing argument\n");
return 0;
}

OPENFILES[num_open_files] = found_dir;
num_open_files++;
}
else {
printf("%s is a directory\n", fileName);
@@ -6,8 +6,9 @@
* */
#include "../global.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "utils.h"
#include "dircoms.h"

@@ -22,6 +23,10 @@ int LoadImage(FILE * img) {

if(status != 0 && status != 1) printf("\n\nLoadImage error: %d\n", status);

#ifdef _DEBUGGING_BOOT_SECT
PrintBootSectInfo();
#endif

return status;
}

@@ -57,74 +62,16 @@ int LoadBPB(FILE * img) {
fread(&BS_VolLab, 1, 11, img);
fread(&BS_FilSysType, 1, 8, img);

#ifdef _DEBUGGING_BOOT_SECT
PrintBootSectInfo();
#endif

return 0;
}

int PrintBootSectInfo() {

printf("\n\nBytes Per Sector: %d\n", BPB_BytesPerSec);

printf("Sector Per Cluster: %d\n", BPB_SecPerClus);

printf("Reserved Sector Count: %d\n", BPB_RsvdSecCnt);

printf("Number Of FATs: %d\n", BPB_NumFATs);

printf("Root Directory Entry Count: %d\n", BPB_RootEntCnt);

printf("Total Sector Count in 16Bit: %d\n", BPB_TotSec16);

printf("Total Hidden Sectors: %d\n", BPB_HiddSec);

printf("Total Sector Count in 32Bit: %d\n", BPB_TotSec32);

printf("Sectors Occupied (32-bit count): %d\n", BPB_FATSz32);

printf("Various External Flags: %d\n", BPB_ExtFlags);

printf("Version Number: %d\n", BPB_FSVer);

printf("Cluster Number of Root Dir !: %d\n", BPB_RootClus);

printf("Sector Number of Info struct: %d\n", BPB_FSInfo);

printf("Sector number of reserved boot record copy: %d\n", BPB_BkBootSec);

printf("Reserved for future expansion:");

for (int i = 0; i < 3; i++)
printf("%d -", BPB_Reserved[i]);

printf("\nIndicates media type for drive(0x00 is floppy): %d\n", BS_DrvNum);

printf("Used by windows NT lol: %d\n", BS_Reserved1);

printf("Indicates if following values are present (ID, LAB): %d\n",
BS_BootSig);

printf("Volume Serial ID Number: %d\n", BS_VolID);

printf("Volume Serial Label:");

for (int i = 0; i < 11; i++)
printf("%d", BS_VolLab[i]);

printf("\n File System Type (indeterminate info only):");
for (int i = 0; i < 8; i++)
printf("%c", BS_FilSysType[i]);

printf("\n");
return 0;
}

/*
* Note also that the CountofClusters value is exactly that—the count of data clusters starting at cluster
2. The maximum valid cluster number for the volume is CountofClusters + 1, and the “count of
clusters including the two reserved clusters” is CountofClusters + 2.
* Note also that the CountofClusters value is exactly that—the count of data
* clusters starting at cluster
* 2. The maximum valid cluster number for the volume is CountofClusters + 1,
* and the “count of clusters including the two reserved clusters” is CountofClusters + 2.
*/
int SetRootDir(FILE * img) {

@@ -154,13 +101,31 @@ int SetRootDir(FILE * img) {
return 1;
}

void nametofat(char * name){
for(int i=0; i < strlen(name); i++){
if(name[i] == '/') name[i] = '\0';
name[i] = toupper(name[i]);
}
}

unsigned int setclus(struct directory * dir){
struct cluster temp;
unsigned int clusval = 0;

unsigned int FindFirstSector(unsigned int cluster){
unsigned int firstSector = 0;
dir->cluster = malloc(sizeof(struct cluster));

firstSector = ((cluster - 2) * BPB_SecPerClus) + fatcat.firstDataSector;
clusval = dir->FstClusHi;
clusval = clusval << 1;
clusval = clusval | dir->FstClusLO;
clusval = clusval == 0x00 ? BPB_RootClus : clusval;

return firstSector;
temp = FindClusterInfo(clusval);
#ifdef _DEBUGGING
printf("\nSetting Cluster info");
printf("\nCLUSTER VALUE: %d\n", clusval);
#endif
memcpy(dir->cluster, &temp, sizeof(struct cluster));
return 0;
}

struct cluster FindClusterInfo(unsigned int cluster){
@@ -173,8 +138,9 @@ struct cluster FindClusterInfo(unsigned int cluster){

while(more){
fatOffset = cluster * 4;

// Finds first data sector for cluster / cluster chain node
info.firstSectors[info.clusterNum] = FindFirstSector(cluster);
info.firstSectors[info.clusterNum] = ((cluster - 2) * BPB_SecPerClus) + fatcat.firstDataSector;
info.sectorNums[info.clusterNum] = BPB_RsvdSecCnt + (fatOffset / BPB_BytesPerSec); // sector of cluster chain info
info.entryOffset[info.clusterNum] = fatOffset % BPB_BytesPerSec; // offset of cluster chain info

@@ -190,6 +156,7 @@ struct cluster FindClusterInfo(unsigned int cluster){
if(more) cluster = next_cluster;

#ifdef _DEBUGGING
printf("\n\nCLUSTER USED:%d", cluster);
printf("\nFatOffset: 0x%x", fatOffset);
printf("\nThisFATSecNum: 0x%x", info.sectorNums[info.clusterNum]);
printf("\nThisFATEntOff: 0x%x", info.entryOffset[info.clusterNum]);
@@ -204,14 +171,60 @@ struct cluster FindClusterInfo(unsigned int cluster){
return info;
}

void GetClusterData(unsigned int cluster){
/* unsigned long DWORD = 0;
char* data = 0;
struct cluster info = FindClusterInfo(cluster);*/
int PrintBootSectInfo(){

}
printf("\n\nBytes Per Sector: %d\n", BPB_BytesPerSec);

printf("Sector Per Cluster: %d\n", BPB_SecPerClus);

printf("Reserved Sector Count: %d\n", BPB_RsvdSecCnt);

printf("Number Of FATs: %d\n", BPB_NumFATs);

printf("Root Directory Entry Count: %d\n", BPB_RootEntCnt);

printf("Total Sector Count in 16Bit: %d\n", BPB_TotSec16);

printf("Total Hidden Sectors: %d\n", BPB_HiddSec);

printf("Total Sector Count in 32Bit: %d\n", BPB_TotSec32);

printf("Sectors Occupied (32-bit count): %d\n", BPB_FATSz32);

printf("Various External Flags: %d\n", BPB_ExtFlags);

printf("Version Number: %d\n", BPB_FSVer);

void SetClusterData(unsigned int cluster){
printf("Cluster Number of Root Dir !: %d\n", BPB_RootClus);

printf("Sector Number of Info struct: %d\n", BPB_FSInfo);

printf("Sector number of reserved boot record copy: %d\n", BPB_BkBootSec);

printf("Reserved for future expansion:");

for (int i = 0; i < 3; i++)
printf("%d -", BPB_Reserved[i]);

printf("\nIndicates media type for drive(0x00 is floppy): %d\n", BS_DrvNum);

printf("Used by windows NT lol: %d\n", BS_Reserved1);

printf("Indicates if following values are present (ID, LAB): %d\n",
BS_BootSig);

printf("Volume Serial ID Number: %d\n", BS_VolID);

printf("Volume Serial Label:");

for (int i = 0; i < 11; i++)
printf("%d", BS_VolLab[i]);

printf("\n File System Type (indeterminate info only):");
for (int i = 0; i < 8; i++)
printf("%c", BS_FilSysType[i]);

printf("\n");
return 0;
}

@@ -5,7 +5,9 @@ int LoadImage(FILE * img);
int LoadBPB(FILE * img);
int PrintBootSectInfo();
int SetRootDir();
unsigned int FindFirstSector(unsigned int cluster);
struct cluster FindClusterInfo(unsigned int cluster);

unsigned int setclus(struct directory * dir);
void nametofat(char * name);

#endif
BIN +22 Bytes (100%) fatcat
Binary file not shown.
@@ -22,6 +22,7 @@
#define MAX_ADDR_NAME 16
#define DEFAULT_ALLOC 255
#define EOC 0xFFFFFF8 // End Of Cluster
#define ATTR_ALL 0xFF
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
@@ -35,6 +36,8 @@
#define DIR_ERROR 0x7C
#define DIR_EMPTY 0x00

#define DIR_INVALIDS 0x20

/* Structures */
struct address{
int* loc;
@@ -108,13 +111,13 @@ extern int num_open_files;

extern struct address * ADDRS;
extern struct fatcat fatcat;

extern int margc;
extern int run;
extern int exec;
extern int runbg;

/* Boot Globals */

extern unsigned int BPB_BytesPerSec;
extern unsigned char BPB_SecPerClus;
extern unsigned short BPB_RsvdSecCnt;
1 main.c
@@ -68,6 +68,7 @@ unsigned int BS_BootSig = 0;
unsigned int BS_VolID = 0;
unsigned char BS_VolLab[11] = {0};
unsigned char BS_FilSysType[8] = {0};
struct directory OPENFILES[2048] = {0};

/* ALL EXITING TASKS DONE HERE */
int exit_shell(){