segment_alloc may not allocate enough memory.
[mit-jos.git] / user / ls.c
blob63f017c60a47918ccc2abd07378270c0bf4dd704
1 #include <inc/lib.h>
3 int flag[256];
5 void lsdir(const char*, const char*);
6 void ls1(const char*, bool, off_t, const char*);
8 void
9 ls(const char *path, const char *prefix)
11 int r;
12 struct Stat st;
14 if ((r = stat(path, &st)) < 0)
15 panic("stat %s: %e", path, r);
16 if (st.st_isdir && !flag['d'])
17 lsdir(path, prefix);
18 else
19 ls1(0, st.st_isdir, st.st_size, path);
22 void
23 lsdir(const char *path, const char *prefix)
25 int fd, n;
26 struct File f;
28 if ((fd = open(path, O_RDONLY)) < 0)
29 panic("open %s: %e", path, fd);
30 while ((n = readn(fd, &f, sizeof f)) == sizeof f)
31 if (f.f_name[0])
32 ls1(prefix, f.f_type==FTYPE_DIR, f.f_size, f.f_name);
33 if (n > 0)
34 panic("short read in directory %s", path);
35 if (n < 0)
36 panic("error reading directory %s: %e", path, n);
39 void
40 ls1(const char *prefix, bool isdir, off_t size, const char *name)
42 char *sep;
44 if(flag['l'])
45 fprintf(1, "%11d %c ", size, isdir ? 'd' : '-');
46 if(prefix) {
47 if (prefix[0] && prefix[strlen(prefix)-1] != '/')
48 sep = "/";
49 else
50 sep = "";
51 fprintf(1, "%s%s", prefix, sep);
53 fprintf(1, "%s", name);
54 if(flag['F'] && isdir)
55 fprintf(1, "/");
56 fprintf(1, "\n");
59 void
60 usage(void)
62 fprintf(1, "usage: ls [-dFl] [file...]\n");
63 exit();
66 void
67 umain(int argc, char **argv)
69 int i;
71 ARGBEGIN{
72 default:
73 usage();
74 case 'd':
75 case 'F':
76 case 'l':
77 flag[(uint8_t)ARGC()]++;
78 break;
79 }ARGEND
81 if (argc == 0)
82 ls("/", "");
83 else {
84 for (i=0; i<argc; i++)
85 ls(argv[i], argv[i]);