make_ext4fs: Remove off64_t in favor of standard off_t
[project/make_ext4fs.git] / make_ext4fs.c
index 553b066..bf5f49f 100644 (file)
@@ -33,6 +33,7 @@
 #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
@@ -44,23 +45,23 @@ static int filter_dot(const struct dirent *d)
        return (strcmp(d->d_name, "..") && strcmp(d->d_name, "."));
 }
 
-static u32 build_default_directory_structure(const char *dir_path)
+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 = 0,
+               .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);
+               dentries.uid, dentries.gid, dentries.mtime);
 
        return root_inode;
 }
@@ -87,6 +88,9 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path
        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) {
@@ -372,28 +376,20 @@ static char *canonicalize_rel_slashes(const char *str)
 }
 
 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) {
+       if (_directory)
                directory = canonicalize_rel_slashes(_directory);
-       }
 
        if (info.len <= 0)
                info.len = get_file_size(fd);
@@ -460,6 +456,7 @@ int make_ext4fs_internal(int fd, const char *_directory,
 
        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);
@@ -478,25 +475,25 @@ int make_ext4fs_internal(int fd, const char *_directory,
                ext4_create_resize_inode();
 
        if (directory)
-               root_inode_num = build_directory_structure(directory, mountpoint, 0,
+               root_inode_num = build_directory_structure(directory, "", 0,
                        fs_config_func, verbose, fixed_time);
        else
-               root_inode_num = build_default_directory_structure(mountpoint);
+               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();
 
        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);
                        }
@@ -522,7 +519,6 @@ int make_ext4fs_internal(int fd, const char *_directory,
        sparse_file_destroy(ext4_sparse_file);
        ext4_sparse_file = NULL;
 
-       free(mountpoint);
        free(directory);
 
        return 0;