1 #include <stdio.h>
2 #include <string.h>
3 #include <dirent.h>
4 #include <errno.h>
5 #include <sys/stat.h>
6 #include <unistd.h>
7 #include <pwd.h>
8 #include <grp.h>
9 #include <time.h>
10
11 int main(int argc, char* argv[])
12 {
13 if (argc != 2)
14 {
15 printf("Usage : ls path\n");
16 return 0;
17 }
18
19 char path[256] = {0};
20 strcpy(path, argv[1]);
21
22 int l = strlen(path);
23 if (path[l - 1] != '/')
24 path[l] = '/';
25
26 DIR* d = opendir(path);
27 if (!d)
28 {
29 printf("Failed to open path : %s\n", strerror(errno));
30 return 0;
31 }
32
33 char cp[256];
34 while (dirent* ent = readdir(d))
35 {
36 memset(cp, 0, sizeof(cp));
37 strcpy(cp, path);
38 strcat(cp, ent->d_name);
39
40 struct stat s;
41 stat(cp, &s);
42
43 if (S_ISDIR(s.st_mode))
44 printf("d");
45 else if (S_ISCHR(s.st_mode))
46 printf("c");
47 else if (S_ISBLK(s.st_mode))
48 printf("b");
49 else if (S_ISFIFO(s.st_mode))
50 printf("c");
51 else if (S_ISLNK(s.st_mode))
52 printf("l");
53 else if (S_ISSOCK(s.st_mode))
54 printf("c");
55 else
56 printf("-");
57
58 if (s.st_mode & S_IRUSR)
59 printf("r");
60 else
61 printf("-");
62
63 if (s.st_mode & S_IWUSR)
64 printf("w");
65 else
66 printf("-");
67
68 if (s.st_mode & S_IXUSR)
69 printf("x");
70 else
71 printf("-");
72
73 if (s.st_mode & S_IRGRP)
74 printf("r");
75 else
76 printf("-");
77
78 if (s.st_mode & S_IWGRP)
79 printf("w");
80 else
81 printf("-");
82
83 if (s.st_mode & S_IXGRP)
84 printf("x");
85 else
86 printf("-");
87
88 if (s.st_mode & S_IROTH)
89 printf("r");
90 else
91 printf("-");
92
93 if (s.st_mode & S_IWOTH)
94 printf("w");
95 else
96 printf("-");
97
98 if (s.st_mode & S_IXOTH)
99 printf("x");
100 else
101 printf("-");
102
103 struct passwd* pwd = getpwuid(s.st_uid);
104 struct group* grp = getgrgid(s.st_gid);
105 printf(" %6ld %s %s %10ld %s\n", s.st_nlink, pwd->pw_name, grp->gr_name, s.st_size, ent->d_name);
106 }
107 return 0;
108 }