]> err.no Git - util-linux/commitdiff
include: emulate dirfd when necessary
authorFabian Groffen <grobian@gentoo.org>
Fri, 21 Jan 2011 16:48:14 +0000 (17:48 +0100)
committerKarel Zak <kzak@redhat.com>
Sun, 23 Jan 2011 21:17:14 +0000 (22:17 +0100)
dirfd is not available on Solaris 10, it is available on latest
OpenSolaris releases though.  Do some autoconf trickery to determine if
providing an alternative dirfd function is necessary and possible.

shlibs/blkid/src/read.c: Do not define _XOPEN_SOURCE to 600, or DIR will
lose it's dd_fd member again.  Rearrange defines and includes to make
sense per comments, and not conflict on Solaris.

Signed-off-by: Fabian Groffen <grobian@gentoo.org>
configure.ac
include/c.h
shlibs/blkid/src/read.c

index 246afd4fd96f92232404ab9c18bb95d3dc87bca1..2aadacf5ee7a46606df2f64a275a494bede654a1 100644 (file)
@@ -224,6 +224,30 @@ AC_SEARCH_LIBS([socket], [socket],
        fi])
 AC_SUBST([SOCKET_LIBS])
 
+
+have_dirfd=no
+AC_CHECK_FUNCS([dirfd], [have_dirfd=yes], [have_dirfd=no])
+if test x"$have_dirfd" = xno ; then
+       AC_CHECK_DECLS([dirfd],
+               [have_dirfd=yes], [have_dirfd=no],
+               [#include <sys/types.h>
+                #include <dirent.h>])
+fi
+
+have_ddfd=no
+if test x"$have_dirfd" = xno ; then
+       AC_CHECK_MEMBERS([DIR.dd_fd],
+               [have_ddfd=yes], [have_ddfd=no],
+               [#include <sys/types.h>
+                #include <dirent.h>])
+fi
+
+case "$have_dirfd:$have_ddfd" in
+no:no)
+  AC_MSG_ERROR([cannot find a method to get filedescriptor of directory]) ;;
+esac
+
+
 dnl Static compilation
 m4_define([UTIL_STATIC_PROGRAMS], [losetup, mount, umount, fdisk, sfdisk, blkid])
 
index 83be3565c5b66760ef608557e1aab2bbd762afc7..b37c44224a2b2b389053348ea4a87234ee218791 100644 (file)
@@ -73,5 +73,14 @@ static inline __attribute__((const)) int is_power_of_2(unsigned long num)
 typedef int64_t loff_t;
 #endif
 
+#if !defined(HAVE_DIRFD) && (!defined(HAVE_DECL_DIRFD) || HAVE_DECL_DIRFD == 0) && defined(HAVE_DIR_DD_FD)
+#include <sys/types.h>
+#include <dirent.h>
+static inline int dirfd(DIR *d)
+{
+       return d->dd_fd;
+}
+#endif
+
 
 #endif /* UTIL_LINUX_C_H */
index e6aa083682dbffab18e80ce840e9bc2e1d81b3dd..3ff9ebe9f63da84f623bfbcd6c04c649ea7aeb1f 100644 (file)
@@ -10,7 +10,6 @@
  * %End-Header%
  */
 
-#define _XOPEN_SOURCE 600 /* for inclusion of strtoull */
 
 #include <stdio.h>
 #include <ctype.h>
 
 #include "blkidP.h"
 
+#if HAVE_STDLIB_H
+# ifndef _XOPEN_SOURCE
+#  define _XOPEN_SOURCE 600    /* for inclusion of strtoull */
+# endif
+# include <stdlib.h>
+#endif
+
 #ifdef HAVE_STRTOULL
 #define STRTOULL strtoull /* defined in stdlib.h if you try hard enough */
 #else
 #define STRTOULL strtoul
 #endif
 
-#if HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-
 #ifdef TEST_PROGRAM
 #define blkid_debug_dump_dev(dev)      (debug_dump_dev(dev))
 static void debug_dump_dev(blkid_dev dev);