X-Git-Url: http://git.openwrt.org/?p=project%2Fmake_ext4fs.git;a=blobdiff_plain;f=make_ext4fs.c;h=051052bb4b1f1252163049f14b68a6e96e63fca7;hp=dd4d0d3f301ab45d2135d28e5af5ce47ac3919ad;hb=HEAD;hpb=bd53eaafbc2a89a57b8adda38f53098a431fa8f4 diff --git a/make_ext4fs.c b/make_ext4fs.c index dd4d0d3..051052b 100644 --- a/make_ext4fs.c +++ b/make_ext4fs.c @@ -45,6 +45,27 @@ static int filter_dot(const struct dirent *d) return (strcmp(d->d_name, "..") && strcmp(d->d_name, ".")); } +static u32 build_default_directory_structure(time_t fixed_time) +{ + u32 inode; + u32 root_inode; + struct dentry dentries = { + .filename = "lost+found", + .file_type = EXT4_FT_DIR, + .mode = S_IRWXU, + .uid = 0, + .gid = 0, + .mtime = (fixed_time != -1) ? fixed_time : 0, + }; + root_inode = make_directory(0, 1, &dentries, 1); + inode = make_directory(root_inode, 0, NULL, 0); + *dentries.inode = inode; + inode_set_permissions(inode, dentries.mode, + dentries.uid, dentries.gid, dentries.mtime); + + return root_inode; +} + /* Read a local directory and create the same tree in the generated filesystem. Calls itself recursively with each directory in the given directory. full_path is an absolute or relative path, with a trailing slash, to the @@ -237,12 +258,12 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path return inode; } -static u32 compute_block_size() +static u32 compute_block_size(void) { return 4096; } -static u32 compute_journal_blocks() +static u32 compute_journal_blocks(void) { u32 journal_blocks = DIV_ROUND_UP(info.len, info.block_size) / 64; if (journal_blocks < 1024) @@ -252,17 +273,17 @@ static u32 compute_journal_blocks() return journal_blocks; } -static u32 compute_blocks_per_group() +static u32 compute_blocks_per_group(void) { return info.block_size * 8; } -static u32 compute_inodes() +static u32 compute_inodes(void) { return DIV_ROUND_UP(info.len, info.block_size) / 4; } -static u32 compute_inodes_per_group() +static u32 compute_inodes_per_group(void) { u32 blocks = DIV_ROUND_UP(info.len, info.block_size); u32 block_groups = DIV_ROUND_UP(blocks, info.blocks_per_group); @@ -277,7 +298,7 @@ static u32 compute_inodes_per_group() return inodes; } -static u32 compute_bg_desc_reserve_blocks() +static u32 compute_bg_desc_reserve_blocks(void) { u32 blocks = DIV_ROUND_UP(info.len, info.block_size); u32 block_groups = DIV_ROUND_UP(blocks, info.blocks_per_group); @@ -367,12 +388,8 @@ int make_ext4fs_internal(int fd, const char *_directory, if (setjmp(setjmp_env)) return EXIT_FAILURE; /* Handle a call to longjmp() */ - if (_directory == NULL) { - fprintf(stderr, "Need a source directory\n"); - return EXIT_FAILURE; - } - - directory = canonicalize_rel_slashes(_directory); + if (_directory) + directory = canonicalize_rel_slashes(_directory); if (info.len <= 0) info.len = get_file_size(fd); @@ -457,11 +474,15 @@ int make_ext4fs_internal(int fd, const char *_directory, if (info.feat_compat & EXT4_FEATURE_COMPAT_RESIZE_INODE) ext4_create_resize_inode(); - root_inode_num = build_directory_structure(directory, "", 0, - fs_config_func, verbose, fixed_time); + if (directory) + root_inode_num = build_directory_structure(directory, "", 0, + fs_config_func, verbose, fixed_time); + else + root_inode_num = build_default_directory_structure(fixed_time); root_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; - inode_set_permissions(root_inode_num, root_mode, 0, 0, 0); + inode_set_permissions(root_inode_num, root_mode, 0, 0, + (fixed_time != 1) ? fixed_time : 0); ext4_update_free();