1/*
2 SPDX-FileCopyrightText: 2024 Méven Car <meven@kde.org>
3
4 SPDX-License-Identifier: LGPL-2.0-or-later
5*/
6#ifndef STAT_UNIX_H
7#define STAT_UNIX_H
8
9#include "kioglobal_p.h"
10#include "qplatformdefs.h"
11
12#include <config-stat-unix.h>
13#include <kio/statjob.h>
14
15#if HAVE_STATX
16#include <sys/stat.h>
17#include <sys/sysmacros.h> // for makedev()
18#endif
19
20#ifdef Q_OS_WIN
21// QT_LSTAT on Windows
22#include "kioglobal_p.h"
23#endif
24
25#if HAVE_STATX
26// statx syscall is available
27inline int LSTAT(const char *path, struct statx *buff, KIO::StatDetails details)
28{
29 uint32_t mask = 0;
30 if (details & KIO::StatBasic) {
31 // filename, access, type, size, linkdest
32 mask |= STATX_SIZE | STATX_TYPE;
33 }
34 if (details & KIO::StatUser) {
35 // uid, gid
36 mask |= STATX_UID | STATX_GID;
37 }
38 if (details & KIO::StatTime) {
39 // atime, mtime, btime
40 mask |= STATX_ATIME | STATX_MTIME | STATX_BTIME;
41 }
42 if (details & KIO::StatInode) {
43 // dev, inode
44 mask |= STATX_INO;
45 }
46 return statx(AT_FDCWD, path, AT_SYMLINK_NOFOLLOW, mask, buff);
47}
48inline int STAT(const char *path, struct statx *buff, const KIO::StatDetails &details)
49{
50 uint32_t mask = 0;
51 // KIO::StatAcl needs type
52 if (details & (KIO::StatBasic | KIO::StatAcl | KIO::StatResolveSymlink)) {
53 // filename, access, type
54 mask |= STATX_TYPE;
55 }
56 if (details & (KIO::StatBasic | KIO::StatResolveSymlink)) {
57 // size, linkdest
58 mask |= STATX_SIZE;
59 }
60 if (details & KIO::StatUser) {
61 // uid, gid
62 mask |= STATX_UID | STATX_GID;
63 }
64 if (details & KIO::StatTime) {
65 // atime, mtime, btime
66 mask |= STATX_ATIME | STATX_MTIME | STATX_BTIME;
67 }
68 // KIO::Inode is ignored as when STAT is called, the entry inode field has already been filled
69 return statx(AT_FDCWD, path, AT_STATX_SYNC_AS_STAT, mask, buff);
70}
71inline static uint16_t stat_mode(const struct statx &buf)
72{
73 return buf.stx_mode;
74}
75inline static dev_t stat_dev(const struct statx &buf)
76{
77 return makedev(buf.stx_dev_major, buf.stx_dev_minor);
78}
79inline static uint64_t stat_ino(const struct statx &buf)
80{
81 return buf.stx_ino;
82}
83inline static uint64_t stat_size(const struct statx &buf)
84{
85 return buf.stx_size;
86}
87inline static uint32_t stat_uid(const struct statx &buf)
88{
89 return buf.stx_uid;
90}
91inline static uint32_t stat_gid(const struct statx &buf)
92{
93 return buf.stx_gid;
94}
95inline static int64_t stat_atime(const struct statx &buf)
96{
97 return buf.stx_atime.tv_sec;
98}
99inline static int64_t stat_mtime(const struct statx &buf)
100{
101 return buf.stx_mtime.tv_sec;
102}
103#else
104// regular stat struct
105inline int LSTAT(const char *path, QT_STATBUF *buff, KIO::StatDetails details)
106{
107 Q_UNUSED(details)
108 return QT_LSTAT(file: path, buf: buff);
109}
110inline int STAT(const char *path, QT_STATBUF *buff, KIO::StatDetails details)
111{
112 Q_UNUSED(details)
113 return QT_STAT(file: path, buf: buff);
114}
115inline static mode_t stat_mode(const QT_STATBUF &buf)
116{
117 return buf.st_mode;
118}
119inline static dev_t stat_dev(const QT_STATBUF &buf)
120{
121 return buf.st_dev;
122}
123inline static ino_t stat_ino(const QT_STATBUF &buf)
124{
125 return buf.st_ino;
126}
127inline static off_t stat_size(const QT_STATBUF &buf)
128{
129 return buf.st_size;
130}
131inline static uint32_t stat_uid(const QT_STATBUF &buf)
132{
133 return buf.st_uid;
134}
135inline static uint32_t stat_gid(const QT_STATBUF &buf)
136{
137 return buf.st_gid;
138}
139inline static time_t stat_atime(const QT_STATBUF &buf)
140{
141 return buf.st_atime;
142}
143inline static time_t stat_mtime(const QT_STATBUF &buf)
144{
145 return buf.st_mtime;
146}
147#endif
148
149#endif // STAT_UNIX_H
150

source code of kio/src/kioworkers/file/stat_unix.h