Mercurial > hg > octave-lojdl > gnulib-hg
changeset 10201:270b7afb8fb7
Work around open() bug on HP-UX 11 and Solaris 9.
author | Bruno Haible <bruno@clisp.org> |
---|---|
date | Thu, 12 Jun 2008 02:17:36 +0200 |
parents | 3a2bf9fb3efb |
children | 4d972085fd3a |
files | ChangeLog doc/posix-functions/open.texi lib/open.c m4/open.m4 tests/test-open.c |
diffstat | 5 files changed, 66 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-06-11 Bruno Haible <bruno@clisp.org> + + * m4/open.m4 (gl_FUNC_OPEN): Add test against trailing slash bug. + * lib/open.c: Include errno.h. + (open): Fail when attempting to write to a file that has a trailing + slash. + * tests/test-open.c (main): Test against trailing slash bug. + * doc/posix-functions/open.texi: Mention the trailing slash bug. + 2008-06-10 Bruno Haible <bruno@clisp.org> * tests/test-vc-list-files-git.sh: Make double use of 'exit'. Needed
--- a/doc/posix-functions/open.texi +++ b/doc/posix-functions/open.texi @@ -9,6 +9,10 @@ Portability problems fixed by Gnulib: @itemize @item +This function does not fail when the file name argument ends in a slash +and (without the slash) names a nonexistent file, on some platforms: +HP-UX 11.00, Solaris 9. +@item On Windows platforms (excluding Cygwin), this function does usually not recognize the @file{/dev/null} filename. @end itemize
--- a/lib/open.c +++ b/lib/open.c @@ -1,5 +1,5 @@ /* Open a descriptor to a file. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007-2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ /* If the fchdir replacement is used, open() is defined in fchdir.c. */ #ifndef FCHDIR_REPLACEMENT +# include <errno.h> # include <stdarg.h> # include <string.h> # include <sys/types.h> @@ -51,6 +52,18 @@ va_end (arg); } +# if OPEN_TRAILING_SLASH_BUG + if (flags & (O_CREAT | O_WRONLY | O_RDWR)) + { + size_t len = strlen (filename); + if (len > 0 && filename[len - 1] == '/') + { + errno = EISDIR; + return -1; + } + } +# endif + # if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ if (strcmp (filename, "/dev/null") == 0) filename = "NUL";
--- a/m4/open.m4 +++ b/m4/open.m4 @@ -1,5 +1,5 @@ -# open.m4 serial 1 -dnl Copyright (C) 2007 Free Software Foundation, Inc. +# open.m4 serial 2 +dnl Copyright (C) 2007-2008 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. @@ -13,5 +13,40 @@ REPLACE_OPEN=1 AC_LIBOBJ([open]) ;; + *) + dnl open("foo/") should not create a file when the file name has a + dnl trailing slash. + AC_CACHE_CHECK([whether open recognizes a trailing slash], + [gl_cv_func_open_slash], + [ + AC_TRY_RUN([ +#include <fcntl.h> +#if HAVE_UNISTD_H +# include <unistd.h> +#endif +int main () +{ + return open ("conftest.sl/", O_CREAT, 0600) >= 0; +}], [gl_cv_func_open_slash=yes], [gl_cv_func_open_slash=no], + [ +changequote(,)dnl + case "$host_os" in + solaris2.[0-9]*) gl_cv_func_open_slash="guessing no" ;; + hpux*) gl_cv_func_open_slash="guessing no" ;; + *) gl_cv_func_open_slash="guessing yes" ;; + esac +changequote([,])dnl + ]) + rm -f conftest.sl + ]) + case "$gl_cv_func_open_slash" in + *no) + AC_DEFINE([OPEN_TRAILING_SLASH_BUG], 1, + [Define to 1 if open() fails to recognize a trailing slash.]) + REPLACE_OPEN=1 + AC_LIBOBJ([open]) + ;; + esac + ;; esac ])