105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* fstat() replacement.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2011-2012 Free Software Foundation, Inc.
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   it under the terms of the GNU General Public License as published by
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation; either version 3 of the License, or
705436638acc7c010349a69c3395f1a57c642dc62Ying Wang   (at your option) any later version.
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is distributed in the hope that it will be useful,
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   but WITHOUT ANY WARRANTY; without even the implied warranty of
1105436638acc7c010349a69c3395f1a57c642dc62Ying Wang   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   GNU General Public License for more details.
1305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   You should have received a copy of the GNU General Public License
1505436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* If the user's config.h happens to include <sys/stat.h>, let it include only
1805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the system's <sys/stat.h> here, so that orig_fstat doesn't recurse to
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   rpl_fstat.  */
2005436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define __need_system_sys_stat_h
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
2305436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Get the original definition of fstat.  It might be defined as a macro.  */
2405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <sys/types.h>
2505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <sys/stat.h>
2605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if _GL_WINDOWS_64_BIT_ST_SIZE
2705436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef stat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */
2805436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define stat _stati64
2905436638acc7c010349a69c3395f1a57c642dc62Ying Wang# undef fstat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */
3005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define fstat _fstati64
3105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
3205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#undef __need_system_sys_stat_h
3305436638acc7c010349a69c3395f1a57c642dc62Ying Wang
3405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wangorig_fstat (int fd, struct stat *buf)
3605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
3705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return fstat (fd, buf);
3805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
3905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4005436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Specification.  */
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang/* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
4205436638acc7c010349a69c3395f1a57c642dc62Ying Wang   eliminates this include because of the preliminary #include <sys/stat.h>
4305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   above.  */
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include "sys/stat.h"
4505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <errno.h>
4705436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <unistd.h>
4805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang# include "msvc-inval.h"
5105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
5205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if HAVE_MSVC_INVALID_PARAMETER_HANDLER
5405436638acc7c010349a69c3395f1a57c642dc62Ying Wangstatic int
5505436638acc7c010349a69c3395f1a57c642dc62Ying Wangfstat_nothrow (int fd, struct stat *buf)
5605436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
5705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  int result;
5805436638acc7c010349a69c3395f1a57c642dc62Ying Wang
5905436638acc7c010349a69c3395f1a57c642dc62Ying Wang  TRY_MSVC_INVAL
6005436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
6105436638acc7c010349a69c3395f1a57c642dc62Ying Wang      result = orig_fstat (fd, buf);
6205436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
6305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  CATCH_MSVC_INVAL
6405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    {
6505436638acc7c010349a69c3395f1a57c642dc62Ying Wang      result = -1;
6605436638acc7c010349a69c3395f1a57c642dc62Ying Wang      errno = EBADF;
6705436638acc7c010349a69c3395f1a57c642dc62Ying Wang    }
6805436638acc7c010349a69c3395f1a57c642dc62Ying Wang  DONE_MSVC_INVAL;
6905436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return result;
7105436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
7205436638acc7c010349a69c3395f1a57c642dc62Ying Wang#else
7305436638acc7c010349a69c3395f1a57c642dc62Ying Wang# define fstat_nothrow orig_fstat
7405436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
7505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
7605436638acc7c010349a69c3395f1a57c642dc62Ying Wangint
7705436638acc7c010349a69c3395f1a57c642dc62Ying Wangrpl_fstat (int fd, struct stat *buf)
7805436638acc7c010349a69c3395f1a57c642dc62Ying Wang{
7905436638acc7c010349a69c3395f1a57c642dc62Ying Wang#if REPLACE_FCHDIR && REPLACE_OPEN_DIRECTORY
8005436638acc7c010349a69c3395f1a57c642dc62Ying Wang  /* Handle the case when rpl_open() used a dummy file descriptor to work
8105436638acc7c010349a69c3395f1a57c642dc62Ying Wang     around an open() that can't normally visit directories.  */
8205436638acc7c010349a69c3395f1a57c642dc62Ying Wang  const char *name = _gl_directory_name (fd);
8305436638acc7c010349a69c3395f1a57c642dc62Ying Wang  if (name != NULL)
8405436638acc7c010349a69c3395f1a57c642dc62Ying Wang    return stat (name, buf);
8505436638acc7c010349a69c3395f1a57c642dc62Ying Wang#endif
8605436638acc7c010349a69c3395f1a57c642dc62Ying Wang
8705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  return fstat_nothrow (fd, buf);
8805436638acc7c010349a69c3395f1a57c642dc62Ying Wang}
89