4 * implement something relations to dir, like
5 * mkdir, rmdir or cd some of sort ...
7 * Copyright (C) 2008 - 2009 Aleaxander
17 void ext2_make_empty_dir(struct m_inode
*dir
, struct m_inode
*parent
)
21 block
= create_block(dir
, 0);
22 struct ext2_dir_entry dot
, ddot
;
24 dot
.inode
= dir
->i_num
;
26 dot
.rec_len
= EXT2_DIR_REC_LEN(1);
27 strcpy(dot
.name
, ".");
29 ddot
.inode
= parent
->i_num
;
31 ddot
.rec_len
= EXT2_DIR_REC_LEN(2);
32 strcpy(ddot
.name
, "..");
34 ext2_add_entry(dir
, &dot
);
35 ext2_add_entry(dir
, &ddot
);
38 int ext2_dir_empty(struct m_inode
*dir
)
41 struct ext2_dir_entry
*de
;
43 unsigned int dir_block
= 1;
48 if ( !(block
= dir
->inode
.i_block
[0]) )
51 dir_data
= bread(block
);
52 de
= (struct ext2_dir_entry
*)dir_data
;
54 if ( (char *)de
>= (char *)(EXT2_BLOCK_SIZE
+ dir_data
) ) {
55 block
= bmap (dir
, dir_block
);
56 dir_data
= bread (block
);
57 de
= (struct ext2_dir_entry
*)dir_data
;
61 if (strcmp(de
->name
, ".") || strcmp(de
->inode
, "..") )
67 de
= ext2_next_entry(de
);
71 void mkdir(char *pathname
)
73 struct m_inode
*dir
, *inode
;
75 char *dir_name
, *file_name
;
76 struct ext2_dir_entry entry
;
78 char temp_dir
[8] = "/";
82 * for now, we just one levele dir like /xx but not /xx/yy.
83 * and for now, it's enough
87 file_name
= strchr(pathname
,'/');
89 printk("error: please input the absolute pathname\n");
96 EXT2_DEBUG(printk("dir:%s file: %s\n",dir_name
, file_name
));
98 dir
= ext2_namei(temp_dir
);
100 EXT2_DEBUG(printk("dir's inr: %d\n", dir
->i_num
));
102 mode
= mode
| S_IFDIR
;
103 inode
= ext2_new_inode(dir
, mode
);
106 entry
.inode
= inode
->i_num
;
107 entry
.name_len
= strlen(file_name
);
108 entry
.rec_len
= EXT2_DIR_REC_LEN(entry
.name_len
);
109 strcpy(entry
.name
, file_name
);
111 EXT2_DEBUG(printk("the new entry's name is %s\n",entry
.name
));
113 ext2_add_entry(dir
, &entry
);
117 ext2_make_empty_dir(inode
, dir
);
120 void rmdir(struct m_inode
*dir
)
122 if ( !ext2_dir_empty(dir
) ) {
123 printk("dir not empty\n");