diff options
author | Chris Dunlap <[email protected]> | 2014-04-08 15:31:36 -0700 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2014-04-09 13:32:54 -0700 |
commit | 6ac770b1961b9468daf0c69eae6515c608535789 (patch) | |
tree | 073446e64b68d7fc66ccc0c015fc393be60c51c4 /cmd/zed/zed_file.c | |
parent | 7368eb621e6c94dd8fd37020568f32c120afabf9 (diff) |
Replace zed_file_create_dirs() with mkdirp()
When processing directory components starting from the root dir,
zed_file_create_dirs() contained a bug in checking the return value of
mkdir(). A typo was made, and the test for (mkdir_errno != EEXIST) was
erroneously written as (mkdir_errno == EEXIST). If some of the leading
directory components already existed, this bug would cause the routine
to exit before creating the remaining directory components.
Instead of fixing the above mkdir_errno test, this commit replaces
zed_file_create_dirs() with mkdirp(). This cleanup was already
planned, and zed_file_create_dirs() only existed because I didn't
realize mkdirp() was already in tree at the time.
Signed-off-by: Chris Dunlap <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes #2248
Diffstat (limited to 'cmd/zed/zed_file.c')
-rw-r--r-- | cmd/zed/zed_file.c | 89 |
1 files changed, 0 insertions, 89 deletions
diff --git a/cmd/zed/zed_file.c b/cmd/zed/zed_file.c index d73e64976..7b77345d1 100644 --- a/cmd/zed/zed_file.c +++ b/cmd/zed/zed_file.c @@ -225,92 +225,3 @@ zed_file_close_on_exec(int fd) return (0); } - -/* - * Create the directory [dir_name] and any missing parent directories. - * Directories will be created with permissions 0755 modified by the umask. - * Return 0 on success, or -1 on error. - * FIXME: Deprecate in favor of mkdirp(). (lib/libspl/mkdirp.c) - */ -int -zed_file_create_dirs(const char *dir_name) -{ - struct stat st; - char dir_buf[PATH_MAX]; - mode_t dir_mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; - char *p; - - if ((dir_name == NULL) || (dir_name[0] == '\0')) { - zed_log_msg(LOG_WARNING, - "Failed to create directory: no directory specified"); - errno = EINVAL; - return (-1); - } - if (dir_name[0] != '/') { - zed_log_msg(LOG_WARNING, - "Failed to create directory \"%s\": not absolute path", - dir_name); - errno = EINVAL; - return (-1); - } - /* Check if directory already exists. */ - if (stat(dir_name, &st) == 0) { - if (S_ISDIR(st.st_mode)) - return (0); - - errno = EEXIST; - zed_log_msg(LOG_WARNING, - "Failed to create directory \"%s\": %s", - dir_name, strerror(errno)); - return (-1); - } - /* Create copy for modification. */ - if (strlen(dir_name) >= sizeof (dir_buf)) { - errno = ENAMETOOLONG; - zed_log_msg(LOG_WARNING, - "Failed to create directory \"%s\": %s", - dir_name, strerror(errno)); - return (-1); - } - strncpy(dir_buf, dir_name, sizeof (dir_buf)); - - /* Remove trailing slashes. */ - p = dir_buf + strlen(dir_buf) - 1; - while ((p > dir_buf) && (*p == '/')) - *p-- = '\0'; - - /* Process directory components starting from the root dir. */ - p = dir_buf; - - while (1) { - - /* Skip over adjacent slashes. */ - while (*p == '/') - p++; - - /* Advance to the next path component. */ - p = strchr(p, '/'); - if (p != NULL) - *p = '\0'; - - /* Create directory. */ - if (mkdir(dir_buf, dir_mode) < 0) { - - int mkdir_errno = errno; - - if ((mkdir_errno == EEXIST) || - (stat(dir_buf, &st) < 0) || - (!S_ISDIR(st.st_mode))) { - zed_log_msg(LOG_WARNING, - "Failed to create directory \"%s\": %s", - dir_buf, strerror(mkdir_errno)); - return (-1); - } - } - if (p == NULL) - break; - - *p++ = '/'; - } - return (0); -} |