/********************************************************** * fat32.c //added by mingxuan 2019-5-17 ***********************************************************/ #include "fat32.h" #include "type.h" #include "const.h" #include "protect.h" #include "string.h" #include "proc.h" #include "tty.h" #include "console.h" #include "global.h" #include "proto.h" #include "fs_const.h" #include "hd.h" #include "fs.h" #include "fs_misc.h" #include "string.h" #include "stdio.h" extern DWORD FAT_END; extern DWORD TotalSectors; extern WORD Bytes_Per_Sector; extern BYTE Sectors_Per_Cluster; extern WORD Reserved_Sector; extern DWORD Sectors_Per_FAT; extern UINT Position_Of_RootDir; extern UINT Position_Of_FAT1; extern UINT Position_Of_FAT2; extern struct file_desc f_desc_table[NR_FILE_DESC]; CHAR VDiskPath[256]={0}; CHAR cur_path[256]={0}; u8* buf; STATE state; File f_desc_table_fat[NR_FILE_DESC]; static void load_disk(); static void mkfs_fat(); STATE DeleteDir(const char *dirname) { CHAR fullpath[256]={0}; CHAR parent[256]={0}; CHAR name[256]={0}; DWORD parentCluster=0,startCluster=0; UINT tag=0; STATE state; ToFullPath((PCHAR)dirname,fullpath); GetParentFromPath(fullpath,parent); GetNameFromPath(fullpath,name); state=IsFile(fullpath,&tag); if(state!=OK) { return state; } if(tag==F) { return WRONGPATH; } state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state; } state=ClearRecord(parentCluster,name,&startCluster); if(state!=OK) { return state; } DeleteAllRecord(startCluster); return OK; } STATE CreateDir(const char *dirname) { Record record; CHAR fullname[256]={0}; CHAR name[256]={0}; CHAR parent[256]={0}; DWORD parentCluster=0,startCluster=0,sectorIndex=0,off_in_sector=0; STATE state; ToFullPath((PCHAR)dirname,fullname); GetNameFromPath(fullname,name); GetParentFromPath(fullname,parent); state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state;//找不到路径 } state=FindSpaceInDir(parentCluster,name,§orIndex,&off_in_sector); if(state!=OK) { return state;//虚拟磁盘空间不足 } state=FindClusterForDir(&startCluster); if(state!=OK) { return state;//虚拟磁盘空间不足 } CreateRecord(name,0x10,startCluster,0,&record); WriteRecord(record,sectorIndex,off_in_sector); WriteFAT(1,&startCluster);//写FAT CreateRecord(".",0x10,startCluster,0,&record);//准备目录项.的数据 sectorIndex=Reserved_Sector+2*Sectors_Per_FAT+(startCluster-2)*Sectors_Per_Cluster; WriteRecord(record,sectorIndex,0);//写.目录项 CreateRecord("..",0x10,parentCluster,0,&record);//准备目录项..的数据 WriteRecord(record,sectorIndex,sizeof(Record));//写..目录项 //fflush(fp); return OK; } STATE OpenDir(const char* dirname) { DWORD parentCluster=0; CHAR fullpath[256]={0},parent[256]={0},name[256]={0}; Record record; STATE state; if(strcmp(dirname,".")==0) { return OK; }else if(strcmp(dirname,"..")==0||strcmp(dirname,"\\")==0){ ChangeCurrentPath((PCHAR)dirname); return OK; }else{ if(IsFullPath((PCHAR)dirname)) { strcpy(fullpath,(PCHAR)dirname); GetParentFromPath(fullpath,parent); if(strlen(parent)==0)//说明dirname是根目录 { memset(cur_path,0,sizeof(cur_path)); strcpy(cur_path,fullpath); cur_path[strlen(cur_path)]='\\'; return OK; } GetNameFromPath(fullpath,name); }else{ MakeFullPath(cur_path,(PCHAR)dirname,fullpath); strcpy(parent,cur_path); strcpy(name,(PCHAR)dirname); } state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state; } state=ReadRecord(parentCluster,name,&record,NULL,NULL); if(state!=OK) { return state; } if(record.proByte==(BYTE)0x10) { strcpy(cur_path,fullpath); return OK; }else{ return WRONGPATH; } } return OK; } STATE ReadFile(int fd,void *buf, int length) { int size = 0; PBYTE sector=NULL; DWORD curSectorIndex=0,nextSectorIndex=0,off_in_sector=0,free_in_sector=0,readsize=0; UINT isLastSector=0,tag=0; PFile pfile = p_proc_current->task.filp[fd] ->fd_node.fd_file; if(pfile->flag!=R && pfile->flag!=RW && pfile->flag!=(RW|C)) //modified by mingxuan 2019-5-18 { return ACCESSDENIED; } kprintf("read:"); if(pfile->off>=pfile->size) { return 0; } sector = (PBYTE)K_PHY2LIN(sys_kmalloc(Bytes_Per_Sector*sizeof(BYTE))); if(sector==NULL) { return SYSERROR; } GetFileOffset(pfile,&curSectorIndex,&off_in_sector,&isLastSector); do { if(isLastSector)//当前的扇区是该文件的最后一个扇区 { if(pfile->size%Bytes_Per_Sector==0) { free_in_sector=Bytes_Per_Sector-off_in_sector; }else{ free_in_sector=pfile->size%Bytes_Per_Sector-off_in_sector;//最后一个扇区的剩余量 } tag=1;//置跳出标志 }else{ free_in_sector=Bytes_Per_Sector-off_in_sector;//本扇区的剩余量 } if(free_in_sectoroff+=readsize; if(tag==1)//最后一个扇区或缓冲区装满了 { break; }else{//缓冲区还没装满并且还没到最后一个扇区 GetNextSector(pfile,curSectorIndex,&nextSectorIndex,&isLastSector); curSectorIndex=nextSectorIndex; off_in_sector=0; } }while(1); sys_free(sector); //pfile->off = 0; return size; } STATE WriteFile(int fd, const void *buf, int length) { PBYTE sector=NULL; DWORD clusterNum=0; DWORD curSectorIndex=0,nextSectorIndex=0,off_in_sector=0,free_in_sector=0,off_in_buf=0; UINT isLastSector=0; STATE state; PFile pfile = p_proc_current->task.filp[fd] ->fd_node.fd_file; //PFile pfile = &f_desc_table_fat[0]; //if(pfile->flag!=W) //deleted by mingxuan 2019-5-18 if(pfile->flag!=W && pfile->flag!=RW && pfile->flag!=(RW|C) ) //modified by mingxuan 2019-5-18 { return ACCESSDENIED; } sector = (PBYTE)K_PHY2LIN(sys_kmalloc(Bytes_Per_Sector*sizeof(BYTE))); if(sector==NULL) { return SYSERROR; } if(pfile->start==0)//此文件是个空文件原来没有分配簇 { state=AllotClustersForEmptyFile(pfile,length);//空间不足无法分配 if(state!=OK) { sys_free(sector); return state;//虚拟磁盘空间不足 } }else{ if(NeedMoreCluster(pfile,length,&clusterNum)) { state=AddCluster(pfile->start,clusterNum);//空间不足 if(state!=OK) { sys_free(sector); return state;//虚拟磁盘空间不足 } } } GetFileOffset(pfile,&curSectorIndex,&off_in_sector,&isLastSector); free_in_sector=Bytes_Per_Sector-off_in_sector; while(free_in_sectoroff+=free_in_sector; GetNextSector(pfile,curSectorIndex,&nextSectorIndex,&isLastSector); curSectorIndex=nextSectorIndex; free_in_sector=Bytes_Per_Sector; off_in_sector=0; } ReadSector(sector,curSectorIndex); memcpy(sector+off_in_sector,(void *)buf+off_in_buf,length-off_in_buf); WriteSector(sector,curSectorIndex); pfile->off+=length-off_in_buf; sys_free(sector); //fflush(fp); return OK; } STATE CloseFile(int fd) { PFile pfile; pfile = p_proc_current->task.filp[fd] ->fd_node.fd_file; DWORD curSectorIndex=0,curClusterIndex=0,nextClusterIndex=0,parentCluster=0; UINT isLastSector=0; Record record; DWORD sectorIndex=0,off_in_sector=0; //p_proc_current->task.filp_fat[fd] = 0; f_desc_table_fat[fd].flag = 0; p_proc_current->task.filp[fd]->flag = 0; p_proc_current->task.filp[fd] = 0; if(pfile->flag==R) { return OK; }else{ if(pfile->offsize) { GetFileOffset(pfile,&curSectorIndex,NULL,&isLastSector); if(isLastSector==0) { curSectorIndex=(curClusterIndex-Reserved_Sector-2*Sectors_Per_FAT)/Sectors_Per_Cluster+2; GetNextCluster(curClusterIndex,&nextClusterIndex); if(nextClusterIndex!=FAT_END)//说明当前簇不是此文件的最后一簇 { WriteFAT(1,&curClusterIndex);//把当前簇设置为此文件的最后一簇 ClearFATs(nextClusterIndex);//清除此文件的多余簇 } } } PathToCluster(pfile->parent,&parentCluster); ReadRecord(parentCluster,pfile->name,&record,§orIndex,&off_in_sector); record.highClusterNum=(WORD)(pfile->start>>16); record.lowClusterNum=(WORD)(pfile->start&0x0000FFFF); record.filelength=pfile->off; WriteRecord(record,sectorIndex,off_in_sector); } return OK; } STATE OpenFile(const char *filename,int mode) { CHAR fullpath[256]={0}; CHAR parent[256]={0}; CHAR name[256]={0}; Record record; DWORD parentCluster; STATE state; DWORD sectorIndex=0,off_in_sector=0; //added by mingxuan 2019-5-19 ToFullPath((PCHAR)filename,fullpath); GetParentFromPath(fullpath,parent); GetNameFromPath(fullpath,name); state=PathToCluster(parent,&parentCluster); kprintf("\nstate="); kprintf("%d", state); if(state!=OK) { return -1; } //added by mingxuan 2019-5-19 state=FindSpaceInDir(parentCluster,name,§orIndex,&off_in_sector); //检测文件名是否存在 if(mode & O_CREAT) //如果用户使用了O_CREAT { if(state == NAMEEXIST) //文件存在,使用O_CREAT是多余的,继续执行OpenFile即可 { kprintf("file exists, O_CREAT is no use!"); } else //文件不存在,需要使用O_CREAT,先创建文件,再执行OpenFile { CreateRecord(name,0x20,0,0,&record); WriteRecord(record,sectorIndex,off_in_sector);//写目录项 } } else //用户没有使用O_CREAT { if(state != NAMEEXIST) //文件不存在,需要使用O_CREAT,用户没有使用,则报错并返回-1,表示路径有误 { kprintf("no file, use O_CREAT!"); return -1; } else{} //文件存在,使用O_CREAT是多余的,继续执行OpenFile即可 } //~mingxuan 2019-5-19 state=ReadRecord(parentCluster,name,&record,NULL,NULL); kprintf("state="); kprintf("%d", state); if(state!=OK) { kprintf("ReadRecord Fail!"); return -1; } int i; int fd = -1; for (i = 3; i < NR_FILES; i++) { if (p_proc_current->task.filp[i] == 0) { fd = i; break; } } if ((fd < 0) || (fd >= NR_FILES)) { // panic("filp[] is full (PID:%d)", proc2pid(p_proc_current)); kprintf("filp[] is full (PID:"); kprintf("%d", proc2pid(p_proc_current)); kprintf(")\n"); return -1; } //找一个未用的文件描述符 for (i = 0; i < NR_FILE_DESC; i++) if ((f_desc_table[i].flag == 0)) break; if (i >= NR_FILE_DESC) { kprintf("f_desc_table[] is full (PID:"); kprintf("%d", proc2pid(p_proc_current)); kprintf(")\n"); return -1; } p_proc_current->task.filp[fd] = &f_desc_table[i]; f_desc_table[i].flag = 1; //找一个未用的FILE for (i = 0; i < NR_FILE_DESC; i++) if (f_desc_table_fat[i].flag == 0) break; if (i >= NR_FILE_DESC) { kprintf("f_desc_table[] is full (PID:"); kprintf("%d", proc2pid(p_proc_current)); kprintf(")\n"); } //以下是给File结构体赋值 memset(f_desc_table_fat[i].parent,0,sizeof(f_desc_table_fat[i].parent));//初始化parent字段 memset(f_desc_table_fat[i].name,0,sizeof(f_desc_table_fat[i].name));//初始化name字段 strcpy(f_desc_table_fat[i].parent,parent); strcpy(f_desc_table_fat[i].name,name); f_desc_table_fat[i].start=(record.highClusterNum<<16)+record.lowClusterNum; f_desc_table_fat[i].off=0; f_desc_table_fat[i].size=record.filelength; f_desc_table_fat[i].flag=mode; // kprintf("flag:"); // deint(f_desc_table_fat[i].flag); // kprintf("index:"); // deint(i); p_proc_current->task.filp[fd] ->fd_node.fd_file = &f_desc_table_fat[i]; return fd; } STATE CreateFile(const char *filename) { Record record; CHAR fullpath[256]={0}; CHAR parent[256]={0}; CHAR name[256]={0}; DWORD parentCluster=0,sectorIndex=0,off_in_sector=0; STATE state; ToFullPath((PCHAR)filename,fullpath); GetParentFromPath(fullpath,parent); GetNameFromPath((PCHAR)filename,name); state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state;//找不到路径 } state=FindSpaceInDir(parentCluster,name,§orIndex,&off_in_sector); if(state != OK) { return state; } CreateRecord(name,0x20,0,0,&record); WriteRecord(record,sectorIndex,off_in_sector);//写目录项 return OK; } STATE DeleteFile(const char *filename) { CHAR fullpath[256]={0}; CHAR parent[256]={0}; CHAR name[256]={0}; DWORD parentCluster=0; DWORD startCluster=0; UINT tag=0; STATE state; ToFullPath((PCHAR)filename,fullpath); GetParentFromPath(fullpath,parent); GetNameFromPath(fullpath,name); state=IsFile(fullpath,&tag); if(state!=OK) { return state; } if(tag==D) { return WRONGPATH; } state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state; } state=ClearRecord(parentCluster,name,&startCluster); if(state!=OK) { return state; } if(startCluster!=0) { ClearFATs(startCluster); } return OK; } STATE IsFile(PCHAR path,PUINT tag) { CHAR fullpath[256]={0}; CHAR parent[256]={0}; CHAR name[256]={0}; DWORD parentCluster=0; Record record; STATE state; ToFullPath(path,fullpath); GetParentFromPath(fullpath,parent); GetNameFromPath(fullpath,name); state=PathToCluster(parent,&parentCluster); if(state!=OK) { return state;//找不到路径 } state=ReadRecord(parentCluster,name,&record,NULL,NULL); if(state!=OK) { return state;//找不到路径 } if(record.proByte==0x10) { *tag=D; }else{ *tag=F; } return OK; } void init_fs_fat() { kprintf("Initializing fat32 file system... \n"); buf = (u8*)K_PHY2LIN(sys_kmalloc(FSBUF_SIZE)); int fat32_dev = get_fs_dev(PRIMARY_MASTER, FAT32_TYPE); //added by mingxuan 2020-10-27 //load_disk(FAT_DEV); // deleted by mingxuan 2020-10-27 load_disk(fat32_dev); // modified by mingxuan 2020-10-27 if (TotalSectors == 0) { mkfs_fat(); //load_disk(FAT_DEV); //deleted by mingxuan 2020-10-27 load_disk(fat32_dev); //modified by mingxuan 2020-10-27 } int i; for (i = 0; i < NR_FILE_DESC; ++i) { f_desc_table_fat[i].flag = 0; } } static void load_disk(int dev) { MESSAGE driver_msg; PCHAR cur="V:\\"; driver_msg.type = DEV_READ; driver_msg.DEVICE = MINOR(dev); driver_msg.POSITION = SECTOR_SIZE * 1; driver_msg.BUF = buf; driver_msg.CNT = SECTOR_SIZE; driver_msg.PROC_NR = proc2pid(p_proc_current);///TASK_A hd_rdwt(&driver_msg); memcpy(&Bytes_Per_Sector,buf+11,2); memcpy(&Sectors_Per_Cluster,buf+13,1); memcpy(&Reserved_Sector,buf+14,2); memcpy(&TotalSectors,buf+32,4); memcpy(&Sectors_Per_FAT,buf+36,4); Position_Of_RootDir=(Reserved_Sector+Sectors_Per_FAT*2)*Bytes_Per_Sector; Position_Of_FAT1=Reserved_Sector*Bytes_Per_Sector; Position_Of_FAT2=(Reserved_Sector+Sectors_Per_FAT)*Bytes_Per_Sector; strcpy(cur_path,cur); } static void mkfs_fat() { MESSAGE driver_msg; int fat32_dev = get_fs_dev(PRIMARY_MASTER, FAT32_TYPE); //added by mingxuan 2020-10-27 /* get the geometry of ROOTDEV */ struct part_info geo; driver_msg.type = DEV_IOCTL; //driver_msg.DEVICE = MINOR(FAT_DEV); //deleted by mingxuan 2020-10-27 driver_msg.DEVICE = MINOR(fat32_dev); //modified by mingxuan 2020-10-27 driver_msg.REQUEST = DIOCTL_GET_GEO; driver_msg.BUF = &geo; driver_msg.PROC_NR = proc2pid(p_proc_current); hd_ioctl(&driver_msg); kprintf("dev size: "); kprintf("%d", geo.size); kprintf(" sectors\n"); TotalSectors = geo.size; DWORD jump=0x009058eb;//跳转指令:占3个字节 DWORD oem[2]={0x4f44534d,0x302e3553};//厂商标志,OS版本号:占8个字节 //以下是BPB的内容 WORD bytes_per_sector=512;//每扇区字节数:占2个字节 WORD sectors_per_cluster=8;//每簇扇区数:占1个字节 WORD reserved_sector=32;//保留扇区数:占2个字节 WORD number_of_FAT=2;//FAT数:占1个字节 BYTE mediaDescriptor=0xF8; DWORD sectors_per_FAT=(TotalSectors*512-8192)/525312+1;//每FAT所占扇区数,用此公式可以算出来:占4个字节 DWORD root_cluster_number=2;//根目录簇号:占4个字节 //以下是扩展BPB内容 CHAR volumeLabel[11]={'N','O',' ','N','A','M','E',' ',' ',' ',' '};//卷标:占11个字节 CHAR systemID[8]={'F','A','T','3','2',' ',' ',' '};//系统ID,FAT32系统中一般取为“FAT32”:占8个字节 //以下是有效结束标志 DWORD end=0xaa55; DWORD media_descriptor[2]={0x0ffffff8,0xffffffff};//FAT介质描述符 DWORD cluster_tag=0x0fffffff;//文件簇的结束单元标记 Record vLabel;//卷标的记录项。 // DWORD clearSize=sectors_per_cluster*bytes_per_sector-sizeof(Record); char volumelabel[3] = "MZY"; memcpy(buf,&jump,3);//写入跳转指令:占3个字节(其实没有用) memcpy(buf+3,oem,8);//厂商标志,OS版本号:占8个字节 //以下是写 BPB memcpy(buf+11,&bytes_per_sector,2);//每扇区字节数:占2个字节 memcpy(buf+13,§ors_per_cluster,1);//写入每簇扇区数:占1个字节 memcpy(buf+14,&reserved_sector,2);//写入保留扇区数:占2个字节 memcpy(buf+16,&number_of_FAT,1);//写入FAT数:占1个字节 memcpy(buf+21,&mediaDescriptor,1);//写入媒体描述符 memcpy(buf+32,&TotalSectors,4);//写入总扇区数 memcpy(buf+36,§ors_per_FAT,4);//写入每FAT所占扇区数:占4个字节 memcpy(buf+44,&root_cluster_number,4);//写入根目录簇号:占4个字节 //以下是写 扩展BPB memcpy(buf+71,volumeLabel,11);//写卷标:占11个字节 memcpy(buf+82,systemID,8);//系统ID,FAT32系统中一般取为“FAT32”:占8个字节 //由于引导代码对于本虚拟系统没有用,故省略 memcpy(buf+510,&end,2); //WR_SECT_FAT(buf, 1); //deleted by mingxuan 2020-10-27 WR_SECT_FAT(fat32_dev, buf, 1); //modified by mingxuan 2020-10-27 //初始化FAT memset(buf,0,SECTOR_SIZE);//写介质描述单元 memcpy(buf,media_descriptor,8); memcpy(buf+8,&cluster_tag,4);//写根目录的簇号 //WR_SECT_FAT(buf, reserved_sector); // deleted by mingxuan 2020-10-27 WR_SECT_FAT(fat32_dev, buf, reserved_sector); // modified by mingxuan 2020-10-27 //初始化根目录 CreateRecord(volumelabel,0x08,0,0,&vLabel);//准备卷标的目录项的数据 memset(buf,0,SECTOR_SIZE);//将准备好的记录项数据写入虚拟硬盘 memcpy(buf,&vLabel,sizeof(Record)); //WR_SECT_FAT(buf, reserved_sector+2*sectors_per_FAT); // deleted by mingxuan 2020-10-27 WR_SECT_FAT(fat32_dev, buf, reserved_sector+2*sectors_per_FAT); // modified by mingxuan 2020-10-27 } int rw_sector_fat(int io_type, int dev, u64 pos, int bytes, int proc_nr, void* buf) { MESSAGE driver_msg; driver_msg.type = io_type; driver_msg.DEVICE = MINOR(dev); driver_msg.POSITION = pos; driver_msg.CNT = bytes; /// hu is: 512 driver_msg.PROC_NR = proc_nr; driver_msg.BUF = buf; hd_rdwt(&driver_msg); return 0; } int rw_sector_sched_fat(int io_type, int dev, int pos, int bytes, int proc_nr, void* buf) { MESSAGE driver_msg; driver_msg.type = io_type; driver_msg.DEVICE = MINOR(dev); driver_msg.POSITION = pos; driver_msg.CNT = bytes; /// hu is: 512 driver_msg.PROC_NR = proc_nr; driver_msg.BUF = buf; hd_rdwt_sched(&driver_msg); return 0; } int sys_CreateFile(void *uesp) { state=CreateFile((PCHAR)(void *)get_arg(uesp, 1)); if(state==OK) { kprintf(" create file success"); } else { DisErrorInfo(state); } return state; } int sys_DeleteFile(void *uesp) { state=DeleteFile((PCHAR)(void *)get_arg(uesp, 1)); if(state==OK) { kprintf(" delete file success"); } else { DisErrorInfo(state); } return state; } int sys_OpenFile(void *uesp) { /* // state=OpenFile(get_arg(uesp, 1), // get_arg(uesp, 2)); // if(state==OK) // { // kprintf("open file success"); // } // else { // DisErrorInfo(state); // } // return state; state=OpenFile(get_arg(uesp, 1), get_arg(uesp, 2)); kprintf(" open file success"); return state; */ return 0; } int sys_CloseFile(void *uesp) { state=CloseFile(get_arg(uesp, 1)); if(state==OK) { kprintf(" close file success"); } else { DisErrorInfo(state); } return state; } int sys_WriteFile(void *uesp) { state=WriteFile(get_arg(uesp, 1), (BYTE *)(void *)get_arg(uesp, 2), get_arg(uesp, 3)); if(state==OK) { kprintf(" write file success"); } else { DisErrorInfo(state); } return state; } int sys_ReadFile(void *uesp) { // state=ReadFile(get_arg(uesp, 1), // get_arg(uesp, 2), // get_arg(uesp, 3), // get_arg(uesp, 4)); // if(state==OK) // { // //debug("read file success"); // debug(" read file success"); // } // else { // DisErrorInfo(state); // } // return state; return 0; } int sys_OpenDir(void *uesp) { // state=OpenDir(get_arg(uesp, 1)); // if(state==OK) // { // //debug("open dir success"); // debug(" open dir success"); // } // else { // DisErrorInfo(state); // } // return state; return 0; } int sys_CreateDir(void *uesp) { // state=CreateDir(get_arg(uesp, 1)); // if(state==OK) // { // //debug("create dir success"); // debug(" create dir success"); // } // else { // DisErrorInfo(state); // } // return state; return 0; } int sys_DeleteDir(void *uesp) { // state=DeleteDir(get_arg(uesp, 1)); // if(state==OK) // { // debug("delete dir success"); // debug(" delete dir success"); // } // else { // DisErrorInfo(state); // } // return state; return 0; } int sys_ListDir(void *uesp) { // DArray *array=NULL; // char *s = get_arg(uesp, 1); // CHAR temp[256]={0}; // UINT tag=0; // array = InitDArray(10, 10); // memset(temp, 0, sizeof(temp)); // if (strlen(s) != 0) // { // strcpy(temp,s); // if(IsFile(temp,&tag)) // { // if(tag==1) // { // printf("不是目录的路径\n\n"); // } // } // } // else { // GetCurrentPath(temp); // } // state=ListAll(temp, array); // if(state==OK) // { // DirCheckup(array); // }else { // DisErrorInfo(state); // kprintf("\n"); // } // DestroyDArray(array); return 0; } void DisErrorInfo(STATE state) { if(state==SYSERROR) { kprintf(" system error\n"); } else if(state==VDISKERROR) { kprintf(" disk error\n"); } else if(state==INSUFFICIENTSPACE) { kprintf(" no much space\n"); } else if(state==WRONGPATH) { kprintf(" path error\n"); } else if(state==NAMEEXIST) { kprintf(" name exists\n"); } else if(state==ACCESSDENIED) { kprintf(" deny access\n"); } else { kprintf(" unknown error\n"); } }