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