>From 9c352098046374d02edc3cf067c75d5474a94d2e Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Mon, 9 Apr 2012 23:30:58 +0200 Subject: [PATCH 2/3] 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. --- Makefile.am | 2 + src/util/atomic_io.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/util/atomic_io.h | 34 ++++++++++++++++++++++++++++ src/util/util.c | 38 ------------------------------- src/util/util.h | 7 +---- 5 files changed, 98 insertions(+), 43 deletions(-) create mode 100644 src/util/atomic_io.c create mode 100644 src/util/atomic_io.h diff --git a/Makefile.am b/Makefile.am index c62ea8c1c5d21cc7234a48d33d96bf54b540780c..919fb9b2516088ee5ad9daabd37a9d7d282aeb21 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/util/atomic_io.c b/src/util/atomic_io.c new file mode 100644 index 0000000000000000000000000000000000000000..469954d2ae25f27d53ee20b81f3ef1762213956e --- /dev/null +++ b/src/util/atomic_io.c @@ -0,0 +1,60 @@ +/* + Authors: + Jan Cholasta + + 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 . +*/ + +#include "util/atomic_io.h" + +/* based on code from libssh */ +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/atomic_io.h b/src/util/atomic_io.h new file mode 100644 index 0000000000000000000000000000000000000000..2558a76153cbe26acfddd43efdd53f50ec3200ac --- /dev/null +++ b/src/util/atomic_io.h @@ -0,0 +1,34 @@ +/* + Authors: + Jan Cholasta + + 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 . +*/ + +#ifndef __SSSD_ATOMIC_IO_H__ +#define __SSSD_ATOMIC_IO_H__ + +#include +#include +#include +#include + +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) + +#endif /* __SSSD_ATOMIC_IO_H__ */ diff --git a/src/util/util.c b/src/util/util.c index 3a6c5d270bf02d265f7dc0c772f51766105ecb94..f1aaebc28addf3e468136ba35b375883046bf8a1 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 */ -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 da6db1cffe36035f27c447b9971b4a8ba7b7f740..181e75166764057be093463c86c05b911b0488eb 100644 --- a/src/util/util.h +++ b/src/util/util.h @@ -42,6 +42,8 @@ #include #include +#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); -- 1.7.7.6