1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/*
* Copyright (c) 2019 Linux Foundation
* Author: Richard Purdie
*
* SPDX-License-Identifier: LGPL-2.1-only
*
* int
* statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf) {
* int rc = -1;
*/
pseudo_msg_t *msg;
PSEUDO_STATBUF buf;
int save_errno;
rc = real_statx(dirfd, pathname, flags, mask, statxbuf);
save_errno = errno;
if (rc == -1) {
return rc;
}
buf.st_uid = statxbuf->stx_uid;
buf.st_gid = statxbuf->stx_gid;
buf.st_dev = makedev(statxbuf->stx_dev_major, statxbuf->stx_dev_minor);
buf.st_ino = statxbuf->stx_ino;
buf.st_mode = statxbuf->stx_mode;
buf.st_rdev = makedev(statxbuf->stx_rdev_major, statxbuf->stx_rdev_minor);
buf.st_nlink = statxbuf->stx_nlink;
msg = pseudo_client_op(OP_STAT, 0, -1, dirfd, pathname, &buf);
if (msg && msg->result == RESULT_SUCCEED) {
pseudo_debug(PDBGF_FILE, "statx(path %s), flags %o, stat rc %d, stat uid %o\n", pathname, flags, rc, statxbuf->stx_uid);
statxbuf->stx_uid = msg->uid;
statxbuf->stx_gid = msg->gid;
statxbuf->stx_mode = msg->mode;
statxbuf->stx_rdev_major = major(msg->rdev);
statxbuf->stx_rdev_minor = minor(msg->rdev);
} else {
pseudo_debug(PDBGF_FILE, "statx(path %s) failed, flags %o, stat rc %d, stat uid %o\n", pathname, flags, rc, statxbuf->stx_uid);
}
errno = save_errno;
/* return rc;
* }
*/
|