001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019 #include <libc.h>
020 #include <stdarg.h>
021 #include <debug.h>
022
023 #include "fstest_utils.h"
024
025
026
027
028 static void cwd_ls(int detailed, int recursive, int reclevel)
029 {
030 char tab[256], *c;
031 int i;
032 struct dirent * dirent;
033 DIR * here;
034
035 here = opendir(".");
036 if (! here)
037 return;
038
039
040 if (recursive)
041 {
042 for (c = tab, i = 0 ; (i < reclevel) && (i < sizeof(tab)/2) ; i++)
043 {
044 *c++ = ' ';
045 *c++ = ' ';
046 }
047 *c++ = '\0';
048 }
049 else
050 *tab = '\0';
051
052 while ((dirent = readdir(here)) != NULL)
053 {
054 char entrychar;
055 char * entrysuffix;
056
057 switch(dirent->type)
058 {
059 case S_IFREG: entrychar='-'; entrysuffix=""; break;
060 case S_IFDIR: entrychar='d'; entrysuffix="/"; break;
061 case S_IFLNK: entrychar='l'; entrysuffix="@"; break;
062 case S_IFCHR: entrychar='c'; entrysuffix=NULL; break;
063 default: entrychar='?'; entrysuffix="?!?"; break;
064 }
065
066 if (detailed)
067 {
068 struct stat stat;
069 char target_name[SOS_FS_DIRENT_NAME_MAXLEN];
070 char majorminor[24];
071
072 if (lstat(dirent->name, & stat))
073 continue;
074
075 *target_name = '\0';
076 if (stat.st_type == S_IFLNK)
077 {
078 int fd = open(dirent->name, O_RDONLY | O_NOFOLLOW);
079 if (fd >= 0)
080 {
081 int len = read(fd, target_name, sizeof(target_name) - 1);
082 if (len < 0)
083 *target_name='\0';
084 else
085 target_name[len] = '\0';
086 close(fd);
087 }
088 }
089 else if (stat.st_type == S_IFCHR)
090 {
091 snprintf(majorminor, sizeof(majorminor), " %d,%d",
092 stat.st_rdev_major, stat.st_rdev_minor);
093 entrysuffix = majorminor;
094 }
095
096 bochs_printf("%s%c%c%c%c %lld %s%s%s%s (location=0x%llx)\n",
097 tab, entrychar,
098 (stat.st_access_rights&S_IRUSR)?'r':'-',
099 (stat.st_access_rights&S_IWUSR)?'w':'-',
100 (stat.st_access_rights&S_IXUSR)?'x':'-',
101 stat.st_size,
102 dirent->name,
103 entrysuffix,
104 (stat.st_type==S_IFLNK)?" -> ":"",
105 target_name,
106 stat.st_storage_location);
107 }
108 else
109 bochs_printf("%s%s%s\n",
110 tab, dirent->name, entrysuffix);
111
112
113 if (recursive)
114 {
115 int fd_here = dirfd(here);
116 if (chdir(dirent->name))
117 continue;
118 cwd_ls(detailed, recursive, reclevel+1);
119 if(fchdir(fd_here))
120 {
121 closedir(here);
122 return;
123 }
124 }
125 }
126 closedir(here);
127 }
128
129
130 void ls(const char * path, int detailed, int recursive)
131 {
132 int fd_here = open(".", O_RDONLY | O_DIRECTORY);
133 if (fd_here < 0)
134 return;
135
136 if (chdir(path))
137 {
138 close(fd_here);
139 return;
140 }
141
142 bochs_printf("----------- Contents of %s:\n", path);
143 cwd_ls(detailed, recursive, 1);
144 bochs_printf("---------------------------\n");
145
146 fchdir(fd_here);
147 close(fd_here);
148 }