Mercurial > hg > Members > innparusu > xv6-rpi
comparison src/usr/ls.c @ 0:83c23a36980d
Init
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 26 May 2017 23:11:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:83c23a36980d |
---|---|
1 #include "types.h" | |
2 #include "stat.h" | |
3 #include "user.h" | |
4 #include "fs.h" | |
5 | |
6 char* | |
7 fmtname(char *path) | |
8 { | |
9 static char buf[DIRSIZ+1]; | |
10 char *p; | |
11 | |
12 // Find first character after last slash. | |
13 for(p=path+strlen(path); p >= path && *p != '/'; p--) | |
14 ; | |
15 p++; | |
16 | |
17 // Return blank-padded name. | |
18 if(strlen(p) >= DIRSIZ) | |
19 return p; | |
20 memmove(buf, p, strlen(p)); | |
21 memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); | |
22 return buf; | |
23 } | |
24 | |
25 void | |
26 ls(char *path) | |
27 { | |
28 char buf[512], *p; | |
29 int fd; | |
30 struct dirent de; | |
31 struct stat st; | |
32 | |
33 if((fd = open(path, 0)) < 0){ | |
34 printf(2, "ls: cannot open %s\n", path); | |
35 return; | |
36 } | |
37 | |
38 if(fstat(fd, &st) < 0){ | |
39 printf(2, "ls: cannot stat %s\n", path); | |
40 close(fd); | |
41 return; | |
42 } | |
43 | |
44 switch(st.type){ | |
45 case T_FILE: | |
46 printf(1, "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size); | |
47 break; | |
48 | |
49 case T_DIR: | |
50 if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ | |
51 printf(1, "ls: path too long\n"); | |
52 break; | |
53 } | |
54 strcpy(buf, path); | |
55 p = buf+strlen(buf); | |
56 *p++ = '/'; | |
57 while(read(fd, &de, sizeof(de)) == sizeof(de)){ | |
58 if(de.inum == 0) | |
59 continue; | |
60 memmove(p, de.name, DIRSIZ); | |
61 p[DIRSIZ] = 0; | |
62 if(stat(buf, &st) < 0){ | |
63 printf(1, "ls: cannot stat %s\n", buf); | |
64 continue; | |
65 } | |
66 printf(1, "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size); | |
67 } | |
68 break; | |
69 } | |
70 close(fd); | |
71 } | |
72 | |
73 int | |
74 main(int argc, char *argv[]) | |
75 { | |
76 int i; | |
77 | |
78 if(argc < 2){ | |
79 ls("."); | |
80 exit(); | |
81 } | |
82 for(i=1; i<argc; i++) | |
83 ls(argv[i]); | |
84 exit(); | |
85 } |