diff options
author | Colin Cross <ccross@android.com> | 2012-12-20 01:00:33 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2012-12-20 12:26:29 -0800 |
commit | a4460149a5fadc639dbb708c332a75f9717c12d6 (patch) | |
tree | 3c11e19933e2f68dfd2d9f777fbfe060eb256356 /ext4_utils | |
parent | 0078f358ee79245e87fa8f5fc32ce30887f08357 (diff) | |
download | extras-a4460149a5fadc639dbb708c332a75f9717c12d6.tar.gz |
ext4_utils: canonicalize slashes in paths
Simplify handling of slashes between directories in paths by
forcing them to have leading and trailing slashes as appropriate
when passed in to make_ext4fs, and then keeping all directory
paths with a trailing slash.
As a side effect, using "/" as the mountpoint is now supported.
Change-Id: I73fe709c26003a20b0bdf6504db16cc9e39edf9b
Diffstat (limited to 'ext4_utils')
-rw-r--r-- | ext4_utils/make_ext4fs.c | 88 | ||||
-rw-r--r-- | ext4_utils/make_ext4fs_main.c | 4 |
2 files changed, 61 insertions, 31 deletions
diff --git a/ext4_utils/make_ext4fs.c b/ext4_utils/make_ext4fs.c index 97cd26f0..c3e242a4 100644 --- a/ext4_utils/make_ext4fs.c +++ b/ext4_utils/make_ext4fs.c @@ -97,7 +97,12 @@ static u32 build_default_directory_structure() #ifndef USE_MINGW /* Read a local directory and create the same tree in the generated filesystem. - Calls itself recursively with each directory in the given directory */ + Calls itself recursively with each directory in the given directory. + full_path is an absolute or relative path, with a trailing slash, to the + directory on disk that should be copied, or NULL if this is a directory + that does not exist on disk (e.g. lost+found). + dir_path is an absolute path, with trailing slash, to the same directory + if the image were mounted at the specified mount point */ static u32 build_directory_structure(const char *full_path, const char *dir_path, u32 dir_inode, fs_config_func_t fs_config_func, struct selabel_handle *sehnd) @@ -139,8 +144,8 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path if (dentries[i].filename == NULL) critical_error_errno("strdup"); - asprintf(&dentries[i].path, "%s/%s", dir_path, namelist[i]->d_name); - asprintf(&dentries[i].full_path, "%s/%s", full_path, namelist[i]->d_name); + asprintf(&dentries[i].path, "%s%s", dir_path, namelist[i]->d_name); + asprintf(&dentries[i].full_path, "%s%s", full_path, namelist[i]->d_name); free(namelist[i]); @@ -171,17 +176,14 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path } #ifndef USE_MINGW if (sehnd) { - char *sepath = NULL; - asprintf(&sepath, "/%s", dentries[i].path); - if (selabel_lookup(sehnd, &dentries[i].secon, sepath, stat.st_mode) < 0) { - error("cannot lookup security context for %s", sepath); + if (selabel_lookup(sehnd, &dentries[i].secon, dentries[i].path, stat.st_mode) < 0) { + error("cannot lookup security context for %s", dentries[i].path); } #if 0 // TODO make this a debug flag if (dentries[i].secon) - printf("Labeling %s as %s\n", sepath, dentries[i].secon); + printf("Labeling %s as %s\n", dentries[i].path, dentries[i].secon); #endif - free(sepath); } #endif @@ -218,7 +220,7 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path dentries = tmp; dentries[0].filename = strdup("lost+found"); - asprintf(&dentries[0].path, "%s/lost+found", dir_path); + asprintf(&dentries[0].path, "%slost+found", dir_path); dentries[0].full_path = NULL; dentries[0].size = 0; dentries[0].mode = S_IRWXU; @@ -226,11 +228,8 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path dentries[0].uid = 0; dentries[0].gid = 0; if (sehnd) { - char *sepath = NULL; - asprintf(&sepath, "/%s", dentries[0].path); - if (selabel_lookup(sehnd, &dentries[0].secon, sepath, dentries[0].mode) < 0) + if (selabel_lookup(sehnd, &dentries[0].secon, dentries[0].path, dentries[0].mode) < 0) error("cannot lookup security context for %s", dentries[0].path); - free(sepath); } entries++; dirs++; @@ -242,8 +241,20 @@ static u32 build_directory_structure(const char *full_path, const char *dir_path if (dentries[i].file_type == EXT4_FT_REG_FILE) { entry_inode = make_file(dentries[i].full_path, dentries[i].size); } else if (dentries[i].file_type == EXT4_FT_DIR) { - entry_inode = build_directory_structure(dentries[i].full_path, - dentries[i].path, inode, fs_config_func, sehnd); + char *subdir_full_path = NULL; + char *subdir_dir_path; + if (dentries[i].full_path) { + ret = asprintf(&subdir_full_path, "%s/", dentries[i].full_path); + if (ret < 0) + critical_error_errno("asprintf"); + } + ret = asprintf(&subdir_dir_path, "%s/", dentries[i].path); + if (ret < 0) + critical_error_errno("asprintf"); + entry_inode = build_directory_structure(subdir_full_path, + subdir_dir_path, inode, fs_config_func, sehnd); + free(subdir_full_path); + free(subdir_dir_path); } else if (dentries[i].file_type == EXT4_FT_SYMLINK) { entry_inode = make_link(dentries[i].full_path, dentries[i].link); } else { @@ -363,17 +374,41 @@ int make_ext4fs(const char *filename, s64 len, return status; } -int make_ext4fs_internal(int fd, const char *directory, - const char *mountpoint, fs_config_func_t fs_config_func, int gzip, +int make_ext4fs_internal(int fd, const char *_directory, + const char *_mountpoint, fs_config_func_t fs_config_func, int gzip, int sparse, int crc, int wipe, int init_itabs, struct selabel_handle *sehnd) { u32 root_inode_num; u16 root_mode; + char *mountpoint; + char *directory = NULL; + int ret; if (setjmp(setjmp_env)) return EXIT_FAILURE; /* Handle a call to longjmp() */ + if (_mountpoint == NULL) { + mountpoint = strdup(""); + } else if (_mountpoint[0] == '\0') { + mountpoint = strdup("/"); + } else { + ret = asprintf(&mountpoint, "%s%s%s", + _mountpoint[0] == '/' ? "" : "/", + _mountpoint, + _mountpoint[strlen(_mountpoint) - 1] == '/' ? "" : "/"); + if (ret < 0) + critical_error_errno("asprintf"); + } + + if (_directory) { + ret = asprintf(&directory, "%s%s", + _directory, + _directory[strlen(_directory) - 1] == '/' ? "" : "/"); + if (ret < 0) + critical_error_errno("asprintf"); + } + if (info.len <= 0) info.len = get_file_size(fd); @@ -471,23 +506,15 @@ int make_ext4fs_internal(int fd, const char *directory, #ifndef USE_MINGW if (sehnd) { - char *sepath = NULL; char *secontext = NULL; - if (mountpoint[0] == '/') - sepath = strdup(mountpoint); - else - asprintf(&sepath, "/%s", mountpoint); - if (!sepath) - critical_error_errno("malloc"); - if (selabel_lookup(sehnd, &secontext, sepath, S_IFDIR) < 0) { - error("cannot lookup security context for %s", sepath); + if (selabel_lookup(sehnd, &secontext, mountpoint, S_IFDIR) < 0) { + error("cannot lookup security context for %s", mountpoint); } if (secontext) { - printf("Labeling %s as %s\n", sepath, secontext); + printf("Labeling %s as %s\n", mountpoint, secontext); inode_set_selinux(root_inode_num, secontext); } - free(sepath); freecon(secontext); } #endif @@ -513,5 +540,8 @@ int make_ext4fs_internal(int fd, const char *directory, sparse_file_destroy(info.sparse_file); info.sparse_file = NULL; + free(mountpoint); + free(directory); + return 0; } diff --git a/ext4_utils/make_ext4fs_main.c b/ext4_utils/make_ext4fs_main.c index 000b857d..8381f204 100644 --- a/ext4_utils/make_ext4fs_main.c +++ b/ext4_utils/make_ext4fs_main.c @@ -52,7 +52,7 @@ int main(int argc, char **argv) int opt; const char *filename = NULL; const char *directory = NULL; - char *mountpoint = ""; + char *mountpoint = NULL; fs_config_func_t fs_config_func = NULL; int gzip = 0; int sparse = 0; @@ -138,7 +138,7 @@ int main(int argc, char **argv) #if !defined(HOST) // Use only if -S option not requested - if (!sehnd && mountpoint[0] != '\0') { + if (!sehnd && mountpoint) { sehnd = selinux_android_file_context_handle(); if (!sehnd) { |