Skip to content
Snippets Groups Projects
Commit bdb66433 authored by kaashoek's avatar kaashoek
Browse files

set size for directories correctly in wdir and mkfs

mkdir
ls shows stat info for each dir entry
parent d15f0d10
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
......
......@@ -12,6 +12,7 @@ main(int argc, char *argv[])
{
int fd;
uint off;
uint sz;
if(argc > 1){
puts("Usage: ls\n");
......@@ -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);
......
......@@ -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);
......@@ -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");
......@@ -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);
......
......@@ -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;
......@@ -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;
......
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment