X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Ffcntl.c;h=d6a328c1c01b409f667a6b020a79404ffdd81b55;hb=368777cd04f76f7a3b242006fdf6c1e6b77381de;hp=05d73a94fb7a4b20ca2d41947a5c8f271b0498fa;hpb=021c8619190757f535c72ad5cdb1d624e19620d6;p=gnulib.git diff --git a/lib/fcntl.c b/lib/fcntl.c index 05d73a94f..d6a328c1c 100644 --- a/lib/fcntl.c +++ b/lib/fcntl.c @@ -1,6 +1,6 @@ /* Provide file descriptor control. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009-2011 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 @@ -25,6 +25,7 @@ #include #include #include +#include #if !HAVE_FCNTL # define rpl_fcntl fcntl @@ -186,7 +187,21 @@ rpl_fcntl (int fd, int action, /* arg */...) errno = EINVAL; else { + /* Haiku alpha 2 loses fd flags on original. */ + int flags = fcntl (fd, F_GETFD); + if (flags < 0) + { + result = -1; + break; + } result = fcntl (fd, action, target); + if (0 <= result && fcntl (fd, F_SETFD, flags) == -1) + { + int saved_errno = errno; + close (result); + result = -1; + errno = saved_errno; + } # if REPLACE_FCHDIR if (0 <= result) result = _gl_register_dup (fd, result);