#include<stdio.h>
#include<conio.h>
#include<string.h>
struct inode
{
int inodeno;
int rc;
}*in[10];
struct fdnode
{
int fd;
struct inode *next;
}*fd[10],*nfd;
struct file
{
char name[10];
int inodeno;
}*fp[10],*root;
struct tree
{
int inodeno;
char fname[10];
struct tree *left,*right;
};
int winode;
int main()
{
char path[30];
int inode,i,k,j;
char name[][10]={“root”,”etc”,”usr”,”bin”};
char temp[5][10];
struct tree *node[4],*newnode;
for(i=0;i<4;i++)
{
node[i]=(struct tree*)malloc(sizeof(struct tree));
strcpy(node[i]->fname,name[i]);
node[i]->inodeno=rand()%1000;
node[i]->left=NULL;
node[i]->left=NULL;
}
node[0]->left=node[2];
node[0]->right=node[1];
node[1]->left=node[3];
start:
printf(“Enter filename:”);
scanf(“%s”,path);
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<10;i++)
{
if(path[k]==’/’ || path[k]==”)
{
k++;
break;
}
temp[j][i]=path[k];
k++;
}
if(k==strlen(path)+1)
{
temp[j][i]=”;
break;
}
temp[j][i]=”;
continue;
}
root=(struct file*) malloc (sizeof(struct file));
strcpy(root->name,”root”);
root->inodeno=rand()%1000;
winode=root->inodeno;
newnode=(struct tree*)malloc(sizeof(struct tree));
strcpy(newnode->fname,temp[j]);
//newnode->inodeno=rand()%1000;
newnode->left=NULL;
newnode->right=NULL;
for(i=0;i<=j;i++)
{
printf(“%s\n”,temp[i]);
}
if(strcmp(temp[0],node[0]->fname)==0)
{
if(strcmp(temp[1],node[1]->fname)==0)
{
if(j==2)
{
node[1]->right=newnode;
inode=namei(temp[2]);
}
else
{
if(strcmp(temp[2],node[3]->fname)==0)
{
if(j==3)
{
node[3]->right=newnode;
inode=namei(temp[3]);
}
else
{
printf(“Wrong path\n”);
goto start;
}
}
else
{
printf(“Wrong path\n”);
goto start;
}
}
}
else
{
if(strcmp(temp[1],node[2]->fname)==0)
{
if(j==2)
{
node[2]->right=newnode;
inode=namei(temp[2]);
}
else
{
printf(“Wrong path\n”);
goto start;
}
}
else
{
printf(“Wrong path\n”);
goto start;
}
}
}
else
{
printf(“Wrong path\n”);
goto start;
}
if(inode==0)
goto end;
for(i=0;i<10;i++)
{
if(in[i]->inodeno==inode)
{
in[i]->rc++;
nfd=(struct fdnode*) malloc (sizeof(struct fdnode));
nfd->fd=rand()%1000;
nfd->next=in[i];
break;
}
}
printf(“UFD AND INODE TABLE(after dup)\n”);
printf(“File Desc\tInode No\tRC\n”);
for(i=0;i<10;i++)
{
printf(“%d\t\t%d\t\t%d\n”,fd[i]->fd,in[i]->inodeno,in[i]->rc);
}
printf(“%d\t\t%d\t\t%d\n”,nfd->fd,nfd->next->inodeno,nfd->next->rc);
printf(“——————————————————————————–\n”);
end:
getch();
}
int namei(char name[10])
{
char fname[10][10]={“demo”,”all”,”info”,”data”,”sam”,”exam”,”eg”,”test”,”dev”,”etc”};
int i,flag=0;
for(i=0;i<10;i++)
{
fp[i]=(struct file*) malloc (sizeof(struct file));
strcpy(fp[i]->name,fname[i]);
fp[i]->inodeno=rand()%1000;
}
printf(“FILE SYSTEM HIERARCHY\n”);
printf(“Filename\tInode No\n”);
for(i=0;i<10;i++)
{
printf(“%s\t\t%d\n”,fp[i]->name,fp[i]->inodeno);
}
printf(“——————————————————————————–\n”);
for(i=0;i<10;i++)
{
in[i]=(struct inode*) malloc (sizeof(struct inode));
in[i]->inodeno=fp[i]->inodeno;
in[i]->rc=1;
fd[i]=(struct fdnode*) malloc (sizeof(struct fdnode));
fd[i]->fd=rand()%1000;
}
printf(“FILE DATASTRUCTUES..\n”);
printf(“UFD AND INODE TABLE\n”);
printf(“File Desc\tInode No\tRC\n”);
for(i=0;i<10;i++)
{
printf(“%d\t\t%d\t\t%d\n”,fd[i]->fd,in[i]->inodeno,in[i]->rc);
}
printf(“——————————————————————————–\n”);
for(i=0;i<10;i++)
{
if(strcmp(fp[i]->name,name)==0)
{
winode=fp[i]->inodeno;
break;
}
}
flag=iget(winode);
if(flag==1)
return winode;
printf(“Error… File not available..”);
return 0;
}
int iget(int inode)
{
int inodecache[10],i;
for(i=0;i<10;i++)
{
inodecache[i]=fp[i]->inodeno;
}
for(i=0;i<10;i++)
{
if(winode==inodecache[i])
return 1;
}
return 0;
}