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