📄 dir.c
字号:
#include<stdio.h>
#include<string.h>
#include "filesys.h"
_dir() /* -dir */
{
unsigned short di_mode;
int i,j,k,one;
struct inode *temp_inode;
printf("\nCURRENT DIRECTORY:dir.size=%d\n",dir.size);
for(i=0;i<dir.size;i++)
{
if(dir.direct[i].d_ino!=DIEMPTY)
{
printf("%14s ",dir.direct[i].d_name);
printf("d_ino=%d",dir.direct[i].d_ino);
temp_inode=iget(dir.direct[i].d_ino);
di_mode=temp_inode->di_mode;
if(temp_inode->di_mode & DIFILE)
printf("f");
else
printf("d");
for(j=0;j<9;j++)
{
one=di_mode%2;
di_mode=di_mode/2;
if(one) printf("x");
else printf("-");
}
/*printf("i=%d,d_name=%s,",i,dir.direct[i].d_name);
printf("di_mode=%0x\n",temp_inode->di_mode);*/
if(temp_inode->di_mode & DIFILE)
{
printf("%ld",temp_inode->di_size);
printf(" block chain:");
for(k=0;k<temp_inode->di_size/BLOCKSIZ+1;k++)
printf("%d ",temp_inode->di_addr[k]);
printf("\n");
}
else
printf("<dir>block chain:%d\n",dir.direct[i].d_ino);
iput(temp_inode);
}
}
printf("dir---->out\n");
}
mkdir(char *dirname) /* mkdir */
{
int dirid,dirpos;
struct inode *inode;
struct direct buf[BLOCKSIZ/(DIRSIZ+2)];
unsigned int block;
dirid=namei(dirname);
printf("dirid=%d\n",dirid);
if(dirid != NULL)
{
inode=iget(dirid);
if(inode->di_mode & DIDIR)
printf("\n%s directory already existed!!!\n",dirname);
else
printf("\n%s is a file name,&can't creat a dir the same name\n",dirname);
iput(inode);
return;
}
dirpos=iname(dirname);
inode=ialloc();
/*dirid=filsys.s_inode[filsys.s_pinode-1];*/
dirid=inode->i_ino;
/*printf("\ndirid=%d",dirid);
printf("dirpos=%d\n",dirpos);
printf("dir.size=%d\n",dir.size);*/
dir.direct[dirpos].d_ino=inode->i_ino;
dir.size++;
/*fill the new dir buf */
strcpy(buf[0].d_name,".");
buf[0].d_ino=dirid;
strcpy(buf[1].d_name,"..");
buf[1].d_ino=cur_path_inode->i_ino;
/*strcpy(buf[2].d_name,dirname);
buf[2].d_ino=dirid;*/
buf[2].d_ino=0;
block=balloc();
/*printf("block=%d\n",block);*/
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
fwrite(buf,1,BLOCKSIZ,fd);
inode->di_size=2*(DIRSIZ+2);
inode->di_number=1;
inode->di_mode=user[user_id].u_default_mode|DIDIR;
inode->di_uid=user[user_id].u_uid;
inode->di_gid=user[user_id].u_gid;
inode->di_addr[0]=block;
iput(inode);
printf("mkdir---->out\n");
return ;
}
chdir(char *dirname) /* chdir */
{
unsigned int dirid;
struct inode *inode;
unsigned short block;
int i,j,low=0,high=0;
dirid=namei(dirname);
/*printf("\ndirname=%skkkkk,dirid=%d\n",dirname,dirid); */
if(dirid==NULL)
{
printf("\n%s does not existed\n",dirname);
return;
}
inode=iget(dirid);
if(!access(user_id,inode,user[user_id].u_default_mode))
{
printf("\nhas not access to the directory %s\n",dirname);
iput(inode);
return;
}
/* pack the current directory*/
for(i=0;i<dir.size; i++)
{
for(j=0;j<DIRNUM;j++)
if(dir.direct[j].d_ino==0)
break;
memcpy(&dir.direct[j],&dir.direct[i],DIRSIZ+2);
dir.direct[j].d_ino=0;
}
/*write back the current directory*/
for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+1; i++)
{
bfree(cur_path_inode->di_addr[i]);
}
for(i=0;i<dir.size; i+=BLOCKSIZ/(DIRSIZ+2))
{
block=balloc();
/*printf("i=%d,block=%d\n",i,block);*/
cur_path_inode->di_addr[i]=block;
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
fwrite(&dir.direct[0],1,BLOCKSIZ,fd);
}
cur_path_inode->di_size=dir.size*(DIRSIZ+2);
iput(cur_path_inode);
cur_path_inode=inode;
dir.size=inode->di_size/(DIRSIZ+2);
/*printf("\ndir.size=%d\n",dir.size);*/
/*printf("\ninode->di_addr[0]=%d\n",inode->di_addr[0]);*/
/*read the change dir from disk */
j=0;
for(i=0;i<inode->di_size/BLOCKSIZ+1; i++)
{
/*printf("\ni=%d,inode->di_addr[i]=%d\n",i,inode->di_addr[i]);*/
fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);
fread(&dir.direct[0],1,BLOCKSIZ,fd);
j+=BLOCKSIZ/(DIRSIZ+2);
};
printf("chdir---->out\n");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -