]>
Commit | Line | Data |
---|---|---|
3839e657 TT |
1 | /* |
2 | * newdir.c --- create a new directory block | |
3 | * | |
4 | * Copyright (C) 1994 Theodore Ts'o. This file may be redistributed | |
5 | * under the terms of the GNU Public License. | |
6 | */ | |
7 | ||
8 | #include <stdio.h> | |
9 | #include <string.h> | |
10 | #include <unistd.h> | |
11 | #include <stdlib.h> | |
f3db3566 | 12 | |
3839e657 TT |
13 | #include <linux/ext2_fs.h> |
14 | ||
15 | #include "ext2fs.h" | |
16 | ||
17 | /* | |
18 | * Create new directory block | |
19 | */ | |
20 | errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino, ino_t parent_ino, | |
21 | char **block) | |
22 | { | |
23 | char *buf; | |
24 | struct ext2_dir_entry *dir = NULL; | |
25 | int rec_len; | |
26 | ||
f3db3566 TT |
27 | EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS); |
28 | ||
3839e657 TT |
29 | buf = malloc(fs->blocksize); |
30 | if (!buf) | |
31 | return ENOMEM; | |
32 | memset(buf, 0, fs->blocksize); | |
33 | dir = (struct ext2_dir_entry *) buf; | |
34 | dir->rec_len = fs->blocksize; | |
35 | ||
36 | if (dir_ino) { | |
37 | /* | |
38 | * Set up entry for '.' | |
39 | */ | |
40 | dir->inode = dir_ino; | |
41 | dir->name_len = 1; | |
42 | dir->name[0] = '.'; | |
43 | rec_len = dir->rec_len - EXT2_DIR_REC_LEN(dir->name_len); | |
44 | dir->rec_len = EXT2_DIR_REC_LEN(dir->name_len); | |
45 | ||
46 | /* | |
47 | * Set up entry for '..' | |
48 | */ | |
49 | dir = (struct ext2_dir_entry *) (buf + dir->rec_len); | |
50 | dir->rec_len = rec_len; | |
51 | dir->inode = parent_ino; | |
52 | dir->name_len = 2; | |
53 | dir->name[0] = '.'; | |
54 | dir->name[1] = '.'; | |
55 | ||
56 | } | |
57 | *block = buf; | |
58 | return 0; | |
59 | } |