set size for directories correctly in wdir and mkfs
mkdir ls shows stat info for each dir entry
This commit is contained in:
parent
d15f0d1033
commit
bdb6643303
5 changed files with 36 additions and 14 deletions
3
fs.c
3
fs.c
|
@ -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
20
ls.c
|
@ -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
11
mkfs.c
|
@ -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);
|
||||||
|
|
12
syscall.c
12
syscall.c
|
@ -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
4
ulib.c
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue