Coverage Report

Created: 2025-07-01 07:09

/src/glib/gio/glocalfileinfo.h
Line
Count
Source (jump to first uncovered line)
1
/* GIO - GLib Input, Output and Streaming Library
2
 *
3
 * Copyright (C) 2006-2007 Red Hat, Inc.
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2.1 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General
16
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
17
 *
18
 * Author: Alexander Larsson <alexl@redhat.com>
19
 */
20
21
#ifndef __G_LOCAL_FILE_INFO_H__
22
#define __G_LOCAL_FILE_INFO_H__
23
24
/* Needed for statx() */
25
#ifndef _GNU_SOURCE
26
#define _GNU_SOURCE
27
#endif
28
29
#include <fcntl.h>
30
#include <gio/gfileinfo.h>
31
#include <gio/gfile.h>
32
#include <glib/glib-private.h>
33
#include <glib/gstdio.h>
34
#include <glib/gstdioprivate.h>
35
#include <sys/stat.h>
36
#include <sys/types.h>
37
38
#ifdef HAVE_STATX
39
#include <sys/sysmacros.h>
40
#endif
41
42
G_BEGIN_DECLS
43
44
typedef struct
45
{
46
  gboolean writable;
47
  gboolean is_sticky;
48
  gboolean has_trash_dir;
49
  /* owner should be uid_t but it breaks compliance with MS-Windows */
50
  int      owner;
51
  dev_t    device;
52
  ino_t    inode;
53
  gpointer extra_data;
54
  GDestroyNotify free_extra_data;
55
} GLocalParentFileInfo;
56
57
#ifdef HAVE_STATX
58
0
#define GLocalFileStat struct statx
59
60
typedef enum
61
{
62
  G_LOCAL_FILE_STAT_FIELD_TYPE = STATX_TYPE,
63
  G_LOCAL_FILE_STAT_FIELD_MODE = STATX_MODE,
64
  G_LOCAL_FILE_STAT_FIELD_NLINK = STATX_NLINK,
65
  G_LOCAL_FILE_STAT_FIELD_UID = STATX_UID,
66
  G_LOCAL_FILE_STAT_FIELD_GID = STATX_GID,
67
  G_LOCAL_FILE_STAT_FIELD_ATIME = STATX_ATIME,
68
  G_LOCAL_FILE_STAT_FIELD_MTIME = STATX_MTIME,
69
  G_LOCAL_FILE_STAT_FIELD_CTIME = STATX_CTIME,
70
  G_LOCAL_FILE_STAT_FIELD_INO = STATX_INO,
71
  G_LOCAL_FILE_STAT_FIELD_SIZE = STATX_SIZE,
72
  G_LOCAL_FILE_STAT_FIELD_BLOCKS = STATX_BLOCKS,
73
  G_LOCAL_FILE_STAT_FIELD_BTIME = STATX_BTIME,
74
} GLocalFileStatField;
75
76
0
#define G_LOCAL_FILE_STAT_FIELD_BASIC_STATS STATX_BASIC_STATS
77
0
#define G_LOCAL_FILE_STAT_FIELD_ALL STATX_ALL
78
79
static inline int
80
g_local_file_statx (int                  dirfd,
81
                    const char          *pathname,
82
                    int                  flags,
83
                    GLocalFileStatField  mask,
84
                    GLocalFileStatField  mask_required,
85
                    GLocalFileStat      *stat_buf)
86
0
{
87
0
  int retval;
88
89
  /* Allow the caller to set mask_required==G_LOCAL_FILE_STAT_FIELD_ALL as a
90
   * shortcut for saying it’s equal to @mask. */
91
0
  mask_required &= mask;
92
93
0
  retval = statx (dirfd, pathname, flags, mask, stat_buf);
94
0
  if (retval == 0 && (stat_buf->stx_mask & mask_required) != mask_required)
95
0
    {
96
      /* Not all required fields could be returned. */
97
0
      errno = ERANGE;
98
0
      return -1;
99
0
    }
100
101
0
  return retval;
102
0
}
Unexecuted instantiation: glocalfile.c:g_local_file_statx
Unexecuted instantiation: glocalfileenumerator.c:g_local_file_statx
Unexecuted instantiation: glocalfileinfo.c:g_local_file_statx
Unexecuted instantiation: glocalfileinputstream.c:g_local_file_statx
Unexecuted instantiation: glocalfileoutputstream.c:g_local_file_statx
Unexecuted instantiation: glocalfileiostream.c:g_local_file_statx
Unexecuted instantiation: thumbnail-verify.c:g_local_file_statx
103
104
static inline int
105
g_local_file_fstat (int                  fd,
106
                    GLocalFileStatField  mask,
107
                    GLocalFileStatField  mask_required,
108
                    GLocalFileStat      *stat_buf)
