SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005  David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
017 */
018 
019 #include <libc.h>
020 #include <stdarg.h>
021 #include <debug.h>
022 
023 #include "fstest_utils.h"
024 
025 
026 /** Helper functions that dumps the contents of the current working
027     directory of the process */
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   /* Build initial tabulation */
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       /* Next iteration */
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 }

source navigation ] diff markup ] identifier search ] general search ]