diff options
author | Eric Blake <ebb9@byu.net> | 2009-11-11 13:22:04 -0700 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2009-11-11 19:24:33 -0700 |
commit | 08166afd7322d40407cf62e3c98b97782d7d1af0 (patch) | |
tree | c0f0f5df081d95147345bb7c95906b98e3c3ba62 /m4 | |
parent | dfd4d11c50dd4729bf46c26a3bbdda0c6031409d (diff) | |
download | gnulib-08166afd7322d40407cf62e3c98b97782d7d1af0.tar.gz |
mkfifo: new module
Solaris 9 mkfifo("name/",mode) mistakenly creates "name".
FreeBSD 7.2 mkfifo("dangling/",mode) mistakenly creates a fifo
at the target of "dangling". Mingw lacks named pipes altogether,
but this at least avoids link failures.
* modules/mkfifo: New file.
* m4/mkfifo.m4 (gl_FUNC_MKFIFO): Likewise.
* lib/mkfifo.c (mkfifo): Likewise.
* m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Set witness
defaults.
* modules/sys_stat (Makefile.am): Substitute them.
* lib/sys_stat.in.h (mkfifo): Declare replacement.
* MODULES.html.sh (Support for systems lacking POSIX:2008):
Document it.
* doc/posix-functions/mkfifo.texi (mkfifo): Likewise.
* modules/mkfifo-tests: New test.
* tests/test-mkfifo.h (test_mkfifo): New file, borrowed in part
from test-mkfifoat.c.
* tests/test-mkfifo.c: New file.
Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'm4')
-rw-r--r-- | m4/mkfifo.m4 | 45 | ||||
-rw-r--r-- | m4/sys_stat_h.m4 | 5 |
2 files changed, 49 insertions, 1 deletions
diff --git a/m4/mkfifo.m4 b/m4/mkfifo.m4 new file mode 100644 index 0000000000..fc8044ea39 --- /dev/null +++ b/m4/mkfifo.m4 @@ -0,0 +1,45 @@ +# serial 1 +# See if we need to provide mkfifo replacement. + +dnl Copyright (C) 2009 Free Software Foundation, Inc. +dnl This file is free software; the Free Software Foundation +dnl gives unlimited permission to copy and/or distribute it, +dnl with or without modifications, as long as this notice is preserved. + +# Written by Eric Blake. + +AC_DEFUN([gl_FUNC_MKFIFO], +[ + AC_REQUIRE([gl_SYS_STAT_H_DEFAULTS]) + AC_CHECK_FUNCS_ONCE([mkfifo]) + if test $ac_cv_func_mkfifo = no; then + HAVE_MKFIFO=0 + AC_LIBOBJ([mkfifo]) + else + dnl Check for Solaris 9 and FreeBSD bug with trailing slash. + AC_CHECK_FUNCS_ONCE([lstat]) + AC_CACHE_CHECK([whether mkfifo rejects trailing slashes], + [gl_cv_func_mkfifo_works], + [# Assume that if we have lstat, we can also check symlinks. + if test $ac_cv_func_lstat = yes; then + ln -s conftest.tmp conftest.lnk + fi + AC_RUN_IFELSE( + [AC_LANG_PROGRAM( + [[#include <sys/stat.h> +]], [[if (!mkfifo ("conftest.tmp/", 0600)) return 1; +#if HAVE_LSTAT + if (!mkfifo ("conftest.lnk/", 0600)) return 2; +#endif + ]])], + [gl_cv_func_mkfifo_works=yes], [gl_cv_func_mkfifo_works=no], + [gl_cv_func_mkfifo_works="guessing no"]) + rm -f conftest.tmp conftest.lnk]) + if test "$gl_cv_func_mkfifo_works" != yes; then + AC_DEFINE([MKFIFO_TRAILING_SLASH_BUG], [1], [Define to 1 if mkfifo + does not reject trailing slash]) + REPLACE_MKFIFO=1 + AC_LIBOBJ([mkfifo]) + fi + fi +]) diff --git a/m4/sys_stat_h.m4 b/m4/sys_stat_h.m4 index 1edf54834c..e864866458 100644 --- a/m4/sys_stat_h.m4 +++ b/m4/sys_stat_h.m4 @@ -1,4 +1,4 @@ -# sys_stat_h.m4 serial 19 -*- Autoconf -*- +# sys_stat_h.m4 serial 20 -*- Autoconf -*- dnl Copyright (C) 2006-2009 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -45,6 +45,7 @@ AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], GNULIB_LCHMOD=0; AC_SUBST([GNULIB_LCHMOD]) GNULIB_LSTAT=0; AC_SUBST([GNULIB_LSTAT]) GNULIB_MKDIRAT=0; AC_SUBST([GNULIB_MKDIRAT]) + GNULIB_MKFIFO=0; AC_SUBST([GNULIB_MKFIFO]) GNULIB_MKFIFOAT=0; AC_SUBST([GNULIB_MKFIFOAT]) GNULIB_MKNODAT=0; AC_SUBST([GNULIB_MKNODAT]) GNULIB_STAT=0; AC_SUBST([GNULIB_STAT]) @@ -56,6 +57,7 @@ AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], HAVE_LCHMOD=1; AC_SUBST([HAVE_LCHMOD]) HAVE_LSTAT=1; AC_SUBST([HAVE_LSTAT]) HAVE_MKDIRAT=1; AC_SUBST([HAVE_MKDIRAT]) + HAVE_MKFIFO=1; AC_SUBST([HAVE_MKFIFO]) HAVE_MKFIFOAT=1; AC_SUBST([HAVE_MKFIFOAT]) HAVE_MKNODAT=1; AC_SUBST([HAVE_MKNODAT]) HAVE_UTIMENSAT=1; AC_SUBST([HAVE_UTIMENSAT]) @@ -64,6 +66,7 @@ AC_DEFUN([gl_SYS_STAT_H_DEFAULTS], REPLACE_FUTIMENS=0; AC_SUBST([REPLACE_FUTIMENS]) REPLACE_LSTAT=0; AC_SUBST([REPLACE_LSTAT]) REPLACE_MKDIR=0; AC_SUBST([REPLACE_MKDIR]) + REPLACE_MKFIFO=0; AC_SUBST([REPLACE_MKFIFO]) REPLACE_STAT=0; AC_SUBST([REPLACE_STAT]) REPLACE_UTIMENSAT=0; AC_SUBST([REPLACE_UTIMENSAT]) ]) |