109
0
{
110
0
  return g_local_file_statx (fd, "", AT_EMPTY_PATH, mask, mask_required, stat_buf);
111
0
}
Unexecuted instantiation: glocalfile.c:g_local_file_fstat
Unexecuted instantiation: glocalfileenumerator.c:g_local_file_fstat
Unexecuted instantiation: glocalfileinfo.c:g_local_file_fstat
Unexecuted instantiation: glocalfileinputstream.c:g_local_file_fstat
Unexecuted instantiation: glocalfileoutputstream.c:g_local_file_fstat
Unexecuted instantiation: glocalfileiostream.c:g_local_file_fstat
Unexecuted instantiation: thumbnail-verify.c:g_local_file_fstat
112
113
static inline int
114
g_local_file_fstatat (int                  fd,
115
                      const char          *path,
116
                      int                  flags,
117
                      GLocalFileStatField  mask,
118
                      GLocalFileStatField  mask_required,
119
                      GLocalFileStat      *stat_buf)
120
0
{
121
0
  return g_local_file_statx (fd, path, flags, mask, mask_required, stat_buf);
122
0
}
Unexecuted instantiation: glocalfile.c:g_local_file_fstatat
Unexecuted instantiation: glocalfileenumerator.c:g_local_file_fstatat
Unexecuted instantiation: glocalfileinfo.c:g_local_file_fstatat
Unexecuted instantiation: glocalfileinputstream.c:g_local_file_fstatat
Unexecuted instantiation: glocalfileoutputstream.c:g_local_file_fstatat
Unexecuted instantiation: glocalfileiostream.c:g_local_file_fstatat
Unexecuted instantiation: thumbnail-verify.c:g_local_file_fstatat
123
124
static inline int
125
g_local_file_lstat (const char          *path,
126
                    GLocalFileStatField  mask,
127
                    GLocalFileStatField  mask_required,
128
                    GLocalFileStat      *stat_buf)
129
0
{
130
0
  return g_local_file_statx (AT_FDCWD, path,
131
0
                             AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW | AT_STATX_SYNC_AS_STAT,
132
0
                             mask, mask_required, stat_buf);
133
0
}
Unexecuted instantiation: glocalfile.c:g_local_file_lstat
Unexecuted instantiation: glocalfileenumerator.c:g_local_file_lstat
Unexecuted instantiation: glocalfileinfo.c:g_local_file_lstat
Unexecuted instantiation: glocalfileinputstream.c:g_local_file_lstat
Unexecuted instantiation: glocalfileoutputstream.c:g_local_file_lstat
Unexecuted instantiation: glocalfileiostream.c:g_local_file_lstat
Unexecuted instantiation: thumbnail-verify.c:g_local_file_lstat
134
135
static inline int
136
g_local_file_stat (const char          *path,
137
                   GLocalFileStatField  mask,
138
                   GLocalFileStatField  mask_required,
139
                   GLocalFileStat      *stat_buf)
