set size for directories correctly in wdir and mkfs

mkdir
ls shows stat info for each dir entry
This commit is contained in:
kaashoek 2006-08-14 14:13:52 +00:00
parent d15f0d1033
commit bdb6643303
5 changed files with 36 additions and 14 deletions

3
fs.c
View file

@ -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);
} }

20
ls.c
View file

@ -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[])
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);

11
mkfs.c
View file

@ -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)
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[])
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);

View file

@ -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)
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;

4
ulib.c
View file

@ -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;