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