博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
my_ls-ailh
阅读量:5330 次
发布时间:2019-06-15

本文共 6847 字,大约阅读时间需要 22 分钟。

//*** myls--h.c文件 ***// 1 #include
2 #include
3 #include "h.h" 4 int is_or_hidenode(char *path) 5 { 6 char *str = NULL; 7 str=strrchr(path,'/'); 8 if(str != NULL) 9 { 10 if(!strcmp(str,"/.") || !strcmp(str,"/..")) 11 return 1; 12 } 13 return 0; 14
  //***myls--h.h文件***//  1 #ifndef __H_H  2 #define __H_H  3   4 int is_or_hidenode(char *path);  5   6 #endif
1 //*** myls--i.c文件***// 2   #include
3 #include
4 #include
5 #include "i.h" 6 int my_inode(char *path) 7 { 8 char buf[BUFSIZE]={}; 9 struct stat ownper;10 if(stat(path,&ownper)==-1)11 return -1;12 return ownper.st_ino;13 }
1 //*** myls--i.h文件***//2 #ifndef __I_H3 #define __I_H4 5 #define BUFSIZE 10246 7 int my_inode(char *path);8 9 #endif
1 //*** myls--l.c文件***//  2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include "h.h" 14 #include "l.h" 15 16 #define BUFSIZE 1024 17 18 char file_type(struct stat ownper) 19 { 20 switch(ownper.st_mode & S_IFMT ) 21 { 22 case S_IFSOCK: 23 return 's'; 24 case S_IFLNK: 25 return 'l'; 26 case S_IFREG : 27 return '-'; 28 case S_IFBLK : 29 return 'b'; 30 case S_IFDIR: 31 return 'd'; 32 case S_IFCHR: 33 return 'c'; 34 case S_IFIFO: 35 return 'p'; 36 } 37 } 38 39 char * file_permission(struct stat ownper) 40 { 41 //user permission0 42 if(ownper.st_mode & S_IRUSR) 43 { 44 printf("%c",'r'); 45 } 46 else 47 printf("%c",'-'); 48 if(ownper.st_mode & S_IWUSR) 49 { 50 printf("%c",'w'); 51 } 52 else 53 printf("%c",'-'); 54 if(ownper.st_mode & S_IXUSR) 55 { 56 if(ownper.st_mode & S_ISUID) 57 printf("%c",'s'); 58 else 59 printf("%c",'x'); 60 } 61 else if(ownper.st_mode & S_ISUID) 62 { 63 printf("%c",'S'); 64 } 65 else 66 printf("%c",'-'); 67 68 /group permission 69 if(ownper.st_mode & S_IRGRP) 70 { 71 printf("%c",'r'); 72 } 73 else 74 printf("%c",'-'); 75 if(ownper.st_mode & S_IWGRP) 76 { 77 printf("%c",'w'); 78 } 79 else 80 printf("%c",'-'); 81 if(ownper.st_mode & S_IXGRP) 82 { 83 if(ownper.st_mode & S_ISGID) 84 printf("%c",'s'); 85 else 86 printf("%c",'x'); 87 } 88 else if(ownper.st_mode & S_ISGID) 89 { 90 printf("%c",'S'); 91 } 92 else 93 printf("%c",'-'); 94 95 ////===============other permission 96 if(ownper.st_mode & S_IROTH) 97 { 98 printf("%c",'r'); 99 }100 else101 printf("%c",'-');102 if(ownper.st_mode & S_IWOTH)103 {104 printf("%c",'w');105 }106 else107 printf("%c",'-');108 if(ownper.st_mode & S_IXOTH)109 {110 if(ownper.st_mode & S_ISVTX)111 printf("%c",'t');112 else113 printf("%c",'x');114 }115 else if(ownper.st_mode & S_ISVTX)116 {117 printf("%c",'T');118 } 119 else120 printf("%c",'-');121 }122 123 void my_ls_l(char *path)124 {125 struct tm *tmp=NULL;126 struct stat ownper;127 char file_name[BUFSIZE]={};128 struct passwd *pwd=NULL;129 struct group *grp=NULL;130 131 if(lstat(path,&ownper)==-1) //lstat() 里的成员st_size显示的是链接文件的真实大小132 {133 perror("stat()");134 return;135 }136 printf("%c",file_type(ownper));//获取用户类型137 138 file_permission(ownper);139 140 //硬链接数141 printf("%ld ",ownper.st_nlink);142 143 //用户名144 pwd=getpwuid(ownper.st_uid);145 if(pwd==NULL)146 return;147 printf("%s ",pwd->pw_name);148 149 //所属组名150 grp=getgrgid(ownper.st_gid);151 if(grp==NULL)152 return;153 printf("%s ",grp->gr_name);154 155 //文件大小156 printf("%ld ",ownper.st_size);157 158 //修改时间159 tmp=localtime(&ownper.st_mtim.tv_sec);160 char m_time[1024]={};161 strftime(m_time,1024,"%m月 %d %H:%M",tmp);162 printf("%s ",m_time);163 164 //文件名165 strcpy(file_name,strrchr(path,'/'));166 file_name[0]=' ';167 printf("%s",file_name);168 printf("\n");169 }
1 //*** myls--l.h文件***// 2 #ifndef __L_H 3 #define __L_H 4  5 char file_type(struct stat ownper); 6  7 char * file_permission(struct stat ownper); 8  9 void  my_ls_l(char *path);10 11 #endif
1 //***myls--main.c***//  2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include "h.h" 11 #include "i.h" 12 #include "l.h" 13 14 #define BUFSIZE 1024 15 16 int main(int argc,char *argv[]) 17 { 18 19 if(argc<3) 20 { 21 printf("error\n"); 22 return -1; 23 } 24 struct stat cur_stat; 25 int is_dir=0; 26 const char * optstring="-ailh"; 27 char buf[BUFSIZE]={}; 28 char *usr_per=NULL; 29 DIR *dp = NULL; 30 struct dirent *entry; 31 int c=0; 32 int ls_h=0,ls_i=0,ls_a=0,ls_l=0; 33 34 if(stat(argv[2],&cur_stat)==-1) 35 return -1; 36 if(file_type(cur_stat)=='d') 37 is_dir=1; 38 39 while(1) 40 { 41 c=getopt(argc,argv,optstring); 42 if(c==-1) 43 { 44 break; 45 } 46 switch(c) 47 { 48 case 'h': 49 ls_h=1; 50 break; 51 case 'i': 52 ls_i=1; 53 break; 54 case 'a': 55 ls_a=1; 56 break; 57 case 'l': 58 ls_l=1; 59 break; 60 case '?': 61 printf("unknow option\n"); 62 break; 63 default: 64 break; 65 66 } 67 } 68 if(!is_dir)//普通文件的option处理 69 { 70 if(ls_i==ls_l==1){ 71 printf("%ld ",cur_stat.st_ino); 72 my_ls_l(argv[2]); 73 } 74 else if(ls_i==1){ 75 printf("%ld ",cur_stat.st_ino); 76 printf("%s\n",argv[2]); 77 } 78 else if(ls_l==1){ 79 my_ls_l(argv[2]); 80 } 81 else 82 printf("%s\n",argv[2]); 83 } 84 else//目录的option处理 85 { 86 dp=opendir(argv[2]); 87 if(dp == NULL) 88 return -1; 89 while(1) 90 { 91 if((entry=readdir(dp)) == NULL) 92 { 93 if(errno){ 94 perror("readdir()"); 95 closedir(dp); 96 return -1; 97 } 98 break; 99 }100 memset(buf,'\0',BUFSIZE);101 sprintf(buf,"%s/%s",argv[2],entry->d_name); 102 //根据option统计目录下的各个文件的信息103 if(ls_i==1 && ls_l==1 && ls_a==1){104 printf(" %d ",my_inode(buf));105 my_ls_l(buf);106 }107 108 else if(ls_i==1 && ls_l==1){109 if(!is_or_hidenode(buf)){110 printf(" %d ",my_inode(buf));111 my_ls_l(buf);112 }113 }114 115 else if(ls_i==1 && ls_a==1){116 printf(" %d ",my_inode(buf));117 printf(" %s ",entry->d_name);118 }119 120 else if(ls_i==1){121 if(!is_or_hidenode(buf)){122 printf(" %d ",my_inode(buf));123 printf("%s ",entry->d_name);124 }125 }126 127 else if(ls_l==1 && ls_a==1){128 my_ls_l(buf);129 }130 131 else if(ls_l==1){132 if(!is_or_hidenode(buf))133 {134 my_ls_l(buf);135 }136 137 }138 else if(ls_a==1)139 printf(" %s ",entry->d_name);140 else141 {142 if(!is_or_hidenode(buf))143 printf(" %s ",entry->d_name);144 }145 }146 closedir(dp);147 }148 return 0;149 }
1 //***myls--makefile***//2 main : main.o h.o i.o l.o3     gcc main.o h.o i.o l.o -o main4 clean :5     rm -rf *.o main
1 ///*****readme*****///2 1.命令行参数格式 3     ./main -l /etc4 2.命令行选项5     可支持-laih的自由组合6 ----------------------------- 没有实现-l下的总用量(total)的计算

 

转载于:https://www.cnblogs.com/onepieceluph/p/10541778.html

你可能感兴趣的文章
NYOJ458 - 小光棍数
查看>>
java中常用方法
查看>>
【Programming Clip】06、07年清华计算机考研上机试题解答(个别测试用例无法通过)...
查看>>
canvas动画
查看>>
4,7周围玩家
查看>>
关于webpack升级过后不能打包的问题;
查看>>
vue - 生命周期
查看>>
SQL Server用户权限详解
查看>>
Python正则表达式
查看>>
Linux进程间通信--命名管道
查看>>
UVa 10970 - Big Chocolate
查看>>
js输出
查看>>
set,env,export,set -x,set -e;
查看>>
H5多文本换行
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>