140
0
{
141
0
  return g_local_file_statx (AT_FDCWD, path,
142
0
                             AT_NO_AUTOMOUNT | AT_STATX_SYNC_AS_STAT,
143
0
                             mask, mask_required, stat_buf);
144
0
}
Unexecuted instantiation: glocalfile.c:g_local_file_stat
Unexecuted instantiation: glocalfileenumerator.c:g_local_file_stat
Unexecuted instantiation: glocalfileinfo.c:g_local_file_stat
Unexecuted instantiation: glocalfileinputstream.c:g_local_file_stat
Unexecuted instantiation: glocalfileoutputstream.c:g_local_file_stat
Unexecuted instantiation: glocalfileiostream.c:g_local_file_stat
Unexecuted instantiation: thumbnail-verify.c:g_local_file_stat
145
146
0
inline static gboolean _g_stat_has_field  (const GLocalFileStat *buf, GLocalFileStatField field) { return buf->stx_mask & field; }
Unexecuted instantiation: glocalfile.c:_g_stat_has_field
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_has_field
Unexecuted instantiation: glocalfileinfo.c:_g_stat_has_field
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_has_field
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_has_field
Unexecuted instantiation: glocalfileiostream.c:_g_stat_has_field
Unexecuted instantiation: thumbnail-verify.c:_g_stat_has_field
147
148
0
inline static guint16 _g_stat_mode        (const GLocalFileStat *buf) { return buf->stx_mode; }
Unexecuted instantiation: glocalfile.c:_g_stat_mode
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_mode
Unexecuted instantiation: glocalfileinfo.c:_g_stat_mode
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_mode
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_mode
Unexecuted instantiation: glocalfileiostream.c:_g_stat_mode
Unexecuted instantiation: thumbnail-verify.c:_g_stat_mode
149
0
inline static guint32 _g_stat_nlink       (const GLocalFileStat *buf) { return buf->stx_nlink; }
Unexecuted instantiation: glocalfile.c:_g_stat_nlink
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_nlink
Unexecuted instantiation: glocalfileinfo.c:_g_stat_nlink
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_nlink
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_nlink
Unexecuted instantiation: glocalfileiostream.c:_g_stat_nlink
Unexecuted instantiation: thumbnail-verify.c:_g_stat_nlink
150
0
inline static dev_t   _g_stat_dev         (const GLocalFileStat *buf) { return makedev (buf->stx_dev_major, buf->stx_dev_minor); }
Unexecuted instantiation: glocalfile.c:_g_stat_dev
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_dev
Unexecuted instantiation: glocalfileinfo.c:_g_stat_dev
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_dev
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_dev
Unexecuted instantiation: glocalfileiostream.c:_g_stat_dev
Unexecuted instantiation: thumbnail-verify.c:_g_stat_dev
151
0
inline static guint64 _g_stat_ino         (const GLocalFileStat *buf) { return buf->stx_ino; }
Unexecuted instantiation: glocalfile.c:_g_stat_ino
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_ino
Unexecuted instantiation: glocalfileinfo.c:_g_stat_ino
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_ino
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_ino
Unexecuted instantiation: glocalfileiostream.c:_g_stat_ino
Unexecuted instantiation: thumbnail-verify.c:_g_stat_ino
152
0
inline static guint64 _g_stat_size        (const GLocalFileStat *buf) { return buf->stx_size; }
Unexecuted instantiation: glocalfile.c:_g_stat_size
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_size
Unexecuted instantiation: glocalfileinfo.c:_g_stat_size
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_size
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_size
Unexecuted instantiation: glocalfileiostream.c:_g_stat_size
Unexecuted instantiation: thumbnail-verify.c:_g_stat_size
153
154
0
inline static guint32 _g_stat_uid         (const GLocalFileStat *buf) { return buf->stx_uid; }
Unexecuted instantiation: glocalfile.c:_g_stat_uid
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_uid
Unexecuted instantiation: glocalfileinfo.c:_g_stat_uid
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_uid
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_uid
Unexecuted instantiation: glocalfileiostream.c:_g_stat_uid
Unexecuted instantiation: thumbnail-verify.c:_g_stat_uid
155
0
inline static guint32 _g_stat_gid         (const GLocalFileStat *buf) { return buf->stx_gid; }
Unexecuted instantiation: glocalfile.c:_g_stat_gid
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_gid
Unexecuted instantiation: glocalfileinfo.c:_g_stat_gid
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_gid
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_gid
Unexecuted instantiation: glocalfileiostream.c:_g_stat_gid
Unexecuted instantiation: thumbnail-verify.c:_g_stat_gid
156
0
inline static dev_t   _g_stat_rdev        (const GLocalFileStat *buf) { return makedev (buf->stx_rdev_major, buf->stx_rdev_minor); }
Unexecuted instantiation: glocalfile.c:_g_stat_rdev
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_rdev
Unexecuted instantiation: glocalfileinfo.c:_g_stat_rdev
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_rdev
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_rdev
Unexecuted instantiation: glocalfileiostream.c:_g_stat_rdev
Unexecuted instantiation: thumbnail-verify.c:_g_stat_rdev
157
0
inline static guint32 _g_stat_blksize     (const GLocalFileStat *buf) { return buf->stx_blksize; }
Unexecuted instantiation: glocalfile.c:_g_stat_blksize
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_blksize
Unexecuted instantiation: glocalfileinfo.c:_g_stat_blksize
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_blksize
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_blksize
Unexecuted instantiation: glocalfileiostream.c:_g_stat_blksize
Unexecuted instantiation: thumbnail-verify.c:_g_stat_blksize
158
159
0
inline static guint64 _g_stat_blocks      (const GLocalFileStat *buf) { return buf->stx_blocks; }
Unexecuted instantiation: glocalfile.c:_g_stat_blocks
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_blocks
Unexecuted instantiation: glocalfileinfo.c:_g_stat_blocks
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_blocks
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_blocks
Unexecuted instantiation: glocalfileiostream.c:_g_stat_blocks
Unexecuted instantiation: thumbnail-verify.c:_g_stat_blocks
160
161
0
inline static gint64  _g_stat_atime       (const GLocalFileStat *buf) { return buf->stx_atime.tv_sec; }
Unexecuted instantiation: glocalfile.c:_g_stat_atime
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_atime
Unexecuted instantiation: glocalfileinfo.c:_g_stat_atime
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_atime
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_atime
Unexecuted instantiation: glocalfileiostream.c:_g_stat_atime
Unexecuted instantiation: thumbnail-verify.c:_g_stat_atime
162
0
inline static gint64  _g_stat_ctime       (const GLocalFileStat *buf) { return buf->stx_ctime.tv_sec; }
Unexecuted instantiation: glocalfile.c:_g_stat_ctime
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_ctime
Unexecuted instantiation: glocalfileinfo.c:_g_stat_ctime
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_ctime
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_ctime
Unexecuted instantiation: glocalfileiostream.c:_g_stat_ctime
Unexecuted instantiation: thumbnail-verify.c:_g_stat_ctime
163
0
inline static gint64  _g_stat_mtime       (const GLocalFileStat *buf) { return buf->stx_mtime.tv_sec; }
Unexecuted instantiation: glocalfile.c:_g_stat_mtime
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_mtime
Unexecuted instantiation: glocalfileinfo.c:_g_stat_mtime
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_mtime
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_mtime
Unexecuted instantiation: glocalfileiostream.c:_g_stat_mtime
Unexecuted instantiation: thumbnail-verify.c:_g_stat_mtime
164
0
inline static guint32 _g_stat_atim_nsec   (const GLocalFileStat *buf) { return buf->stx_atime.tv_nsec; }
Unexecuted instantiation: glocalfile.c:_g_stat_atim_nsec
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_atim_nsec
Unexecuted instantiation: glocalfileinfo.c:_g_stat_atim_nsec
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_atim_nsec
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_atim_nsec
Unexecuted instantiation: glocalfileiostream.c:_g_stat_atim_nsec
Unexecuted instantiation: thumbnail-verify.c:_g_stat_atim_nsec
165
0
inline static guint32 _g_stat_ctim_nsec   (const GLocalFileStat *buf) { return buf->stx_ctime.tv_nsec; }
Unexecuted instantiation: glocalfile.c:_g_stat_ctim_nsec
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_ctim_nsec
Unexecuted instantiation: glocalfileinfo.c:_g_stat_ctim_nsec
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_ctim_nsec
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_ctim_nsec
Unexecuted instantiation: glocalfileiostream.c:_g_stat_ctim_nsec
Unexecuted instantiation: thumbnail-verify.c:_g_stat_ctim_nsec
166
0
inline static guint32 _g_stat_mtim_nsec   (const GLocalFileStat *buf) { return buf->stx_mtime.tv_nsec; }
Unexecuted instantiation: glocalfile.c:_g_stat_mtim_nsec
Unexecuted instantiation: glocalfileenumerator.c:_g_stat_mtim_nsec
Unexecuted instantiation: glocalfileinfo.c:_g_stat_mtim_nsec
Unexecuted instantiation: glocalfileinputstream.c:_g_stat_mtim_nsec
Unexecuted instantiation: glocalfileoutputstream.c:_g_stat_mtim_nsec
Unexecuted instantiation: glocalfileiostream.c:_g_stat_mtim_nsec
Unexecuted instantiation: thumbnail-verify.c:_g_stat_mtim_nsec
167
168
#else  /* if !HAVE_STATX */
169
170
#ifdef G_OS_WIN32
171
/* We want 64-bit file size, file ID and symlink support */
172
#define GLocalFileStat GWin32PrivateStat
173
#else
174
#define GLocalFileStat struct stat
175
#endif
176
177
/* If the system doesn’t have statx() support, emulate it using traditional
178
 * stat(). It supports fields %G_LOCAL_FILE_STAT_FIELD_BASIC_STATS only, and
179
 * always returns all of them. */
