summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/fileutils.h5
-rw-r--r--lib/fileutils.c24
2 files changed, 28 insertions, 1 deletions
diff --git a/include/fileutils.h b/include/fileutils.h
index 691429ba0..33aba0a0d 100644
--- a/include/fileutils.h
+++ b/include/fileutils.h
@@ -17,4 +17,7 @@ static inline FILE *xfmkstemp(char **tmpname)
}
return ret;
}
-#endif
+
+extern int get_fd_tabsize(void);
+
+#endif /* UTIL_LINUX_FILEUTILS */
diff --git a/lib/fileutils.c b/lib/fileutils.c
index 4849061bb..0d4656f11 100644
--- a/lib/fileutils.c
+++ b/lib/fileutils.c
@@ -6,6 +6,8 @@
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
#include "c.h"
#include "fileutils.h"
@@ -39,6 +41,28 @@ int xmkstemp(char **tmpname)
return fd;
}
+/*
+ * portable getdtablesize()
+ */
+int get_fd_tabsize(void)
+{
+ int m;
+
+#if defined(HAVE_GETDTABLESIZE)
+ m = getdtablesize();
+#elif defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)
+ struct rlimit rl;
+
+ getrlimit(RLIMIT_NOFILE, &rl);
+ m = rl.rlim_cur;
+#elif defined(HAVE_SYSCONF) && defined(_SC_OPEN_MAX)
+ m = sysconf(_SC_OPEN_MAX);
+#else
+ m = OPEN_MAX;
+#endif
+ return m;
+}
+
#ifdef TEST_PROGRAM
int main(void)
{