Wednesday, March 5, 2014

UNIX FIle system data structure

The following program will be used to understand data structure used in UNIX file system.

#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("%p\t %d\n",fileTable[i]->ptr,fileTable[i]->check);
    printf("\nFile Descriptor Table\n");
    for(i=0;i        printf("%p\t %d \t%d \t%c\n",fileTable[i]->ptr,fileTable[i]->check,fileTable[i]->count,fileTable[i]->mode);
    printf("\nFile Descriptor Table\n");
    for(i=0;i        printf("%s\t %d \t%d\n",inodeTable[i]->filename,inodeTable[i]->check,inodeTable[i]->count);
   
}

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;
}