kbd: use a better get_key method
[thunix.git] / fs / ext2 / dir.c
blobdcbbd3a746267efe196775a8dbbc3fff98b43285
1 /*
2 * thunix/fs/dir.c
4 * implement something relations to dir, like
5 * mkdir, rmdir or cd some of sort ...
7 * Copyright (C) 2008 - 2009 Aleaxander
8 *
9 * Aleaxander@gmail.com
12 #include <string.h>
13 #include <thunix.h>
14 #include <fs_ext2.h>
17 void ext2_make_empty_dir(struct m_inode *dir, struct m_inode *parent)
19 int block;
21 block = create_block(dir, 0);
22 struct ext2_dir_entry dot, ddot;
24 dot.inode = dir->i_num;
25 dot.name_len = 1;
26 dot.rec_len = EXT2_DIR_REC_LEN(1);
27 strcpy(dot.name, ".");
29 ddot.inode = parent->i_num;
30 ddot.name_len = 2;
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)
40 void *dir_data;
41 struct ext2_dir_entry *de;
42 unsigned int block;
43 unsigned int dir_block = 1;
44 int i = 0;
46 EXT2_DEBUG();
48 if ( !(block = dir->inode.i_block[0]) )
49 return 2;
51 dir_data = bread(block);
52 de = (struct ext2_dir_entry *)dir_data;
53 while (1) {
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;
58 dir_block ++;
61 if (strcmp(de->name, ".") || strcmp(de->inode, "..") )
62 return 0;
63 i ++;
64 if ( i > 2)
65 return 1;
67 de = ext2_next_entry(de);
71 void mkdir(char *pathname)
73 struct m_inode *dir, *inode;
74 int mode;
75 char *dir_name, *file_name;
76 struct ext2_dir_entry entry;
78 char temp_dir[8] = "/";
81 /**
82 * for now, we just one levele dir like /xx but not /xx/yy.
83 * and for now, it's enough
86 dir_name = pathname;
87 file_name = strchr(pathname,'/');
88 if (! file_name) {
89 printk("error: please input the absolute pathname\n");
90 return ;
93 *file_name = '\0';
94 file_name ++;
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");
124 return;
127 ext2_iput(dir);