(root)/
strace-6.5/
tests-mx32/
mount.c
       1  /*
       2   * Check decoding of mount syscall.
       3   *
       4   * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2016-2020 The strace developers.
       6   * All rights reserved.
       7   *
       8   * SPDX-License-Identifier: GPL-2.0-or-later
       9   */
      10  
      11  #include "tests.h"
      12  #include <stdio.h>
      13  #include <unistd.h>
      14  #include <sys/mount.h>
      15  
      16  #ifndef MS_MGC_VAL
      17  # define MS_MGC_VAL 0xC0ED0000
      18  #endif
      19  
      20  #ifndef MS_RELATIME
      21  # define MS_RELATIME (1ul << 21)
      22  #endif
      23  
      24  #if XLAT_RAW
      25  # define str_unknown "0x200"
      26  # define str_submount_200 "0x4000200"
      27  # define str_mgc_val "0xc0ed0000"
      28  # define str_remount "0x20"
      29  # define str_bind "0x1000"
      30  # define str_ro_nosuid_nodev_noexec "0xf"
      31  # define str_ro_nosuid_nodev_noexec_relatime "0x20000f"
      32  #elif XLAT_VERBOSE
      33  # define str_unknown "0x200 /* MS_??? */"
      34  # define str_submount_200 "0x4000200 /* MS_SUBMOUNT|0x200 */"
      35  # define str_mgc_val "0xc0ed0000 /* MS_MGC_VAL */"
      36  # define str_remount "0x20 /* MS_REMOUNT */"
      37  # define str_bind "0x1000 /* MS_BIND */"
      38  # define str_ro_nosuid_nodev_noexec \
      39  	"0xf /* MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC */"
      40  # define str_ro_nosuid_nodev_noexec_relatime \
      41  	"0x20000f /* MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_RELATIME */"
      42  #else /* !XLAT_RAW && !XLAT_VERBOSE */
      43  # define str_unknown "0x200 /* MS_??? */"
      44  # define str_submount_200 "MS_SUBMOUNT|0x200"
      45  # define str_mgc_val "MS_MGC_VAL"
      46  # define str_remount "MS_REMOUNT"
      47  # define str_bind "MS_BIND"
      48  # define str_ro_nosuid_nodev_noexec "MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC"
      49  # define str_ro_nosuid_nodev_noexec_relatime \
      50  	"MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_RELATIME"
      51  #endif /* XLAT_RAW, XLAT_VERBOSE */
      52  
      53  int
      54  main(void)
      55  {
      56  	static const char source[] = "mount_source";
      57  	static const char target[] = "mount_target";
      58  	static const char fstype[] = "mount_fstype";
      59  	static const char data[] = "mount_data";
      60  	TAIL_ALLOC_OBJECT_CONST_PTR(char, bogus);
      61  
      62  	bogus[0] = 'a';
      63  
      64  	int rc = mount(NULL, NULL, NULL, 0, NULL);
      65  	printf("mount(NULL, NULL, NULL, 0, NULL) = %s\n",
      66  	       sprintrc(rc));
      67  
      68  	rc = mount(bogus, bogus, bogus, 0x200, bogus);
      69  	printf("mount(%p, %p, %p, %s, %p) = %s\n",
      70  	       bogus, bogus, bogus, str_unknown, bogus, sprintrc(rc));
      71  
      72  	rc = mount(bogus + 1, bogus + 1, bogus + 1, 0x4000200, bogus + 1);
      73  	printf("mount(%p, %p, %p, %s, %p) = %s\n",
      74  	       bogus + 1, bogus + 1, bogus + 1, str_submount_200,
      75  	       bogus + 1, sprintrc(rc));
      76  
      77  	rc = mount(source, target, fstype, 15, data);
      78  	printf("mount(\"%s\", \"%s\", \"%s\", %s, \"%s\") = %s\n",
      79  	       source, target, fstype, str_ro_nosuid_nodev_noexec,
      80  	       data, sprintrc(rc));
      81  
      82  	rc = mount(source, target, fstype, MS_RELATIME | 15, data);
      83  	printf("mount(\"%s\", \"%s\", \"%s\", %s, \"%s\") = %s\n",
      84  	       source, target, fstype,
      85  	       str_ro_nosuid_nodev_noexec_relatime,
      86  	       data, sprintrc(rc));
      87  
      88  	rc = mount(source, target, fstype, MS_MGC_VAL, data);
      89  	printf("mount(\"%s\", \"%s\", \"%s\", %s, \"%s\") = %s\n",
      90  	       source, target, fstype, str_mgc_val, data, sprintrc(rc));
      91  
      92  	rc = mount(source, target, fstype, MS_MGC_VAL | 15, data);
      93  	printf("mount(\"%s\", \"%s\", \"%s\", %s, \"%s\") = %s\n",
      94  	       source, target, fstype,
      95  	       str_mgc_val "|" str_ro_nosuid_nodev_noexec,
      96  	       data, sprintrc(rc));
      97  
      98  	rc = mount(source, target, NULL, MS_REMOUNT, data);
      99  	printf("mount(\"%s\", \"%s\", NULL, %s, \"%s\") = %s\n",
     100  	       source, target, str_remount, data, sprintrc(rc));
     101  
     102  	rc = mount(source, target, fstype, MS_REMOUNT, data);
     103  	printf("mount(\"%s\", \"%s\", %p, %s, \"%s\") = %s\n",
     104  	       source, target, fstype, str_remount, data, sprintrc(rc));
     105  
     106  	rc = mount(source, target, NULL, MS_BIND, data);
     107  	printf("mount(\"%s\", \"%s\", NULL, %s, %p) = %s\n",
     108  	       source, target, str_bind, data, sprintrc(rc));
     109  
     110  	rc = mount(source, target, fstype, MS_BIND, NULL);
     111  	printf("mount(\"%s\", \"%s\", %p, %s, NULL) = %s\n",
     112  	       source, target, fstype, str_bind, sprintrc(rc));
     113  
     114  	puts("+++ exited with 0 +++");
     115  	return 0;
     116  }