mirror of https://gitee.com/openkylin/glib2.0.git
104 lines
3.2 KiB
C
104 lines
3.2 KiB
C
/* 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__ */
|