]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/test/stress2/misc/beneath4.sh
contrib/bc: update to version 5.1.1
[FreeBSD/FreeBSD.git] / tools / test / stress2 / misc / beneath4.sh
1 #!/bin/sh
2
3 #
4 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5 #
6 # Copyright (c) 2021 Peter Holm <pho@FreeBSD.org>
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 # 1. Redistributions of source code must retain the above copyright
12 #    notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 #    notice, this list of conditions and the following disclaimer in the
15 #    documentation and/or other materials provided with the distribution.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 # ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 # SUCH DAMAGE.
28 #
29
30 # Test of:
31 # AT_BENEATH              0x1000  /* Fail if not under dirfd */
32 # AT_RESOLVE_BENEATH      0x2000  /* As AT_BENEATH, but do not allow
33 #                                    resolve to walk out of dirfd even
34
35 dir=/tmp/beneath4.dir
36 rm -rf $dir
37 mkdir -p $dir
38 here=`pwd`
39 cd $dir
40
41 cat > beneath4.c <<EOF
42 #include <sys/stat.h>
43
44 #include <err.h>
45 #include <errno.h>
46 #include <fcntl.h>
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <unistd.h>
51
52 int
53 main(int argc, char *argv[])
54 {
55         struct stat st;
56         int exp, fd, flag, r;
57         char *cwd, *dir, *obj, *s;
58
59         if (argc != 5) {
60                 fprintf(stderr,
61                     "Usage: %s <dir> <test obj> <flag> <expected return>\n",
62                     argv[0]);
63                 return (1);
64         }
65
66         cwd = getwd(NULL);
67         dir = argv[1];
68         obj = argv[2];
69         sscanf(argv[3], "%x", &flag);
70         exp = atoi(argv[4]);
71 #if 0
72         if ((flag & AT_RESOLVE_BENEATH) == 0) {
73                 fprintf(stderr, "Flag must be %#x or %#x\n",
74                     AT_BENEATH, AT_RESOLVE_BENEATH);
75                 return (1);
76         }
77 #endif
78         if ((fd = open(dir, O_DIRECTORY | O_RDONLY)) == -1)
79                 err(1, "open(%s)", dir);
80
81         if (fstatat(fd, obj, &st, flag) == -1)
82                 r = errno;
83         else
84                 r = 0;
85         s = "FAIL";
86         if (r == exp)
87                 s = "OK";
88         warn("cwd=%s, top=%s. flag=%0.6x. fstatf(%s) = %2d (expect %2d). %4s",
89             cwd, dir, flag, obj, r, exp, s);
90
91         return (r == exp ? 0 : errno);
92 }
93 EOF
94 cc -o beneath4 -Wall -Wextra -O2 -g beneath4.c || exit 1
95 rm beneath4.c
96
97 mkdir -p /tmp/beneath4.dir/a/a
98 touch    /tmp/beneath4.dir/a/f
99 ln       /tmp/beneath4.dir/a/f /tmp/beneath4.dir/a/c
100 ln -s    /tmp/beneath4.dir/a/a /tmp/beneath4.dir/a/d
101 ln -s    /tmp/beneath4.dir/a/b /tmp/beneath4.dir/a/e
102 mkfifo   /tmp/beneath4.dir/a/fifo
103
104 top=$dir/a
105
106 cd $here
107 s=0
108 #ls -lR $dir
109 #echo  AT_BENEATH
110 #$dir/beneath4 $top a                         0x1000  0 || s=1
111 #$dir/beneath4 $top b                         0x1000  2 || s=1
112 #$dir/beneath4 $top c                         0x1000  0 || s=1
113 #$dir/beneath4 $top d                         0x1000  0 || s=1
114 #$dir/beneath4 $top e                         0x1000  2 || s=1
115 #$dir/beneath4 $top fifo                      0x1000  0 || s=1
116 #$dir/beneath4 $top $top/../../beneath4.d/a/a 0x1000 93 || s=1
117 #$dir/beneath4 $top $top/..                   0x1000 93 || s=1
118 #$dir/beneath4 $top ../a                      0x1000  0 || s=1
119
120 printf "\nAT_RESOLVE_BENEATH\n"
121 $dir/beneath4 $top a                         0x2000  0 || s=1
122 $dir/beneath4 $top b                         0x2000  2 || s=1
123 $dir/beneath4 $top c                         0x2000  0 || s=1
124 $dir/beneath4 $top d                         0x2000 93 || s=1
125 $dir/beneath4 $top e                         0x2000 93 || s=1
126 $dir/beneath4 $top fifo                      0x2000  0 || s=1
127 $dir/beneath4 $top $top/../../beneath4.d/a/a 0x2000 93 || s=1
128 $dir/beneath4 $top $top/..                   0x2000 93 || s=1
129 $dir/beneath4 $top ../a                      0x2000 93 || s=1
130 printf "\nNo flag\n"
131 $dir/beneath4 $top ../a                      0x0000  0 || s=1
132 rm -rf $top
133 exit $s