Exemplo n.º 1
0
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;
}
Exemplo n.º 3
0
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;
}