CS318 - Pintos
Pintos source browser for JHU CS318 course
ls.c
Go to the documentation of this file.
1 /** ls.c
2 
3  Lists the contents of the directory or directories named on
4  the command line, or of the current directory if none are
5  named.
6 
7  By default, only the name of each file is printed. If "-l" is
8  given as the first argument, the type, size, and inumber of
9  each file is also printed. This won't work until project 4. */
10 
11 #include <syscall.h>
12 #include <stdio.h>
13 #include <string.h>
14 
15 static bool
16 list_dir (const char *dir, bool verbose)
17 {
18  int dir_fd = open (dir);
19  if (dir_fd == -1)
20  {
21  printf ("%s: not found\n", dir);
22  return false;
23  }
24 
25  if (isdir (dir_fd))
26  {
27  char name[READDIR_MAX_LEN];
28 
29  printf ("%s", dir);
30  if (verbose)
31  printf (" (inumber %d)", inumber (dir_fd));
32  printf (":\n");
33 
34  while (readdir (dir_fd, name))
35  {
36  printf ("%s", name);
37  if (verbose)
38  {
39  char full_name[128];
40  int entry_fd;
41 
42  snprintf (full_name, sizeof full_name, "%s/%s", dir, name);
43  entry_fd = open (full_name);
44 
45  printf (": ");
46  if (entry_fd != -1)
47  {
48  if (isdir (entry_fd))
49  printf ("directory");
50  else
51  printf ("%d-byte file", filesize (entry_fd));
52  printf (", inumber %d", inumber (entry_fd));
53  }
54  else
55  printf ("open failed");
56  close (entry_fd);
57  }
58  printf ("\n");
59  }
60  }
61  else
62  printf ("%s: not a directory\n", dir);
63  close (dir_fd);
64  return true;
65 }
66 
67 int
68 main (int argc, char *argv[])
69 {
70  bool success = true;
71  bool verbose = false;
72 
73  if (argc > 1 && !strcmp (argv[1], "-l"))
74  {
75  verbose = true;
76  argv++;
77  argc--;
78  }
79 
80  if (argc <= 1)
81  success = list_dir (".", verbose);
82  else
83  {
84  int i;
85  for (i = 1; i < argc; i++)
86  if (!list_dir (argv[i], verbose))
87  success = false;
88  }
89  return success ? EXIT_SUCCESS : EXIT_FAILURE;
90 }
name
char * name[]
Definition: insult.c:47
snprintf
int snprintf(char *buffer, size_t buf_size, const char *format,...)
Like printf(), except that output is stored into BUFFER, which must have space for BUF_SIZE character...
Definition: stdio.c:62
readdir
bool readdir(int fd, char name[READDIR_MAX_LEN+1])
Definition: syscall.c:169
string.h
strcmp
int strcmp(const char *a_, const char *b_)
Finds the first differing characters in strings A and B.
Definition: string.c:73
list_dir
static bool list_dir(const char *dir, bool verbose)
ls.c
Definition: ls.c:16
EXIT_FAILURE
#define EXIT_FAILURE
Unsuccessful execution.
Definition: syscall.h:20
printf
int printf(const char *format,...)
Writes formatted output to the console.
Definition: stdio.c:79
open
int open(const char *file)
Definition: syscall.c:103
EXIT_SUCCESS
#define EXIT_SUCCESS
Typical return values from main() and arguments to exit().
Definition: syscall.h:19
main
int main(int argc, char *argv[])
Definition: ls.c:68
filesize
int filesize(int fd)
Definition: syscall.c:109
inumber
int inumber(int fd)
lib/user/syscall.h
Definition: syscall.c:181
isdir
bool isdir(int fd)
Definition: syscall.c:175
READDIR_MAX_LEN
#define READDIR_MAX_LEN
Maximum characters in a filename written by readdir().
Definition: syscall.h:16
close
void close(int fd)
Definition: syscall.c:139
dir
A directory.
Definition: directory.c:10