int main(int argc,char *argv[]){ int ch; int ret; while((ch=getopt(argc,argv,"fhrvwx"))!= EOF){ switch(ch){ case 'f': ret = myaccess(argv[1],F_OK); if(0==ret) { printf("file exist\n"); } else { printf("file not exist\n"); } break; case 'r': ret = myaccess(argv[1],R_OK); if(0==ret) { printf("file readed\n"); } else { printf("file not readed\n"); } break; case 'w': ret = myaccess(argv[1],W_OK); if(0==ret) { printf("file write\n"); } else { printf("file not write\n"); } break; case 'x': ret = myaccess(argv[1],X_OK); if(0==ret) { printf("file execute\n"); } else { printf("file not execute\n"); } break; case 'h': usage(argv[0]); break; case 'v': printf("%s VERSION:%s",argv[0],VERSION); exit(0); break; default: usage(argv[0]); break; } } if(argc <= 2){ usage(argv[0]); } return 0; }
int Enterdir(char* namestr)//进入目录 { int i; i=Fd_dirfile(namestr); if(i!=-1) { read_inode(i); if((inodetemp->di_mode&DIMODE_DIR)!=DIMODE_DIR) { printf("%s 不是目录!\n",namestr); return -1; } if(!myaccess()) { printf("您没有权限!\n"); return -1; } changeinode(); } else { printf("未找到该文件!请输入正确的文件或目录名\n"); return -1; } read_dir_data(cur_inode->di_block[0]); return 1; }
char* findApp( const char* fn ) /* purpose: check the executable filename and correct it if necessary * paramtr: fn (IN): current knowledge of filename * returns: newly allocated fqpn of path to exectuble, or NULL if not found */ { char* s, *path, *t = NULL; /* sanity check */ if ( fn == NULL || *fn == '\0' ) return NULL; /* don't touch absolute paths */ if ( *fn == '/' ) { if ( myaccess(fn) == 0 ) return strdup(fn); else return NULL; } /* try from CWD */ if ( myaccess(fn) == 0 ) return strdup(fn); /* continue only if there is a PATH to check */ if ( (s=getenv("PATH")) == NULL ) return NULL; else path = strdup(s); /* tokenize to compare */ for ( s=strtok(path,":"); s; s=strtok(NULL,":") ) { size_t len = strlen(fn) + strlen(s) + 2; t = (char*) malloc(len); strncpy( t, s, len ); strncat( t, "/", len ); strncat( t, fn, len ); if ( myaccess(t) == 0 ) break; else { free((void*) t); t = NULL; } } /* some or no matches found */ free((void*) path); return t; }
char* ReadFile(char strname[14]) { int fi; fi=Fd_dirfile(strname);//查找该文件夹下是否有文件 if(fi!=-1) { // printf("已找到 %s 文件\n",strname); } else { printf("找不到到 %s 文件\n",strname); return NULL; } inodetemp=read_inode(fi); if(!myaccess()) { printf("您没有权限!\n"); return NULL; } if(inodetemp==NULL) { return NULL; } if((inodetemp->di_mode&DIMODE_FILE)!=DIMODE_FILE) { printf("%s不是一个文件!\n",strname); return NULL; } char *buf; buf = (char *)malloc(BLOCKSIZ*(inodetemp->di_size/BLOCKSIZ+1)); fseek(fd, DATASTART+BLOCKSIZ*inodetemp->di_block[0], SEEK_SET); fread (buf, BLOCKSIZ*(inodetemp->di_size/BLOCKSIZ+1),1,fd); return buf; }
int mywrite(char strname[])//编辑文件 { int fi,i,k; char *buf; char *buf1; fi=Fd_dirfile(strname);//查找该文件夹下是否有文件 if(fi==-1) { printf("该文件夹下没有 %s 文件或文件夹\n",strname); return 0; } inodetemp=read_inode(fi); if(!myaccess()) { printf("您没有权限!\n"); return NULL; } buf=(char *)malloc((inodetemp->di_size/BLOCKSIZ+1)*BLOCKSIZ); buf1=(char *)malloc(BLOCKSIZ); buf=ReadFile(strname); if(buf==NULL) { printf("文件读取失败!\n"); return 0; } char c; printf("是否真的要写覆盖 %s ?<y/n>",strname); fgetc(stdin); scanf("%c",&c); if(c!='y') { return 0; } i =0; k=0; printf("原来文件的内容%s\n",buf); printf("输入新文件内容,以\"###\"结束:\n"); fgetc(stdin); while(k!=3) { buf1[i] = getchar(); if(buf1[i] == '#') { k++; if(k == 3) break; } else k=0; i++; if(i/BLOCKSIZ > 0) { buf1 = (char *)realloc(buf1,BLOCKSIZ*(i/BLOCKSIZ+1)); } } buf1[i-2]='\0'; inodetemp->di_size=strlen(buf1); fseek(fd,DINODESTART+BLOCKSIZ*inodetemp->di_ino, SEEK_SET);//将新建的文件写入硬盘inode区 fwrite(inodetemp,BLOCKSIZ, 1, fd); fseek(fd, DATASTART+BLOCKSIZ*inodetemp->di_block[0], SEEK_SET); fwrite (buf1, BLOCKSIZ*(inodetemp->di_size/BLOCKSIZ+1),1,fd); return 1; }
int deletefd(char strname[20]) { int fi,i; fi=Fd_dirfile(strname);//查找该文件夹下是否有文件 if(fi==-1) { printf("该文件夹下没有 %s 文件或文件夹\n",strname); return 0; } inodetemp=read_inode(fi); if((inodetemp->di_mode&DIMODE_SYSTEM)==DIMODE_SYSTEM) { printf("%s是系统文件,无法删除\n",strname); return 0; }else if((inodetemp->di_mode&DIMODE_FILE)==DIMODE_FILE)//如果是文件 则直接删除 { } else if((inodetemp->di_mode&DIMODE_DIR)==DIMODE_DIR) { if(inodetemp->di_number>2) { printf("该目录下还有文件,不能删除此文件夹!\n"); return 0; } } if(!myaccess()) { printf("您没有权限!\n"); return -1; } char c; printf("是否真的要删除 %s ?<y/n>",strname); fgetc(stdin); scanf("%c",&c); if(c!='y') { return 0; } i=0; while(strcmp(dir_buf[i].d_name,strname)!=0) { i++; } for(;i<cur_inode->di_number;i++) { strcpy(dir_buf[i].d_name,dir_buf[i+1].d_name); dir_buf[i].d_ino=dir_buf[i+1].d_ino; } cur_inode->di_number--; fseek(fd,DATASTART+BLOCKSIZ*cur_inode->di_block[0], SEEK_SET);//更新当前目录block fwrite(dir_buf,BLOCKSIZ, 1, fd); fseek(fd,DINODESTART+BLOCKSIZ*cur_inode->di_ino, SEEK_SET);//更新当前目录inode fwrite(cur_inode,BLOCKSIZ, 1, fd); for(i=0;i<(int)(inodetemp->di_size/BLOCKSIZ+1);i++) { bk_bitmap[inodetemp->di_block[i]]=0; } di_bitmap[inodetemp->di_ino]=0; filsys.s_free_blocks_count++; filsys.s_free_blocks_group[inodetemp->di_block[0]/GROUPNUM]++; filsys.s_free_inodes_count++; fseek(fd, BLOCKSIZ, SEEK_SET);//修改超级块 free block计数 free inode计数 和每组free block 计数 fwrite (&filsys,BLOCKSIZ, 1,fd); fseek(fd, BLOCKSIZ*2, SEEK_SET);//在硬盘修改inode位图 fwrite (di_bitmap,BLOCKSIZ, 1,fd); fseek(fd, BLOCKSIZ*3, SEEK_SET);//在硬盘修改block位图 fwrite (bk_bitmap,BLOCKSIZ, 1,fd); return 1; }