180
typedef enum
181
{
182
  G_LOCAL_FILE_STAT_FIELD_TYPE = (1 << 0),
183
  G_LOCAL_FILE_STAT_FIELD_MODE = (1 << 1),
184
  G_LOCAL_FILE_STAT_FIELD_NLINK = (1 << 2),
185
  G_LOCAL_FILE_STAT_FIELD_UID = (1 << 3),
186
  G_LOCAL_FILE_STAT_FIELD_GID = (1 << 4),
187
  G_LOCAL_FILE_STAT_FIELD_ATIME = (1 << 5),
188
  G_LOCAL_FILE_STAT_FIELD_MTIME = (1 << 6),
189
  G_LOCAL_FILE_STAT_FIELD_CTIME = (1 << 7),
190
  G_LOCAL_FILE_STAT_FIELD_INO = (1 << 8),
191
  G_LOCAL_FILE_STAT_FIELD_SIZE = (1 << 9),
192
  G_LOCAL_FILE_STAT_FIELD_BLOCKS = (1 << 10),
193
  G_LOCAL_FILE_STAT_FIELD_BTIME = (1 << 11),
194
} GLocalFileStatField;
195
196
#define G_LOCAL_FILE_STAT_FIELD_BASIC_STATS \
197
  (G_LOCAL_FILE_STAT_FIELD_TYPE | G_LOCAL_FILE_STAT_FIELD_MODE | \
198
   G_LOCAL_FILE_STAT_FIELD_NLINK | G_LOCAL_FILE_STAT_FIELD_UID | \
199
   G_LOCAL_FILE_STAT_FIELD_GID | G_LOCAL_FILE_STAT_FIELD_ATIME | \
200
   G_LOCAL_FILE_STAT_FIELD_MTIME | G_LOCAL_FILE_STAT_FIELD_CTIME | \
201
   G_LOCAL_FILE_STAT_FIELD_INO | G_LOCAL_FILE_STAT_FIELD_SIZE | \
202
   G_LOCAL_FILE_STAT_FIELD_BLOCKS)
