yulixin

myls
  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <sys/stat.h>
  4 #include <unistd.h>
  5 #include <pwd.h>
  6 #include <grp.h>
  7 #include <time.h>
  8 #include <errno.h>
  9 #include <dirent.h>
 10 #include <string.h>
 11 #include <stdlib.h>
 12 
 13 int llstat(char *p);
 14 int  astat(char *p);
 15 int  istat(char *p);
 16 int  hstat(char *p);
 17 static int nums;
 18 
 19 int main(int argc, char **argv)
 20 {
 21     int c;
 22     char *optstring = "-laih";
 23     if(argc < 3)    
 24         return 1;
 25     while (1){
 26         c = getopt(argc, argv, optstring);
 27         if(c == -1)
 28             break;
 29         switch(c){
 30             case 'l': llstat(argv[2]);break;
 31             case 'a': astat(argv[2]);break;
 32             case 'i': istat(argv[2]);break;
 33             case 'h': hstat(argv[2]);break;        
 34         //    case '1': printf("非选项参数\n");break;
 35             case '?': printf("?\n");break;
 36             default : break;
 37         }    
 38     }
 39     return 0;
 40 
 41 }
 42 
 43 //-l
 44 //文件名->路径
 45 static char *buf_cat(const char *p, const char *name)
 46 {
 47     char *bufcat = malloc(1024);
 48     memset(bufcat,'\0',1024);
 49     strcpy(bufcat,p);
 50     strcat(bufcat,"/");
 51     strcat(bufcat,name);
 52     return bufcat;
 53 }
 54 // 判断是否为隐藏文件
 55 static int is_i(const char *p)
 56 {
 57     if(*p == '.')
 58         return 1;
 59     else
 60         return 0;
 61 }
 62 
 63 int l_llstat(const char *p, const char *name)
 64 {
 65     struct stat mystat;
 66     struct passwd *pwd = NULL;
 67     struct group *grp = NULL;
 68     struct tm *tmp = NULL;
 69     char *buf=NULL;
 70 
 71     buf = buf_cat(p,name);
 72     if(lstat(buf,&mystat) == -1){
 73         perror("stat()");
 74         return 1;
 75     }
 76     if(is_i(name) == 0){
 77         nums+=mystat.st_blocks/2;
 78 
 79         //类型
 80         switch(mystat.st_mode & S_IFMT){
 81             case S_IFSOCK : putchar('s');break;
 82             case S_IFLNK : putchar('l');break;
 83             case S_IFREG : putchar('-');break;
 84             case S_IFBLK : putchar('b');break;
 85             case S_IFDIR : putchar('d');break;
 86             case S_IFCHR : putchar('c');break;
 87             case S_IFIFO : putchar('p');break;
 88             default: break;
 89         }
 90         //权限
 91         if(mystat.st_mode & S_IRUSR)
 92             putchar('r');
 93         else
 94             putchar('-');
 95         if(mystat.st_mode & S_IWUSR)
 96             putchar('w');
 97         else
 98             putchar('-');
 99         if(mystat.st_mode & S_IXUSR){
100             if(mystat.st_mode & S_ISUID)
101                 putchar('s');
102             else
103                 putchar('x');
104         }
105         else
106             putchar('-');
107 
108         if(mystat.st_mode & S_IRGRP)
109             putchar('r');
110         else
111             putchar('-');
112         if(mystat.st_mode & S_IWGRP)
113             putchar('w');
114         else
115             putchar('-');
116         if(mystat.st_mode & S_IXGRP){
117             if(mystat.st_mode & S_ISGID)
118                 putchar('s');
119             else
120                 putchar('x');
121         }
122         else
123             putchar('-');
124 
125         if(mystat.st_mode & S_IROTH)
126             putchar('r');
127         else
128             putchar('-');
129         if(mystat.st_mode & S_IWOTH)
130             putchar('w');
131         else
132             putchar('-');
133         if(mystat.st_mode & S_IXOTH){
134             if(mystat.st_mode & S_ISVTX)
135                 putchar('t');
136             else
137                 putchar('x');
138         }
139         else
140             putchar('-');    
141         //硬链接
142         printf(" %ld ", mystat.st_nlink);
143         //文件拥有者名
144         pwd = getpwuid(mystat.st_uid);
145         printf("%s ", pwd->pw_name);
146         //文件所有组
147         grp = getgrgid(mystat.st_gid);
148         printf("%s ",grp->gr_name);
149         //总字节个数 
150         printf("%5ld ", mystat.st_size);
151         //获取文件时间 
152         tmp = localtime(&mystat.st_mtim.tv_sec);
153         strftime(buf, 1024, "%m月  %d %H:%M", tmp);
154         printf("%s ", buf);
155         //文件名
156         printf("%s\n", name);
157     }
158     return 0;
159 }
160 
161 int llstat(char *p)
162 {
163     DIR *dp = NULL;
164     struct dirent *entry = NULL;
165     char buf[1024] = {};
166     struct stat mystat1;
167     if(lstat(p,&mystat1) == -1){
168         perror("stat()");
169         return 1;
170     }
171     if(S_ISREG(mystat1.st_mode)){
172         l_llstat(".", p);
173     }else{
174         dp = opendir(p);
175         if(dp == NULL){
176             perror("opendir()");
177             return 1;
178         }
179 
180         while(1){
181             entry = readdir(dp);
182             if(NULL == entry){
183                 if(errno){
184                     perror("readdir()");
185                     closedir(dp);
186                     return 1;
187                 }
188                 break;
189             }
190             l_llstat(p, entry->d_name);
191         }
192         printf("总用量:%d\n", nums);
193         closedir(dp);
194     }    return 0;
195 
196 }
197 
198 
199 
200 // a
201 
202 int a_llstat(const char *p, const char *name)
203 {
204     struct stat mystat;
205     char *buf=NULL;
206 
207     buf = buf_cat(p,name);
208     if(lstat(buf,&mystat) == -1){
209         perror("stat()");
210         return 1;
211     }
212     //文件名
213     printf("%s ", name);
214     return 0;
215 }
216 
217 int  astat(char *p)
218 {
219     struct stat mystat2;
220     struct dirent *entry = NULL;
221     DIR *dp = NULL;
222     if(lstat(p,&mystat2) == -1){
223         perror("stat()");
224         return 1;
225      }
226     
227     if(S_ISREG(mystat2.st_mode)){
228         printf("%s ", p);
229     }
230         dp= opendir(p);
231         if(dp == NULL){
232             perror("opendir()");
233             return 1;
234         }
235 
236         while(1){
237             entry = readdir(dp);
238             if(NULL == entry){
239                 if(errno){
240                     perror("readdir()");
241                     closedir(dp);
242                     return 1;
243                 }
244                 break;
245             }
246             a_llstat(p, entry->d_name);
247         }
248     
249     closedir(dp);
250     printf("\n");
251     return 0;
252 
253 }
254 
255 // i
256 
257 int i_llstat(const char *p, const char *name)
258 {
259     struct stat mystat;
260     char *buf=NULL;
261 
262     buf = buf_cat(p,name);
263     if(lstat(buf,&mystat) == -1){
264         perror("stat()");
265         return 1;
266     }
267     printf("%ld  ",mystat.st_ino);
268     //文件名
269     printf("%s  ", name);
270     return 0;
271 }
272 
273 int  istat(char *p)
274 {
275     struct stat mystat2;
276     struct dirent *entry = NULL;
277     DIR *dp = NULL;
278     if(lstat(p,&mystat2) == -1){
279         perror("stat()");
280         return 1;
281      }
282 
283     if(S_ISREG(mystat2.st_mode)){
284         if(is_i(p))
285             return 1;
286         printf("%ld ",mystat2.st_ino);
287         printf("%s ", p);
288     }
289     else{
290         dp= opendir(p);
291         if(dp == NULL){
292             perror("opendir()");
293             return 1;
294         }
295 
296         while(1){
297             entry = readdir(dp);
298             if(NULL == entry){
299                 if(errno){
300                     perror("readdir()");
301                     closedir(dp);
302                     return 1;
303                 }
304                 break;
305             }
306             if(is_i(entry->d_name))
307                 continue;
308             i_llstat(p, entry->d_name);
309         }
310     }
311     closedir(dp);
312     printf("\n");
313     return 0;
314 }
315 
316 //h
317 int  hstat(char *p)
318 {
319     struct stat mystat2;
320     struct dirent *entry = NULL;
321     DIR *dp = NULL;
322     if(lstat(p,&mystat2) == -1){
323         perror("stat()");
324         return 1;
325     }
326 
327     if(!((mystat2.st_mode & S_IFMT) == S_IFDIR)){
328         if(!is_i(p)){
329             printf("%s\n", p);
330             return 1;
331         }
332     } else{
333 
334         dp= opendir(p);
335         if(dp == NULL){
336             perror("opendir()");
337             return 1;
338         }
339 
340         while(1){
341             entry = readdir(dp);
342             if(NULL == entry){
343                 if(errno){
344                     perror("readdir()");
345                     closedir(dp);
346                     return 1;
347                 }
348                 break;
349             }
350         if(is_i(entry->d_name) == 0)
351             printf("%s  ", entry->d_name);
352         }
353         closedir(dp);
354     }
355     printf("\n");
356     return 0;
357 }

 

posted on 2019-03-15 17:48  yulixin  阅读(138)  评论(0编辑  收藏  举报