#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
+#include <locale.h>
/* TODO: Not implemented:
Allocating blocks in the same block group as the file inode
return (strcmp(d->d_name, "..") && strcmp(d->d_name, "."));
}
-static u32 build_default_directory_structure(const char *dir_path)
-{
- u32 inode;
- u32 root_inode;
- struct dentry dentries = {
- .filename = "lost+found",
- .file_type = EXT4_FT_DIR,
- .mode = S_IRWXU,
- .uid = 0,
- .gid = 0,
- .mtime = 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
u32 dirs = 0;
bool needs_lost_and_found = false;
+ /* alphasort is locale-dependent; let's fix the locale to some sane value */
+ setlocale(LC_COLLATE, "C");
+
if (full_path) {
entries = scandir(full_path, &namelist, filter_dot, (void*)alphasort);
if (entries < 0) {
}
int make_ext4fs_internal(int fd, const char *_directory,
- const char *_mountpoint, fs_config_func_t fs_config_func, int gzip,
+ fs_config_func_t fs_config_func, int gzip,
int sparse, int crc, int wipe,
int verbose, time_t fixed_time,
FILE* block_list_file)
{
u32 root_inode_num;
u16 root_mode;
- char *mountpoint;
char *directory = NULL;
if (setjmp(setjmp_env))
return EXIT_FAILURE; /* Handle a call to longjmp() */
- if (_mountpoint == NULL) {
- mountpoint = strdup("");
- } else {
- mountpoint = canonicalize_abs_slashes(_mountpoint);
+ if (_directory == NULL) {
+ fprintf(stderr, "Need a source directory\n");
+ return EXIT_FAILURE;
}
- if (_directory) {
- directory = canonicalize_rel_slashes(_directory);
- }
+ directory = canonicalize_rel_slashes(_directory);
if (info.len <= 0)
info.len = get_file_size(fd);
printf(" Blocks: %"PRIu64"\n", aux_info.len_blocks);
printf(" Block groups: %d\n", aux_info.groups);
+ printf(" Reserved blocks: %"PRIu64"\n", (aux_info.len_blocks / 100) * info.reserve_pcnt);
printf(" Reserved block group size: %d\n", info.bg_desc_reserve_blocks);
ext4_sparse_file = sparse_file_new(info.block_size, info.len);
if (info.feat_compat & EXT4_FEATURE_COMPAT_RESIZE_INODE)
ext4_create_resize_inode();
- if (directory)
- root_inode_num = build_directory_structure(directory, mountpoint, 0,
- fs_config_func, verbose, fixed_time);
- else
- root_inode_num = build_default_directory_structure(mountpoint);
+ root_inode_num = build_directory_structure(directory, "", 0,
+ fs_config_func, verbose, 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);
ext4_queue_sb();
if (block_list_file) {
- size_t dirlen = directory ? strlen(directory) : 0;
+ size_t dirlen = strlen(directory);
struct block_allocation* p = get_saved_allocation_chain();
while (p) {
- if (directory && strncmp(p->filename, directory, dirlen) == 0) {
- // substitute mountpoint for the leading directory in the filename, in the output file
- fprintf(block_list_file, "%s%s", mountpoint, p->filename + dirlen);
+ if (strncmp(p->filename, directory, dirlen) == 0) {
+ fprintf(block_list_file, "%s", p->filename + dirlen);
} else {
fprintf(block_list_file, "%s", p->filename);
}
sparse_file_destroy(ext4_sparse_file);
ext4_sparse_file = NULL;
- free(mountpoint);
free(directory);
return 0;