summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2012-04-09 23:30:58 +0200
committerStephen Gallagher <sgallagh@redhat.com>2012-04-20 10:55:14 -0400
commit9959c512ac3ba36f7a0db7614f0357ce0bae748f (patch)
tree43d9baf2288bb7ea9eee6af7910b7f60c17fc54f
parente3c99ae355408933b03357220f3db09423bd40dd (diff)
downloadsssd-9959c512ac3ba36f7a0db7614f0357ce0bae748f.tar.gz
sssd-9959c512ac3ba36f7a0db7614f0357ce0bae748f.tar.xz
sssd-9959c512ac3ba36f7a0db7614f0357ce0bae748f.zip
Move atomic io function to a separate module
We'll be using it on various places of the SSSD. The function is in its own file to allow using just the one piece without having to drag in the whole util.c module.
-rw-r--r--Makefile.am2
-rw-r--r--src/tests/util-tests.c18
-rw-r--r--src/util/atomic_io.c60
-rw-r--r--src/util/atomic_io.h40
-rw-r--r--src/util/util.c38
-rw-r--r--src/util/util.h7
6 files changed, 113 insertions, 52 deletions
diff --git a/Makefile.am b/Makefile.am
index c62ea8c1c..919fb9b25 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -332,6 +332,7 @@ dist_noinst_HEADERS = \
src/util/user_info_msg.h \
src/util/murmurhash3.h \
src/util/mmap_cache.h \
+ src/util/atomic_io.h \
src/monitor/monitor.h \
src/monitor/monitor_interfaces.h \
src/responder/common/responder.h \
@@ -449,6 +450,7 @@ libsss_util_la_SOURCES = \
src/util/sss_utf8.c \
src/util/sss_tc_utf8.c \
src/util/murmurhash3.c \
+ src/util/atomic_io.c \
src/util/sss_selinux.c
libsss_util_la_LIBADD = \
$(SSSD_LIBS) \
diff --git a/src/tests/util-tests.c b/src/tests/util-tests.c
index 9e39a4cbd..59c80ca6f 100644
--- a/src/tests/util-tests.c
+++ b/src/tests/util-tests.c
@@ -495,7 +495,7 @@ START_TEST(test_atomicio_read_from_file)
fail_if(fd == -1, "Cannot open /dev/zero");
errno = 0;
- numread = sss_atomic_read(fd, buf, bufsize);
+ numread = sss_atomic_read_s(fd, buf, bufsize);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
@@ -517,7 +517,7 @@ START_TEST(test_atomicio_read_from_small_file)
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
- numwritten = sss_atomic_write(atio_fd, wbuf, wsize);
+ numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
@@ -528,7 +528,7 @@ START_TEST(test_atomicio_read_from_small_file)
lseek(atio_fd, 0, SEEK_SET);
errno = 0;
- numread = sss_atomic_read(atio_fd, rbuf, 64);
+ numread = sss_atomic_read_s(atio_fd, rbuf, 64);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
@@ -550,7 +550,7 @@ START_TEST(test_atomicio_read_from_large_file)
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
- numwritten = sss_atomic_write(atio_fd, wbuf, wsize);
+ numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
@@ -563,7 +563,7 @@ START_TEST(test_atomicio_read_from_large_file)
total = 0;
do {
errno = 0;
- numread = sss_atomic_read(atio_fd, rbuf, 8);
+ numread = sss_atomic_read_s(atio_fd, rbuf, 8);
ret = errno;
fail_if(numread == -1, "Read error %d: %s\n", ret, strerror(ret));
@@ -588,7 +588,7 @@ START_TEST(test_atomicio_read_exact_sized_file)
fail_if(atio_fd < 0, "No fd to test?\n");
errno = 0;
- numwritten = sss_atomic_write(atio_fd, wbuf, wsize);
+ numwritten = sss_atomic_write_s(atio_fd, wbuf, wsize);
ret = errno;
fail_unless(ret == 0, "Error %d while writing\n", ret);
@@ -599,7 +599,7 @@ START_TEST(test_atomicio_read_exact_sized_file)
lseek(atio_fd, 0, SEEK_SET);
errno = 0;
- numread = sss_atomic_read(atio_fd, rbuf, 9);
+ numread = sss_atomic_read_s(atio_fd, rbuf, 9);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
@@ -611,7 +611,7 @@ START_TEST(test_atomicio_read_exact_sized_file)
/* We've reached end-of-file, next read must return 0 */
errno = 0;
- numread = sss_atomic_read(atio_fd, rbuf, 9);
+ numread = sss_atomic_read_s(atio_fd, rbuf, 9);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
@@ -630,7 +630,7 @@ START_TEST(test_atomicio_read_from_empty_file)
fail_if(fd == -1, "Cannot open /dev/null");
errno = 0;
- numread = sss_atomic_read(fd, buf, 64);
+ numread = sss_atomic_read_s(fd, buf, 64);
ret = errno;
fail_unless(ret == 0, "Error %d while reading\n", ret);
diff --git a/src/util/atomic_io.c b/src/util/atomic_io.c
new file mode 100644
index 000000000..1543af9a0
--- /dev/null
+++ b/src/util/atomic_io.c
@@ -0,0 +1,60 @@
+/*
+ Authors:
+ Jan Cholasta <jcholast@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 "util/atomic_io.h"
+
+/* based on code from libssh <http://www.libssh.org> */
+ssize_t sss_atomic_io_s(int fd, void *buf, size_t n, bool do_read)
+{
+ char *b = buf;
+ size_t pos = 0;
+ ssize_t res;
+ struct pollfd pfd;
+
+ pfd.fd = fd;
+ pfd.events = do_read ? POLLIN : POLLOUT;
+
+ while (n > pos) {
+ if (do_read) {
+ res = read(fd, b + pos, n - pos);
+ } else {
+ res = write(fd, b + pos, n - pos);
+ }
+ switch (res) {
+ case -1:
+ if (errno == EINTR) {
+ continue;
+ }
+ if (errno == EAGAIN || errno == EWOULDBLOCK) {
+ (void) poll(&pfd, 1, -1);
+ continue;
+ }
+ return -1;
+ case 0:
+ /* read returns 0 on end-of-file */
+ errno = do_read ? 0 : EPIPE;
+ return pos;
+ default:
+ pos += (size_t) res;
+ }
+ }
+
+ return pos;
+}
diff --git a/src/util/atomic_io.h b/src/util/atomic_io.h
new file mode 100644
index 000000000..ffae31d6c
--- /dev/null
+++ b/src/util/atomic_io.h
@@ -0,0 +1,40 @@
+/*
+ Authors:
+ Jan Cholasta <jcholast@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/>.
+*/
+
+#ifndef __SSSD_ATOMIC_IO_H__
+#define __SSSD_ATOMIC_IO_H__
+
+#include <unistd.h>
+#include <stdbool.h>
+#include <poll.h>
+#include <errno.h>
+
+/* Performs a read or write operation in an manner that is seemingly atomic
+ * to the caller.
+ *
+ * Please note that the function does not perform any asynchronous operation
+ * so the operation might potentially block
+ */
+ssize_t sss_atomic_io_s(int fd, void *buf, size_t n, bool do_read);
+
+#define sss_atomic_read_s(fd, buf, n) sss_atomic_io_s(fd, buf, n, true)
+#define sss_atomic_write_s(fd, buf, n) sss_atomic_io_s(fd, buf, n, false)
+
+#endif /* __SSSD_ATOMIC_IO_H__ */
diff --git a/src/util/util.c b/src/util/util.c
index 3a6c5d270..f1aaebc28 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -611,41 +611,3 @@ void to_sized_string(struct sized_string *out, const char *in)
}
}
-/* based on code from libssh <http://www.libssh.org> */
-ssize_t sss_atomic_io(int fd, void *buf, size_t n, bool do_read)
-{
- char *b = buf;
- size_t pos = 0;
- ssize_t res;
- struct pollfd pfd;
-
- pfd.fd = fd;
- pfd.events = do_read ? POLLIN : POLLOUT;
-
- while (n > pos) {
- if (do_read) {
- res = read(fd, b + pos, n - pos);
- } else {
- res = write(fd, b + pos, n - pos);
- }
- switch (res) {
- case -1:
- if (errno == EINTR) {
- continue;
- }
- if (errno == EAGAIN || errno == EWOULDBLOCK) {
- (void) poll(&pfd, 1, -1);
- continue;
- }
- return -1;
- case 0:
- /* read returns 0 on end-of-file */
- errno = do_read ? 0 : EPIPE;
- return pos;
- default:
- pos += (size_t) res;
- }
- }
-
- return pos;
-}
diff --git a/src/util/util.h b/src/util/util.h
index da6db1cff..181e75166 100644
--- a/src/util/util.h
+++ b/src/util/util.h
@@ -42,6 +42,8 @@
#include <ldb.h>
#include <dhash.h>
+#include "util/atomic_io.h"
+
#ifndef HAVE_ERRNO_T
#define HAVE_ERRNO_T
typedef int errno_t;
@@ -510,11 +512,6 @@ errno_t sss_filter_sanitize(TALLOC_CTX *mem_ctx,
char *
sss_escape_ip_address(TALLOC_CTX *mem_ctx, int family, const char *addr);
-ssize_t sss_atomic_io(int fd, void *buf, size_t n, bool do_read);
-
-#define sss_atomic_read(fd, buf, n) sss_atomic_io(fd, buf, n, true)
-#define sss_atomic_write(fd, buf, n) sss_atomic_io(fd, buf, n, false)
-
/* from sss_tc_utf8.c */
char *
sss_tc_utf8_str_tolower(TALLOC_CTX *mem_ctx, const char *s);