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