blob: c9e7826ebc2f9adb5c024e37b8eca88b4881a797 [file] [log] [blame]
/* gstdioprivate.h - Private GLib stdio functions
*
* Copyright 2017 Руслан Ижбулатов
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __G_STDIOPRIVATE_H__
#define __G_STDIOPRIVATE_H__
G_BEGIN_DECLS
#if defined (G_OS_WIN32)
typedef struct _gtimespec {
guint64 tv_sec;
guint32 tv_nsec;
} gtimespec;
struct _GWin32PrivateStat
{
guint32 volume_serial;
guint64 file_index;
guint64 attributes;
guint64 allocated_size;
guint32 reparse_tag;
guint32 st_dev;
guint32 st_ino;
guint16 st_mode;
guint16 st_uid;
guint16 st_gid;
guint32 st_nlink;
guint64 st_size;
gtimespec st_ctim;
gtimespec st_atim;
gtimespec st_mtim;
};
typedef struct _GWin32PrivateStat GWin32PrivateStat;
int g_win32_stat_utf8 (const gchar *filename,
GWin32PrivateStat *buf);
int g_win32_lstat_utf8 (const gchar *filename,
GWin32PrivateStat *buf);
int g_win32_readlink_utf8 (const gchar *filename,
gchar *buf,
gsize buf_size,
gchar **alloc_buf,
gboolean terminate);
int g_win32_fstat (int fd,
GWin32PrivateStat *buf);
#endif
/* The POSIX standard specifies that if close() fails with EINTR the
* file descriptor may or may not be in fact closed. Since another
* thread might have already reused the FD if it was in fact closed
* either a test of FD to ensure that it's closed nor a second
* call to close() may indicate the wrong FD, so the error must be
* ignored.
*
* However, since Mac OS X 10.5 (Leopard) Apple provdes a hidden
* implementation of close that doesn't allow another thread
* to cancel the close so it never fails with EINTR.
*
* The official way to enable this is to set __DARWIN_NON_CANCELABLE
* in the build, but that applies to all system calls, not just
* close(). Following Chromium's example (see
* https://chromium.googlesource.com/chromium/src/base/+/refs/heads/main/mac/close_nocancel.cc )
* we choose to expose and use the hidden close variant only.
*/
#ifdef __APPLE__
#include <sys/cdefs.h>
#include <unistd.h>
# if !__DARWIN_NON_CANCELABLE
# if !__DARWIN_ONLY_UNIX_CONFORMANCE
# define close close$NOCANCEL$UNIX2003
int close$NOCANCEL$UNIX2003 (int fd);
# else
# define close close$NOCANCEL
int close$NOCANCEL (int fd);
# endif
# endif
#endif
G_END_DECLS
#endif /* __G_STDIOPRIVATE_H__ */