[lvm-devel] master - dmeventd: open fifo in one function
Zdenek Kabelac
zkabelac at fedoraproject.org
Mon Nov 9 09:28:05 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2c8d6f5c90d5be62b48ba2881f2a6631091dc5af
Commit: 2c8d6f5c90d5be62b48ba2881f2a6631091dc5af
Parent: e1b111b02accb4145b82b8b47ce57ed93b1a7184
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sat Nov 7 21:12:15 2015 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Nov 9 10:18:53 2015 +0100
dmeventd: open fifo in one function
Put calls related to fifo opening into a single function.
Fix Time-Of-Check-Time-Of-Use and use fstat()
and fchmod() on already opened fd instead of
checking first path and then risking to open something
different.
---
daemons/dmeventd/dmeventd.c | 85 ++++++++++++++++++++-----------------------
1 files changed, 40 insertions(+), 45 deletions(-)
diff --git a/daemons/dmeventd/dmeventd.c b/daemons/dmeventd/dmeventd.c
index 42c724b..6c04c1b 100644
--- a/daemons/dmeventd/dmeventd.c
+++ b/daemons/dmeventd/dmeventd.c
@@ -1355,78 +1355,73 @@ static int _get_timeout(struct message_data *message_data)
return (msg->data && msg->size) ? 0 : -ENOMEM;
}
-/* Open fifos used for client communication. */
-static int _open_fifos(struct dm_event_fifos *fifos)
+static int _open_fifo(const char *path)
{
struct stat st;
+ int fd = -1;
- /* Create client fifo. */
- (void) dm_prepare_selinux_context(fifos->client_path, S_IFIFO);
- if ((mkfifo(fifos->client_path, 0600) == -1) && errno != EEXIST) {
- log_sys_error("client mkfifo", fifos->client_path);
- (void) dm_prepare_selinux_context(NULL, 0);
- goto fail;
- }
-
- /* Create server fifo. */
- (void) dm_prepare_selinux_context(fifos->server_path, S_IFIFO);
- if ((mkfifo(fifos->server_path, 0600) == -1) && errno != EEXIST) {
- log_sys_error("server mkfifo", fifos->server_path);
+ /* Create fifo. */
+ (void) dm_prepare_selinux_context(path, S_IFIFO);
+ if ((mkfifo(path, 0600) == -1) && errno != EEXIST) {
+ log_sys_error("mkfifo", path);
(void) dm_prepare_selinux_context(NULL, 0);
goto fail;
}
(void) dm_prepare_selinux_context(NULL, 0);
- /* Warn about wrong permissions if applicable */
- if ((!stat(fifos->client_path, &st)) && (st.st_mode & 0777) != 0600)
- log_warn("WARNING: Fixing wrong permissions on %s: %s.\n",
- fifos->client_path, strerror(errno));
-
- if ((!stat(fifos->server_path, &st)) && (st.st_mode & 0777) != 0600)
- log_warn("WARNING: Fixing wrong permissions on %s: %s.\n",
- fifos->server_path, strerror(errno));
-
- /* If they were already there, make sure permissions are ok. */
- if (chmod(fifos->client_path, 0600)) {
- log_sys_error("chmod", fifos->client_path);
+ /* Need to open read+write or we will block or fail */
+ if ((fd = open(path, O_RDWR)) < 0) {
+ log_sys_error("open", path);
goto fail;
}
- if (chmod(fifos->server_path, 0600)) {
- log_sys_error("chmod", fifos->server_path);
+ /* Warn about wrong permissions if applicable */
+ if (fstat(fd, &st)) {
+ log_sys_error("fstat", path);
goto fail;
}
- /* Need to open read+write or we will block or fail */
- if ((fifos->server = open(fifos->server_path, O_RDWR)) < 0) {
- log_sys_error("server open", fifos->server_path);
- goto fail;
+ if ((st.st_mode & 0777) != 0600) {
+ log_warn("WARNING: Fixing wrong permissions on %s: %s.",
+ path, strerror(errno));
+
+ if (fchmod(fd, 0600)) {
+ log_sys_error("fchmod", path);
+ goto fail;
+ }
}
- if (fcntl(fifos->server, F_SETFD, FD_CLOEXEC) < 0) {
- log_sys_error("fcntl(FD_CLOEXEC)", fifos->server_path);
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC)) {
+ log_sys_error("fcntl(FD_CLOEXEC)", path);
goto fail;
}
- /* Need to open read+write for select() to work. */
- if ((fifos->client = open(fifos->client_path, O_RDWR)) < 0) {
- log_sys_error("client open", fifos->client_path);
+ return fd;
+
+fail:
+ if ((fd >= 0) && close(fd))
+ log_sys_error("close", path);
+
+ return -1;
+}
+
+/* Open fifos used for client communication. */
+static int _open_fifos(struct dm_event_fifos *fifos)
+{
+ /* Create client fifo. */
+ if ((fifos->client = _open_fifo(fifos->client_path)) < 0)
goto fail;
- }
- if (fcntl(fifos->client, F_SETFD, FD_CLOEXEC) < 0) {
- log_sys_error("fcntl(FD_CLOEXEC)", fifos->client_path);
+ /* Create server fifo. */
+ if ((fifos->server = _open_fifo(fifos->server_path)) < 0)
goto fail;
- }
return 1;
-fail:
- if (fifos->server >= 0 && close(fifos->server))
- log_sys_error("server close", fifos->server_path);
+fail:
if (fifos->client >= 0 && close(fifos->client))
- log_sys_error("client close", fifos->client_path);
+ log_sys_error("close", fifos->client_path);
return 0;
}
More information about the lvm-devel
mailing list