X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Fexamples%2Fls.c;h=5907a6cedb90ab507e6f4feee4502f385c1bcdd7;hp=d64d01edd83425fa0233bec9c83851b81796d7e9;hb=a4613d70fb56b93216299f6253698ab0e4bbd46d;hpb=a26618d6f33f13301eb93ee26d6953c76019d879 diff --git a/src/examples/ls.c b/src/examples/ls.c index d64d01e..5907a6c 100644 --- a/src/examples/ls.c +++ b/src/examples/ls.c @@ -1,12 +1,87 @@ /* ls.c - Lists the current directory. */ + Lists the contents of the directory or directories named on + the command line, or of the current directory if none are + named. + + By default, only the name of each file is printed. If "-l" is + given as the first argument, the type and size of each file is + also printed. */ #include +#include +#include + +static void +list_dir (const char *dir, bool verbose) +{ + int dir_fd = open (dir); + if (dir_fd == -1) + { + printf ("%s: not found\n", dir); + return; + } + + if (isdir (dir_fd)) + { + char name[READDIR_MAX_LEN]; + printf ("%s:\n", dir); + while (readdir (dir_fd, name)) + { + printf ("%s", name); + if (verbose) + { + char full_name[128]; + int entry_fd; + + if (strcmp (dir, ".")) + snprintf (full_name, sizeof full_name, "%s/%s", dir, name); + else + { + /* This is a special case for implementations + that don't fully understand . and .. */ + strlcpy (full_name, name, sizeof full_name); + } + entry_fd = open (full_name); + + printf (": "); + if (entry_fd != -1) + { + if (isdir (entry_fd)) + printf ("directory"); + else + printf ("%d-byte file", filesize (entry_fd)); + } + else + printf ("open failed"); + close (entry_fd); + } + printf ("\n"); + } + } + else + printf ("%s: not a directory\n", dir); + close (dir_fd); +} int -main (void) +main (int argc, char *argv[]) { - lsdir (); + bool verbose = false; + if (argc > 1 && !strcmp (argv[1], "-l")) + { + verbose = true; + argv++; + argc--; + } + + if (argc <= 1) + list_dir (".", verbose); + else + { + int i; + for (i = 1; i < argc; i++) + list_dir (argv[i], verbose); + } return 0; }