203
#define G_LOCAL_FILE_STAT_FIELD_ALL (G_LOCAL_FILE_STAT_FIELD_BASIC_STATS | G_LOCAL_FILE_STAT_FIELD_BTIME)
204
205
static inline int
206
g_local_file_fstat (int                  fd,
207
                    GLocalFileStatField  mask,
208
                    GLocalFileStatField  mask_required,
209
                    GLocalFileStat      *stat_buf)
210
{
211
  if ((G_LOCAL_FILE_STAT_FIELD_BASIC_STATS & (mask_required & mask)) != (mask_required & mask))
212
    {
213
      /* Only G_LOCAL_FILE_STAT_FIELD_BASIC_STATS are supported. */
214
      errno = ERANGE;
215
      return -1;
216
    }
217
218
#ifdef G_OS_WIN32
219
  return GLIB_PRIVATE_CALL (g_win32_fstat) (fd, stat_buf);
220
#else
221
  return fstat (fd, stat_buf);
222
#endif
223
}
224
225
static inline int
226
g_local_file_fstatat (int                  fd,
227
                      const char          *path,
228
                      int                  flags,
229
                      GLocalFileStatField  mask,
230
                      GLocalFileStatField  mask_required,
231
                      GLocalFileStat      *stat_buf)
232
{
233
  if ((G_LOCAL_FILE_STAT_FIELD_BASIC_STATS & (mask_required & mask)) != (mask_required & mask))
234
    {
235
      /* Only G_LOCAL_FILE_STAT_FIELD_BASIC_STATS are supported. */
236
      errno = ERANGE;
237
      return -1;
238
    }
239
240
#if !defined(G_OS_WIN32) && defined(AT_FDCWD)
241
  return fstatat (fd, path, stat_buf, flags);
242
#else
243
  /* Currently not supported on Windows or macOS < 10.10 */
244
  errno = ENOSYS;
245
  return -1;
246
#endif
247
}
248
249
static inline int
250
g_local_file_lstat (const char          *path,
251
                    GLocalFileStatField  mask,
252
                    GLocalFileStatField  mask_required,
253
                    GLocalFileStat      *stat_buf)
