📄 ush.c
字号:
}}/*** 功能: 根据文件当前模式值增加或减少文件权限** 系统调用:stat(),chmod()** 作者: 卢佳 20040094*/void change_file_mode(){ int k; struct stat stat_buf; const int XPERM=0100; for(k=1;k<token_num;k++){ if(stat(arg_list[k],&stat_buf)==-1){ fprintf(stderr,"cannot change!\n"); } stat_buf.st_mode|=XPERM; if(chmod(arg_list[k],stat_buf.st_mode)==-1){ fprintf(stderr,"cannot change!\n"); } exit(0); }} /*** 功能:简易pwd,显示当前工作目录** 系统调用:getcwd();*/void pwd_op(){ char dirname[200]; if(getcwd(dirname,200)==NULL){ fprintf(stderr,"getcwd error\n"); } else{ printf("%s \n",dirname); }}/* ************************************ list()功能模块 作者: 卢佳 *************************************************//*** 功能:文件列表命令的低级版本,用于列表文件或目录** 系统调用:stat()*/void ls_op(){ struct stat stat_buf; char descrip[10]; int j; if(stat(arg_list[1],&stat_buf) == -1 ){ fprintf(stderr,"cannot stat!\n"); exit(2); } for(j=0;j<9;j++){ if(stat_buf.st_mode & octarray[j]){ descrip[j]=perms[j]; } else{ descrip[j]='-'; } } descrip[9]='\0'; printf("\nFile %s:\n",arg_list[1]); printf("Size %ld bytes \n",stat_buf.st_size); printf("User-id %d Group-id %d \n \n",stat_buf.st_uid,stat_buf.st_gid); printf("Permission: %s\n",descrip); }/*** 功能:文件列表命令的高级版本,相当于“ls -l”命令,能以用户可理解的形式显示文件信息** 说明:与“ls -l”的一大不同是显示结果没有排序*/void list(){ int i=0; if ( token_num == 1 ){ do_ls( "." ); } else{ while ( --token_num ){ printf("%s:\n", arg_list[++i] ); do_ls( arg_list[i] ); } }}/*** 功能:列表文件或目录的辅助函数** 系统调用:opendir(),readdir(),closedir() */void do_ls(char dirname[]){ DIR *dir_ptr; /* 目录指针 */ struct dirent *direntp; /* entry结构 */printf("%s\n",dirname); if ( ( dir_ptr = opendir( dirname ) ) == NULL ){ /* 打开目录,如果为空,显示出错 */ fprintf(stderr,"ls1: cannot open %s\n", dirname); } else{ while ( ( direntp = readdir( dir_ptr ) ) != NULL ){ /* 遍历当前目录, 显示当前目录中每一个文件(包括隐藏文件)的详细信息 */ dostat( direntp->d_name ); } closedir(dir_ptr); }}/*** 功能: 将文件内容装填至stat结构,并显示文件信息** 系统调用:stat()*/void dostat( char *filename ){ struct stat info; if ( stat(filename, &info) == -1 ){ /* 将文件信息填入info结构 */ perror( filename ); /* 出现错误 */ } else{ show_file_info( filename, &info ); /* 显示文件信息 */ }}/*** 功能:显示文件详细信息*/void show_file_info( char *filename, struct stat *info_p ){ char *uid_to_name(), *ctime(), *gid_to_name(), *filemode(); void mode_to_letters(); char modestr[11]; mode_to_letters( info_p->st_mode, modestr ); printf( "%s" , modestr ); printf( "%4d " , (int) info_p->st_nlink); printf( "%-8s " , uid_to_name(info_p->st_uid) ); printf( "%-8s " , gid_to_name(info_p->st_gid) ); printf( "%8ld " , (long)info_p->st_size); printf( "%.12s ", 4+ctime(&info_p->st_mtime)); printf( "%s\n" , filename );}/*** 功能:将模式码转化为字母*/void mode_to_letters( int mode, char str[] ){ strcpy( str, "----------" ); if ( S_ISDIR(mode) ) str[0] = 'd'; /* 目录 */ if ( S_ISCHR(mode) ) str[0] = 'c'; /* 字符设备 */ if ( S_ISBLK(mode) ) str[0] = 'b'; /* 块设备 */ if ( mode & S_IRUSR ) str[1] = 'r'; /* 用户权限信息 */ if ( mode & S_IWUSR ) str[2] = 'w'; if ( mode & S_IXUSR ) str[3] = 'x'; if ( mode & S_IRGRP ) str[4] = 'r'; /* 小组权限信息 */ if ( mode & S_IWGRP ) str[5] = 'w'; if ( mode & S_IXGRP ) str[6] = 'x'; if ( mode & S_IROTH ) str[7] = 'r'; /* 其它 */ if ( mode & S_IWOTH ) str[8] = 'w'; if ( mode & S_IXOTH ) str[9] = 'x';}/*** 功能:将用户id转化为用户名*/char *uid_to_name(uid_t uid){ struct passwd *getpwuid(), *pw_ptr; static char numstr[10]; if ( ( pw_ptr = getpwuid( uid ) ) == NULL ){ sprintf(numstr,"%d", uid); return numstr; } else{ return pw_ptr->pw_name ; }}/*** 功能:将组用户id转化为组名 */char *gid_to_name( gid_t gid ){ struct group *getgrgid(), *grp_ptr; static char numstr[10]; if ( ( grp_ptr = getgrgid(gid) ) == NULL ){ sprintf(numstr,"%d", gid); return numstr; } else{ return grp_ptr->gr_name; }}/**************************************************************************************************************************************************************/void chpath(){ if(chroot(arg_list[1])==-1){ fprintf(stderr,"cannot change path\n"); }}void echo_op(){ int i; printf("%s\n",buf+5);}/*************************************shell 的主结构*******************************************************************************/int main(){ char * cmd_line; int i=0; /* shell的主体部分*/ while(1){ /* 获取命令行信息*/ cmd_line=get_cmd(stdin); /* 无输入,跳出循环*/ if(cmd_line==NULL){ break; } /* 解析命令行字符串*/ parse(buf); if(special_cmd==1){ redirectory(arg_list[0],arg_list[1]); } else if(special_cmd==2){ redirectory(arg_list[1],arg_list[0]); } else if(special_cmd==3){ pipe_op(arg_list[0],arg_list[1]); } else if(strcmp(arg_list[0],"ls")==0){ ls_op(); } else if(strcmp(arg_list[0],"list")==0){ list(); } else if(strcmp(arg_list[0],"pwd")==0){ pwd_op(); } else if(strcmp(arg_list[0],"exit")==0){ break; } else if(strcmp(arg_list[0],"echo")==0){ echo_op(); } else if(strcmp(arg_list[0],"cd")==0){ chpath(); } else if(strcmp(arg_list[0],"monitor")){ watch_dog(); } else if(strcmp(arg_list[0],"chmode")){ change_file_mode(); } else { execute(arg_list); } /* 释放资源*/ free_buf(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -