summaryrefslogtreecommitdiffstats
path: root/cmd
diff options
context:
space:
mode:
authorChris Dunlap <[email protected]>2014-04-08 15:31:36 -0700
committerBrian Behlendorf <[email protected]>2014-04-09 13:32:54 -0700
commit6ac770b1961b9468daf0c69eae6515c608535789 (patch)
tree073446e64b68d7fc66ccc0c015fc393be60c51c4 /cmd
parent7368eb621e6c94dd8fd37020568f32c120afabf9 (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')
-rw-r--r--cmd/zed/zed_conf.c19
-rw-r--r--cmd/zed/zed_file.c89
-rw-r--r--cmd/zed/zed_file.h2
3 files changed, 13 insertions, 97 deletions
diff --git a/cmd/zed/zed_conf.c b/cmd/zed/zed_conf.c
index fb3e552e9..78b45e910 100644
--- a/cmd/zed/zed_conf.c
+++ b/cmd/zed/zed_conf.c
@@ -29,6 +29,7 @@
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
+#include <libgen.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
@@ -435,6 +436,7 @@ int
zed_conf_write_pid(struct zed_conf *zcp)
{
char dirbuf[PATH_MAX];
+ mode_t dirmode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
int n;
char *p;
mode_t mask;
@@ -457,10 +459,12 @@ zed_conf_write_pid(struct zed_conf *zcp)
if (p)
*p = '\0';
- /* FIXME: Replace with mkdirp()? (lib/libspl/mkdirp.c) */
- if (zed_file_create_dirs(dirbuf) < 0)
+ if ((mkdirp(dirbuf, dirmode) < 0) && (errno != EEXIST)) {
+ zed_log_msg(LOG_WARNING,
+ "Failed to create directory \"%s\": %s",
+ dirbuf, strerror(errno));
return (-1);
-
+ }
(void) unlink(zcp->pid_file);
mask = umask(0);
@@ -494,6 +498,7 @@ int
zed_conf_open_state(struct zed_conf *zcp)
{
char dirbuf[PATH_MAX];
+ mode_t dirmode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
int n;
char *p;
int rv;
@@ -515,10 +520,12 @@ zed_conf_open_state(struct zed_conf *zcp)
if (p)
*p = '\0';
- /* FIXME: Replace with mkdirp()? (lib/libspl/mkdirp.c) */
- if (zed_file_create_dirs(dirbuf) < 0)
+ if ((mkdirp(dirbuf, dirmode) < 0) && (errno != EEXIST)) {
+ zed_log_msg(LOG_WARNING,
+ "Failed to create directory \"%s\": %s",
+ dirbuf, strerror(errno));
return (-1);
-
+ }
if (zcp->state_fd >= 0) {
if (close(zcp->state_fd) < 0) {
zed_log_msg(LOG_WARNING,
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);
-}
diff --git a/cmd/zed/zed_file.h b/cmd/zed/zed_file.h
index 6a31dc3d6..df7020182 100644
--- a/cmd/zed/zed_file.h
+++ b/cmd/zed/zed_file.h
@@ -44,6 +44,4 @@ void zed_file_close_from(int fd);
int zed_file_close_on_exec(int fd);
-int zed_file_create_dirs(const char *dir_name);
-
#endif /* !ZED_FILE_H */