254
{
255
  if ((G_LOCAL_FILE_STAT_FIELD_BASIC_STATS & (mask_required & mask)) != (mask_required & mask))
256
    {
257
      /* Only G_LOCAL_FILE_STAT_FIELD_BASIC_STATS are supported. */
258
      errno = ERANGE;
259
      return -1;
260
    }
261
262
#ifdef G_OS_WIN32
263
  return GLIB_PRIVATE_CALL (g_win32_lstat_utf8) (path, stat_buf);
264
#else
265
  return g_lstat (path, stat_buf);
266
#endif
267
}
268
269
static inline int
270
g_local_file_stat (const char          *path,
271
                   GLocalFileStatField  mask,
272
                   GLocalFileStatField  mask_required,
273
                   GLocalFileStat      *stat_buf)
274
{
275
  if ((G_LOCAL_FILE_STAT_FIELD_BASIC_STATS & (mask_required & mask)) != (mask_required & mask))
276
    {
277
      /* Only G_LOCAL_FILE_STAT_FIELD_BASIC_STATS are supported. */
278
      errno = ERANGE;
279
      return -1;
280
    }
281
282
#ifdef G_OS_WIN32
283
  return GLIB_PRIVATE_CALL (g_win32_stat_utf8) (path, stat_buf);
284
#else
285
  return stat (path, stat_buf);
286
#endif
287
}
288
289
inline static gboolean  _g_stat_has_field  (const GLocalFileStat *buf, GLocalFileStatField field) { return (G_LOCAL_FILE_STAT_FIELD_BASIC_STATS & field) == field; }
290
291
#ifndef G_OS_WIN32
292
inline static mode_t    _g_stat_mode      (const GLocalFileStat *buf) { return buf->st_mode; }
293
inline static nlink_t   _g_stat_nlink     (const GLocalFileStat *buf) { return buf->st_nlink; }
294
#else
295
inline static guint16   _g_stat_mode      (const GLocalFileStat *buf) { return buf->st_mode; }
296
inline static guint32   _g_stat_nlink     (const GLocalFileStat *buf) { return buf->st_nlink; }
297
#endif
298
inline static dev_t     _g_stat_dev       (const GLocalFileStat *buf) { return buf->st_dev; }
299
inline static ino_t     _g_stat_ino       (const GLocalFileStat *buf) { return buf->st_ino; }
300
inline static off_t     _g_stat_size      (const GLocalFileStat *buf) { return buf->st_size; }
301
302
#ifndef G_OS_WIN32
303
inline static uid_t     _g_stat_uid       (const GLocalFileStat *buf) { return buf->st_uid; }
304
inline static gid_t     _g_stat_gid       (const GLocalFileStat *buf) { return buf->st_gid; }
305
inline static dev_t     _g_stat_rdev      (const GLocalFileStat *buf) { return buf->st_rdev; }
306
inline static blksize_t _g_stat_blksize   (const GLocalFileStat *buf) { return buf->st_blksize; }
307
#else
308
inline static guint16   _g_stat_uid       (const GLocalFileStat *buf) { return buf->st_uid; }
309
inline static guint16   _g_stat_gid       (const GLocalFileStat *buf) { return buf->st_gid; }
310
#endif
311
312
#ifdef HAVE_STRUCT_STAT_ST_BLOCKS
313
inline static blkcnt_t  _g_stat_blocks    (const GLocalFileStat *buf) { return buf->st_blocks; }
314
#endif
315
316
#ifndef G_OS_WIN32
317
inline static time_t    _g_stat_atime     (const GLocalFileStat *buf) { return buf->st_atime; }
318
inline static time_t    _g_stat_ctime     (const GLocalFileStat *buf) { return buf->st_ctime; }
319
inline static time_t    _g_stat_mtime     (const GLocalFileStat *buf) { return buf->st_mtime; }
320
#endif
321
#ifdef HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
322
inline static guint32   _g_stat_atim_nsec (const GLocalFileStat *buf) { return buf->st_atim.tv_nsec; }
323
inline static guint32   _g_stat_ctim_nsec (const GLocalFileStat *buf) { return buf->st_ctim.tv_nsec; }
324
inline static guint32   _g_stat_mtim_nsec (const GLocalFileStat *buf) { return buf->st_mtim.tv_nsec; }
325
#endif
326
327
#endif  /* !HAVE_STATX */
328
329
#define G_LOCAL_FILE_INFO_NOSTAT_ATTRIBUTES \
330
0
    G_FILE_ATTRIBUTE_STANDARD_NAME "," \
