(root)/
strace-6.5/
src/
fsconfig.c
       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  }