Skip to content

Commit

Permalink
set size for directories correctly in wdir and mkfs
Browse files Browse the repository at this point in the history
mkdir
ls shows stat info for each dir entry
  • Loading branch information
kaashoek committed Aug 14, 2006
1 parent d15f0d1 commit bdb6643
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 14 deletions.
3 changes: 2 additions & 1 deletion fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,8 @@ writei(struct inode *ip, char *addr, uint off, uint n)
}
if (r > 0) {
if (off > ip->size) {
ip->size = off;
if (ip->type == T_DIR) ip->size = ((off / BSIZE) + 1) * BSIZE;
else ip->size = off;
}
iupdate(ip);
}
Expand Down
20 changes: 11 additions & 9 deletions ls.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ main(int argc, char *argv[])
{
int fd;
uint off;
uint sz;

if(argc > 1){
puts("Usage: ls\n");
Expand All @@ -30,18 +31,19 @@ main(int argc, char *argv[])
if (st.st_type != T_DIR) {
printf(2, "ls: . is not a dir\n");
}
cprintf("size %d\n", st.st_size);
for(off = 0; off < st.st_size; off += sizeof(struct dirent)) {
sz = st.st_size;
for(off = 0; off < sz; off += sizeof(struct dirent)) {
if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) {
printf(2, "ls: read error\n");
exit();
printf(1, "ls: read error\n");
break;
}
if (dirent.inum != 0) {

if (stat (dirent.name, &st) < 0)
printf(2, "stat: failed\n");

printf(1, "%s t %d\n", dirent.name, st.st_type);
if (stat (dirent.name, &st) < 0) {
printf(1, "stat: failed\n");
break;
}
printf(1, "%s t %d ino %d sz %d\n", dirent.name, st.st_type,
dirent.inum, st.st_size);
}
}
close(fd);
Expand Down
11 changes: 10 additions & 1 deletion mkfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ uint freeinode = 1;
void balloc(int);
void wsect(uint, void *);
void winode(uint, struct dinode *);
void rinode(uint inum, struct dinode *ip);
void rsect(uint sec, void *buf);
uint ialloc(ushort type);
void iappend(uint inum, void *p, int n);
Expand Down Expand Up @@ -53,9 +54,10 @@ xint(uint x)
main(int argc, char *argv[])
{
int i, cc, fd;
uint bn, rootino, inum;
uint bn, rootino, inum, off;
struct dirent de;
char buf[512];
struct dinode din;

if(argc < 2){
fprintf(stderr, "Usage: mkfs fs.img files...\n");
Expand Down Expand Up @@ -122,6 +124,13 @@ main(int argc, char *argv[])
close(fd);
}

// fix size of root inode dir
rinode(rootino, &din);
off = xint(din.size);
off = ((off/BSIZE) + 1) * BSIZE;
din.size = xint(off);
winode(rootino, &din);

balloc(usedblocks);

exit(0);
Expand Down
12 changes: 11 additions & 1 deletion syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -294,8 +294,10 @@ sys_mkdir(void)
{
struct proc *cp = curproc[cpu()];
struct inode *nip;
struct inode *pip;
uint arg0;
int l;
struct dirent de;

if(fetcharg(0, &arg0) < 0)
return -1;
Expand All @@ -308,7 +310,15 @@ sys_mkdir(void)

nip = mknod (cp->mem + arg0, T_DIR, 0, 0);

// XXX put . and .. in
de.name[0] = '.';
de.inum = nip->inum;
writei (nip, (char *) &de, 0, sizeof(de));

pip = namei(".", NAMEI_LOOKUP, 0);
de.inum = pip->inum;
de.name[1] = '.';
iput(pip);
writei (nip, (char *) &de, sizeof(de), sizeof(de));

iput(nip);
return (nip == 0) ? -1 : 0;
Expand Down
4 changes: 2 additions & 2 deletions ulib.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ gets(char *buf, int max)
int
stat(char *n, struct stat *st)
{
int fd = open(n, O_RDONLY);
int fd;
int r;

fd = open(n, O_RDONLY);
if (fd < 0) return -1;

r = fstat(fd, st);
close(fd);
return r;
Expand Down

0 comments on commit bdb6643

Please sign in to comment.