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) ...@@ -355,7 +355,8 @@ writei(struct inode *ip, char *addr, uint off, uint n)
} }
if (r > 0) { if (r > 0) {
if (off > ip->size) { if (off > ip->size) {
ip->size = off; if (ip->type == T_DIR) ip->size = ((off / BSIZE) + 1) * BSIZE;
else ip->size = off;
} }
iupdate(ip); iupdate(ip);
} }
......
...@@ -12,6 +12,7 @@ main(int argc, char *argv[]) ...@@ -12,6 +12,7 @@ main(int argc, char *argv[])
{ {
int fd; int fd;
uint off; uint off;
uint sz;
if(argc > 1){ if(argc > 1){
puts("Usage: ls\n"); puts("Usage: ls\n");
...@@ -30,18 +31,19 @@ main(int argc, char *argv[]) ...@@ -30,18 +31,19 @@ main(int argc, char *argv[])
if (st.st_type != T_DIR) { if (st.st_type != T_DIR) {
printf(2, "ls: . is not a dir\n"); printf(2, "ls: . is not a dir\n");
} }
cprintf("size %d\n", st.st_size); sz = st.st_size;
for(off = 0; off < st.st_size; off += sizeof(struct dirent)) { for(off = 0; off < sz; off += sizeof(struct dirent)) {
if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) { if (read(fd, &dirent, sizeof(struct dirent)) != sizeof(struct dirent)) {
printf(2, "ls: read error\n"); printf(1, "ls: read error\n");
exit(); break;
} }
if (dirent.inum != 0) { if (dirent.inum != 0) {
if (stat (dirent.name, &st) < 0) {
if (stat (dirent.name, &st) < 0) printf(1, "stat: failed\n");
printf(2, "stat: failed\n"); break;
}
printf(1, "%s t %d\n", dirent.name, st.st_type); printf(1, "%s t %d ino %d sz %d\n", dirent.name, st.st_type,
dirent.inum, st.st_size);
} }
} }
close(fd); close(fd);
......
...@@ -23,6 +23,7 @@ uint freeinode = 1; ...@@ -23,6 +23,7 @@ uint freeinode = 1;
void balloc(int); void balloc(int);
void wsect(uint, void *); void wsect(uint, void *);
void winode(uint, struct dinode *); void winode(uint, struct dinode *);
void rinode(uint inum, struct dinode *ip);
void rsect(uint sec, void *buf); void rsect(uint sec, void *buf);
uint ialloc(ushort type); uint ialloc(ushort type);
void iappend(uint inum, void *p, int n); void iappend(uint inum, void *p, int n);
...@@ -53,9 +54,10 @@ xint(uint x) ...@@ -53,9 +54,10 @@ xint(uint x)
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int i, cc, fd; int i, cc, fd;
uint bn, rootino, inum; uint bn, rootino, inum, off;
struct dirent de; struct dirent de;
char buf[512]; char buf[512];
struct dinode din;
if(argc < 2){ if(argc < 2){
fprintf(stderr, "Usage: mkfs fs.img files...\n"); fprintf(stderr, "Usage: mkfs fs.img files...\n");
...@@ -122,6 +124,13 @@ main(int argc, char *argv[]) ...@@ -122,6 +124,13 @@ main(int argc, char *argv[])
close(fd); 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); balloc(usedblocks);
exit(0); exit(0);
......
...@@ -294,8 +294,10 @@ sys_mkdir(void) ...@@ -294,8 +294,10 @@ sys_mkdir(void)
{ {
struct proc *cp = curproc[cpu()]; struct proc *cp = curproc[cpu()];
struct inode *nip; struct inode *nip;
struct inode *pip;
uint arg0; uint arg0;
int l; int l;
struct dirent de;
if(fetcharg(0, &arg0) < 0) if(fetcharg(0, &arg0) < 0)
return -1; return -1;
...@@ -308,7 +310,15 @@ sys_mkdir(void) ...@@ -308,7 +310,15 @@ sys_mkdir(void)
nip = mknod (cp->mem + arg0, T_DIR, 0, 0); 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); iput(nip);
return (nip == 0) ? -1 : 0; return (nip == 0) ? -1 : 0;
......
...@@ -61,11 +61,11 @@ gets(char *buf, int max) ...@@ -61,11 +61,11 @@ gets(char *buf, int max)
int int
stat(char *n, struct stat *st) stat(char *n, struct stat *st)
{ {
int fd = open(n, O_RDONLY); int fd;
int r; int r;
fd = open(n, O_RDONLY);
if (fd < 0) return -1; if (fd < 0) return -1;
r = fstat(fd, st); r = fstat(fd, st);
close(fd); close(fd);
return r; 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