102a2005aSPeter Holm#!/bin/sh 202a2005aSPeter Holm 302a2005aSPeter Holm# 402a2005aSPeter Holm# Copyright (c) 2024 Peter Holm <pho@FreeBSD.org> 502a2005aSPeter Holm# 602a2005aSPeter Holm# SPDX-License-Identifier: BSD-2-Clause 702a2005aSPeter Holm# 802a2005aSPeter Holm 902a2005aSPeter Holm# O_PATH test scenario. Variation of nullfs29.sh 1002a2005aSPeter Holm 1102a2005aSPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1 1202a2005aSPeter Holm. ../default.cfg 1302a2005aSPeter Holm 1402a2005aSPeter Holmmd1=$mdstart 1502a2005aSPeter Holmmd2=$((md1 + 1)) 1602a2005aSPeter Holmmp1=/mnt$md1 1702a2005aSPeter Holmmp2=/mnt$md2 1802a2005aSPeter Holmmkdir -p $mp1 $mp2 1902a2005aSPeter Holmset -e 2002a2005aSPeter Holmfor i in $mp1 $mp2; do 2102a2005aSPeter Holm mount | grep -q "on $i " && umount -f $i 2202a2005aSPeter Holmdone 2302a2005aSPeter Holmfor i in $md1 $md2; do 2402a2005aSPeter Holm mdconfig -l | grep -q md$i && mdconfig -d -u $i 2502a2005aSPeter Holmdone 2602a2005aSPeter Holm 2702a2005aSPeter Holmmdconfig -a -t swap -s 2g -u $md1 2802a2005aSPeter Holmmdconfig -a -t swap -s 2g -u $md2 2902a2005aSPeter Holmnewfs $newfs_flags -n md$md1 > /dev/null 3002a2005aSPeter Holmnewfs $newfs_flags -n md$md2 > /dev/null 3102a2005aSPeter Holmmount /dev/md$md1 $mp1 3202a2005aSPeter Holmmount /dev/md$md2 $mp2 3302a2005aSPeter Holmmount -t unionfs -o noatime $mp1 $mp2 3402a2005aSPeter Holmset +e 3502a2005aSPeter Holm 3602a2005aSPeter Holmcat > /tmp/unionfs15.c <<EOF 3702a2005aSPeter Holm#include <sys/stat.h> 3802a2005aSPeter Holm#include <err.h> 3902a2005aSPeter Holm#include <errno.h> 4002a2005aSPeter Holm#include <fcntl.h> 4102a2005aSPeter Holm#include <stdio.h> 4202a2005aSPeter Holm#include <stdlib.h> 4302a2005aSPeter Holm#include <unistd.h> 4402a2005aSPeter Holm 4502a2005aSPeter Holmint 4602a2005aSPeter Holmmain(void) { 4702a2005aSPeter Holm int new_dir, new_file, ret; 4802a2005aSPeter Holm struct stat sb; 4902a2005aSPeter Holm char *dir = "test2"; 5002a2005aSPeter Holm char *path= "test2/what2"; 5102a2005aSPeter Holm 5202a2005aSPeter Holm if (mkdir(dir, 0755) == -1) 5302a2005aSPeter Holm err(1, "mkdir(test2)"); 5402a2005aSPeter Holm new_dir = openat(AT_FDCWD, dir, O_RDONLY|O_DIRECTORY|O_CLOEXEC|O_PATH, 0700); 5502a2005aSPeter Holm if (new_dir == -1) 5602a2005aSPeter Holm err(1, "openat(%s)", dir); 5702a2005aSPeter Holm 5802a2005aSPeter Holm ret = fstatat(new_dir, "what2", &sb, AT_SYMLINK_NOFOLLOW); 5902a2005aSPeter Holm if (ret == 0) 6002a2005aSPeter Holm errx(1, "Expected fstatat() to fail"); 6102a2005aSPeter Holm if (ret == -1 && errno != ENOENT) 6202a2005aSPeter Holm err(1, "fstatat(%s)", dir); 6302a2005aSPeter Holm 6402a2005aSPeter Holm close(new_dir); 6502a2005aSPeter Holm new_file = openat(AT_FDCWD, path, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644); 6602a2005aSPeter Holm if (new_file== -1) 6702a2005aSPeter Holm err(1, "openat(%s)", path); 6802a2005aSPeter Holm} 6902a2005aSPeter Holm 7002a2005aSPeter HolmEOF 7102a2005aSPeter Holmmycc -o /tmp/unionfs15 -Wall -Wextra -O2 /tmp/unionfs15.c || exit 1 7202a2005aSPeter Holmcd $mp2 7302a2005aSPeter Holm/tmp/unionfs15; s=$? 7402a2005aSPeter Holmcd $here 7502a2005aSPeter Holmumount $mp2 7602a2005aSPeter Holm 7702a2005aSPeter Holmwhile mount | grep -Eq "on $mp2 .*unionfs"; do 7802a2005aSPeter Holm umount $mp2 && break 7902a2005aSPeter Holm sleep 5 8002a2005aSPeter Holmdone 8102a2005aSPeter Holmumount $mp2 8202a2005aSPeter Holmumount $mp1 8302a2005aSPeter Holmmdconfig -d -u $md2 8402a2005aSPeter Holmmdconfig -d -u $md1 8502a2005aSPeter Holmrm -f /tmp/unionfs15.c /tmp/unionfs15 8602a2005aSPeter Holmexit $s 87