summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-04-06 21:53:02 +0200
committerLennart Poettering <lennart@poettering.net>2010-04-06 21:53:02 +0200
commit3a0ecb08f4b3bfa84ff3d04bc7816730df35139e (patch)
tree6cb44bd45ec986f75dd6913695be7d235a6db5f9
parent7418040c3ada8c57c436b2a2ff44fb490f6781f7 (diff)
util: implement fd_nonbloc()/fd_cloexec()
-rw-r--r--util.c39
-rw-r--r--util.h3
2 files changed, 42 insertions, 0 deletions
diff --git a/util.c b/util.c
index 9da7d985fa..4ae57bbd65 100644
--- a/util.c
+++ b/util.c
@@ -32,6 +32,7 @@
#include <linux/sched.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <fcntl.h>
#include "macro.h"
#include "util.h"
@@ -1084,6 +1085,44 @@ bool ignore_file(const char *filename) {
endswith(filename, ".swp");
}
+int fd_nonblock(int fd, bool nonblock) {
+ int flags;
+
+ assert(fd >= 0);
+
+ if ((flags = fcntl(fd, F_GETFL, 0)) < 0)
+ return -errno;
+
+ if (nonblock)
+ flags |= O_NONBLOCK;
+ else
+ flags &= ~O_NONBLOCK;
+
+ if (fcntl(fd, F_SETFL, flags) < 0)
+ return -errno;
+
+ return 0;
+}
+
+int fd_cloexec(int fd, bool cloexec) {
+ int flags;
+
+ assert(fd >= 0);
+
+ if ((flags = fcntl(fd, F_GETFD, 0)) < 0)
+ return -errno;
+
+ if (cloexec)
+ flags |= FD_CLOEXEC;
+ else
+ flags &= ~FD_CLOEXEC;
+
+ if (fcntl(fd, F_SETFD, flags) < 0)
+ return -errno;
+
+ return 0;
+}
+
static const char *const ioprio_class_table[] = {
[IOPRIO_CLASS_NONE] = "none",
[IOPRIO_CLASS_RT] = "realtime",
diff --git a/util.h b/util.h
index 9f9bca86f2..772d7ae9ff 100644
--- a/util.h
+++ b/util.h
@@ -172,6 +172,9 @@ bool ignore_file(const char *filename);
struct __useless_struct_to_allow_trailing_semicolon__
+int fd_nonblock(int fd, bool nonblock);
+int fd_cloexec(int fd, bool cloexec);
+
const char *ioprio_class_to_string(int i);
int ioprio_class_from_string(const char *s);