diff --git a/cmd/zed/zed_conf.c b/cmd/zed/zed_conf.c index fb3e552e91c9..78b45e910982 100644 --- a/cmd/zed/zed_conf.c +++ b/cmd/zed/zed_conf.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -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 d73e64976f65..7b77345d1dd3 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 6a31dc3d628b..df7020182abf 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 */