chiark / gitweb /
util: implement fd_nonbloc()/fd_cloexec()
authorLennart Poettering <lennart@poettering.net>
Tue, 6 Apr 2010 19:53:02 +0000 (21:53 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 6 Apr 2010 19:53:02 +0000 (21:53 +0200)
util.c
util.h

diff --git a/util.c b/util.c
index 9da7d98..4ae57bb 100644 (file)
--- 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 9f9bca8..772d7ae 100644 (file)
--- 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);