1 /*
2 * Copyright (c) 2019-2021 Dmitry V. Levin <ldv@strace.io>
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 #include "defs.h"
9 #include <linux/mount.h>
10 #include "xlat/fsconfig_cmds.h"
11
12 SYS_FUNC(fsconfig)
13 {
14 const int fs_fd = tcp->u_arg[0];
15 const unsigned int cmd = tcp->u_arg[1];
16 const kernel_ulong_t key = tcp->u_arg[2];
17 const kernel_ulong_t value = tcp->u_arg[3];
18 const int aux = tcp->u_arg[4];
19
20 printfd(tcp, fs_fd);
21 tprint_arg_next();
22
23 printxval(fsconfig_cmds, cmd, "FSCONFIG_???");
24 tprint_arg_next();
25
26 switch (cmd) {
27 case FSCONFIG_SET_FLAG:
28 case FSCONFIG_SET_STRING:
29 case FSCONFIG_SET_BINARY:
30 case FSCONFIG_SET_PATH:
31 case FSCONFIG_SET_PATH_EMPTY:
32 case FSCONFIG_SET_FD:
33 printstr_ex(tcp, key, 256, QUOTE_0_TERMINATED);
34 break;
35 case FSCONFIG_CMD_CREATE:
36 case FSCONFIG_CMD_RECONFIGURE:
37 default:
38 printaddr(key);
39 break;
40 }
41 tprint_arg_next();
42
43 switch (cmd) {
44 case FSCONFIG_SET_STRING:
45 printstr_ex(tcp, value, 256, QUOTE_0_TERMINATED);
46 break;
47 case FSCONFIG_SET_PATH:
48 case FSCONFIG_SET_PATH_EMPTY:
49 printpath(tcp, value);
50 break;
51 case FSCONFIG_SET_BINARY:
52 if (aux >= 0 && aux <= 1024 * 1024) {
53 printstr_ex(tcp, value, aux, QUOTE_FORCE_HEX);
54 break;
55 }
56 ATTRIBUTE_FALLTHROUGH;
57 case FSCONFIG_SET_FLAG:
58 case FSCONFIG_SET_FD:
59 case FSCONFIG_CMD_CREATE:
60 case FSCONFIG_CMD_RECONFIGURE:
61 default:
62 printaddr(value);
63 break;
64 }
65 tprint_arg_next();
66
67 switch (cmd) {
68 case FSCONFIG_SET_PATH:
69 case FSCONFIG_SET_PATH_EMPTY:
70 print_dirfd(tcp, aux);
71 break;
72 case FSCONFIG_SET_FD:
73 printfd(tcp, aux);
74 break;
75 case FSCONFIG_SET_FLAG:
76 case FSCONFIG_SET_STRING:
77 case FSCONFIG_SET_BINARY:
78 case FSCONFIG_CMD_CREATE:
79 case FSCONFIG_CMD_RECONFIGURE:
80 default:
81 PRINT_VAL_D(aux);
82 break;
83 }
84
85 return RVAL_DECODED;
86 }