331
0
    G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "," \
332
0
    G_FILE_ATTRIBUTE_STANDARD_EDIT_NAME "," \
333
0
    G_FILE_ATTRIBUTE_STANDARD_COPY_NAME
334
335
gboolean   _g_local_file_has_trash_dir        (const char             *dirname,
336
                                               dev_t                   dir_dev);
337
#ifdef G_OS_UNIX
338
gboolean   _g_local_file_is_lost_found_dir    (const char             *path,
339
                                               dev_t                   path_dev);
340
#endif
341
void       _g_local_file_info_get_parent_info (const char             *dir,
342
                                               GFileAttributeMatcher  *attribute_matcher,
343
                                               GLocalParentFileInfo   *parent_info);
344
void       _g_local_file_info_free_parent_info (GLocalParentFileInfo   *parent_info);
345
void       _g_local_file_info_get_nostat      (GFileInfo              *info,
346
                                               const char             *basename,
347
                                               const char             *path,
348
                                               GFileAttributeMatcher  *attribute_matcher);
349
GFileInfo *_g_local_file_info_get             (const char             *basename,
350
                                               const char             *path,
351
                                               GFileAttributeMatcher  *attribute_matcher,
352
                                               GFileQueryInfoFlags     flags,
353
                                               GLocalParentFileInfo   *parent_info,
354
                                               GError                **error);
355
GFileInfo *_g_local_file_info_get_from_fd     (int                     fd,
356
                                               const char             *attributes,
357
                                               GError                **error);
358
char *     _g_local_file_info_create_etag     (GLocalFileStat         *statbuf);
359
gboolean   _g_local_file_info_set_attribute   (char                   *filename,
360
                                               const char             *attribute,
361
                                               GFileAttributeType      type,
362
                                               gpointer                value_p,
363
                                               GFileQueryInfoFlags     flags,
364
                                               GCancellable           *cancellable,
365
                                               GError                **error);
366
gboolean   _g_local_file_info_set_attributes  (char                   *filename,
367
                                               GFileInfo              *info,
368
                                               GFileQueryInfoFlags     flags,
369
                                               GCancellable           *cancellable,
370
                                               GError                **error);
371
372
G_END_DECLS
373
374
#endif /* __G_FILE_LOCAL_FILE_INFO_H__ */