summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am6
-rw-r--r--src/sss_client/nss_mc_common.c19
-rw-r--r--src/tools/files.c70
-rw-r--r--src/util/io.c90
-rw-r--r--src/util/util.h3
5 files changed, 103 insertions, 85 deletions
diff --git a/Makefile.am b/Makefile.am
index 0554a367..e0756ea3 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -537,7 +537,8 @@ libsss_util_la_SOURCES = \
src/util/sss_selinux.c \
src/util/domain_info_utils.c \
src/util/util_lock.c \
- src/util/util_errors.c
+ src/util/util_errors.c \
+ src/util/io.c
libsss_util_la_LIBADD = \
$(SSSD_LIBS) \
$(UNICODE_LIBS) \
@@ -931,7 +932,8 @@ files_tests_CFLAGS = \
files_tests_LDADD = \
libsss_debug.la \
$(FILES_TESTS_LIBS) \
- libsss_test_common.la
+ libsss_test_common.la \
+ libsss_util.la
SSSD_RESOLV_TESTS_OBJ = \
$(SSSD_RESOLV_OBJ)
diff --git a/src/sss_client/nss_mc_common.c b/src/sss_client/nss_mc_common.c
index 78490bef..66442b71 100644
--- a/src/sss_client/nss_mc_common.c
+++ b/src/sss_client/nss_mc_common.c
@@ -31,6 +31,7 @@
#include <string.h>
#include <stdlib.h>
#include "nss_mc.h"
+#include "util/util.h"
/* FIXME: hook up to library destructor to avoid leaks */
/* FIXME: temporarily open passwd file on our own, later we will probably
@@ -100,12 +101,6 @@ errno_t sss_nss_check_header(struct sss_cli_mc_ctx *ctx)
return 0;
}
-#ifdef O_CLOEXEC
-#define SSS_MC_OPEN_FLAGS O_RDONLY|O_CLOEXEC
-#else
-#define SSS_MC_OPEN_FLAGS O_RDONLY
-#endif
-
errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx)
{
struct stat fdstat;
@@ -129,19 +124,9 @@ errno_t sss_nss_mc_get_ctx(const char *name, struct sss_cli_mc_ctx *ctx)
goto done;
}
- ctx->fd = open(file, SSS_MC_OPEN_FLAGS);
+ ctx->fd = sss_open_cloexec(file, O_RDONLY, &ret);
if (ctx->fd == -1) {
- ret = EIO;
goto done;
-#ifndef O_CLOEXEC
- } else {
- int v;
-
- v = fcntl(ctx->fd, F_GETFD, 0);
- /* we ignore an error, it's not fatal and there is nothing we
- * can do about it anyways */
- (void)fcntl(ctx->fd, F_SETFD, v | FD_CLOEXEC);
-#endif
}
ret = fstat(ctx->fd, &fdstat);
diff --git a/src/tools/files.c b/src/tools/files.c
index 57261729..10fd6fe4 100644
--- a/src/tools/files.c
+++ b/src/tools/files.c
@@ -75,68 +75,6 @@ struct copy_ctx {
gid_t gid;
};
-static int open_cloexec(const char *pathname, int flags, int *ret)
-{
- int fd;
- int oflags;
-
- oflags = flags;
-#ifdef O_CLOEXEC
- oflags |= O_CLOEXEC;
-#endif
-
- errno = 0;
- fd = open(pathname, oflags);
- if (fd == -1) {
- if (ret) {
- *ret = errno;
- }
- return -1;
- }
-
-#ifndef O_CLOEXEC
- int v;
-
- v = fcntl(fd, F_GETFD, 0);
- /* we ignore an error, it's not fatal and there is nothing we
- * can do about it anyways */
- (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC);
-#endif
-
- return fd;
-}
-
-static int openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret)
-{
- int fd;
- int oflags;
-
- oflags = flags;
-#ifdef O_CLOEXEC
- oflags |= O_CLOEXEC;
-#endif
-
- errno = 0;
- fd = openat(dir_fd, pathname, oflags);
- if (fd == -1) {
- if (ret) {
- *ret = errno;
- }
- return -1;
- }
-
-#ifndef O_CLOEXEC
- int v;
-
- v = fcntl(fd, F_GETFD, 0);
- /* we ignore an error, it's not fatal and there is nothing we
- * can do about it anyways */
- (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC);
-#endif
-
- return fd;
-}
-
static int sss_timeat_set(int dir_fd, const char *path,
const struct stat *statp,
int flags)
@@ -232,7 +170,7 @@ static int remove_tree_with_ctx(TALLOC_CTX *mem_ctx,
int ret, err;
int dir_fd;
- dir_fd = openat_cloexec(parent_fd, dir_name,
+ dir_fd = sss_openat_cloexec(parent_fd, dir_name,
O_RDONLY | O_DIRECTORY | O_NOFOLLOW, &ret);
if (dir_fd == -1) {
ret = errno;
@@ -607,7 +545,7 @@ copy_entry(struct copy_ctx *cctx,
* us against FIFOs and perhaps side-effects of the open() of a
* device file if there ever was one here, and doesn't matter
* for regular files or directories. */
- ifd = openat_cloexec(src_dir_fd, ent_name,
+ ifd = sss_openat_cloexec(src_dir_fd, ent_name,
O_RDONLY | O_NOFOLLOW | O_NONBLOCK, &ret);
if (ifd == -1 && ret != ELOOP) {
/* openat error */
@@ -721,7 +659,7 @@ copy_dir(struct copy_ctx *cctx,
goto done;
}
- dest_dir_fd = openat_cloexec(dest_parent_fd, dest_dir_name,
+ dest_dir_fd = sss_openat_cloexec(dest_parent_fd, dest_dir_name,
O_RDONLY | O_DIRECTORY | O_NOFOLLOW, &ret);
if (dest_dir_fd == -1) {
ret = errno;
@@ -807,7 +745,7 @@ int copy_tree(const char *src_root, const char *dst_root,
int fd = -1;
struct stat s_src;
- fd = open_cloexec(src_root, O_RDONLY | O_DIRECTORY, &ret);
+ fd = sss_open_cloexec(src_root, O_RDONLY | O_DIRECTORY, &ret);
if (fd == -1) {
goto fail;
}
diff --git a/src/util/io.c b/src/util/io.c
new file mode 100644
index 00000000..e07a18c5
--- /dev/null
+++ b/src/util/io.c
@@ -0,0 +1,90 @@
+/*
+ SSSD
+
+ compact.c
+
+ Authors:
+ Lukas Slebodnik <lslebodn@redhat.com>
+
+ Copyright (C) 2012 Red Hat
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "util/util.h"
+
+int sss_open_cloexec(const char *pathname, int flags, int *ret)
+{
+ int fd;
+ int oflags;
+
+ oflags = flags;
+#ifdef O_CLOEXEC
+ oflags |= O_CLOEXEC;
+#endif
+
+ errno = 0;
+ fd = open(pathname, oflags);
+ if (fd == -1) {
+ if (ret) {
+ *ret = errno;
+ }
+ return -1;
+ }
+
+#ifndef O_CLOEXEC
+ int v;
+
+ v = fcntl(fd, F_GETFD, 0);
+ /* we ignore an error, it's not fatal and there is nothing we
+ * can do about it anyways */
+ (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC);
+#endif
+
+ return fd;
+}
+
+int sss_openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret)
+{
+ int fd;
+ int oflags;
+
+ oflags = flags;
+#ifdef O_CLOEXEC
+ oflags |= O_CLOEXEC;
+#endif
+
+ errno = 0;
+ fd = openat(dir_fd, pathname, oflags);
+ if (fd == -1) {
+ if (ret) {
+ *ret = errno;
+ }
+ return -1;
+ }
+
+#ifndef O_CLOEXEC
+ int v;
+
+ v = fcntl(fd, F_GETFD, 0);
+ /* we ignore an error, it's not fatal and there is nothing we
+ * can do about it anyways */
+ (void)fcntl(fd, F_SETFD, v | FD_CLOEXEC);
+#endif
+
+ return fd;
+}
diff --git a/src/util/util.h b/src/util/util.h
index 8afb3bc9..d5ff9bb0 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -584,6 +584,9 @@ errno_t sssd_domain_init(TALLOC_CTX *mem_ctx,
/* from util_lock.c */
errno_t sss_br_lock_file(int fd, size_t start, size_t len,
int num_tries, useconds_t wait);
+/* from io.c */
+int sss_open_cloexec(const char *pathname, int flags, int *ret);
+int sss_openat_cloexec(int dir_fd, const char *pathname, int flags, int *ret);
/* Endianness-compatibility for systems running older versions of glibc */