#include
#include
#include
#define MAXSIZE 10
struct inode_table
{
int count;
int check;
char filename[20];
};
typedef struct inode_table* Inode;
struct file_table
{
int check;
int count;
char mode;
Inode ptr;
};
typedef struct file_table* FileDescriptor;
struct user_file_descriptor
{
int check;
FileDescriptor ptr;
};
typedef struct user_file_descriptor* UserFileDescriptor;
char buffer[100],ip[100];
char mode;
int no=0;
UserFileDescriptor userFDTable[MAXSIZE];
FileDescriptor fileTable[MAXSIZE];
Inode inodeTable[MAXSIZE];
void setup_Tables();
void display_Tables();
UserFileDescriptor allocate_UFD(char[],char);
FileDescriptor allocate_FileDescriptor(char[],char);
Inode allocate_inode(char[]);
void close_UFD(UserFileDescriptor);
void close_FD(FileDescriptor);
void close_inode(Inode);
void setup_Tables()
{
int i;
for (i = 0; i < MAXSIZE; i++) {
userFDTable[i] = (UserFileDescriptor) malloc(sizeof (struct user_file_descriptor));
userFDTable[i]->check = 0;
fileTable[i] = (FileDescriptor) malloc(sizeof (struct file_table));
fileTable[i]->check = 0;
fileTable[i]->count = 0;
inodeTable[i] = (Inode) malloc(sizeof (struct inode_table));
inodeTable[i]->check = 0;
inodeTable[i]->count = 0;
}
}
void display_Tables()
{
int i;
printf("\nUser File Descriptor Table\n");
for(i=0;i
printf("\nFile Descriptor Table\n");
for(i=0;i
printf("\nFile Descriptor Table\n");
for(i=0;i
}
UserFileDescriptor allocate_UFD(char filename[],char mode)
{
int current;
FileDescriptor temp;
for(current=3;current
if(userFDTable[current]->check==0)
break;
}
if(current==MAXSIZE)
{
printf("UFD Table out of space");
return NULL;
}
temp = allocate_FileDescriptor(filename,mode);
if(temp==NULL)
return NULL;
userFDTable[current]->check = 1;
userFDTable[current]->ptr = temp;
return userFDTable[current];
}
FileDescriptor allocate_FileDescriptor(char filename[],char mode)
{
int current;
Inode temp;
for(current=0;current
if(fileTable[current]->check==0)
break;
}
if(current==MAXSIZE)
{
printf("File Descriptor Table out of space");
return NULL;
}
temp = allocate_inode(filename);
if(temp==NULL)
return NULL;
fileTable[current]->check = 1;
fileTable[current]->ptr = temp;
fileTable[current]->count=1;
fileTable[current]->mode = mode;
return fileTable[current];
}
Inode allocate_inode(char fileName[])
{
int current;
for(current=0;current
if(inodeTable[current]->check==1)
{
if(strcmp(inodeTable[current]->filename,fileName)==0)
{
inodeTable[current]->count++;
return inodeTable[current];
}
}
}
for(current=0;current
if(inodeTable[current]->check==0)
break;
}
if(current==MAXSIZE)
{
printf("Inode Table out of space");
return NULL;
}
inodeTable[current]->check=1;
inodeTable[current]->count++;
strcpy(inodeTable[current]->filename,fileName);
return inodeTable[current];
}
void close_UFD(UserFileDescriptor ufd)
{
close_FD(ufd->ptr);
ufd->check=0;
}
void close_FD(FileDescriptor fd)
{
close_inode(fd->ptr);
fd->check=0;
fd->count--;
}
void close_inode(Inode iNode)
{
iNode->count--;
if(iNode->count==0)
iNode->check=0;
}
int main(int argc, char** argv) {
setup_Tables();
UserFileDescriptor ufd =allocate_UFD("aaa",'R');
display_Tables();
close_UFD(ufd);
display_Tables();
return 0;
}
No comments:
Post a Comment