Path: blob/main/sys/contrib/openzfs/tests/zfs-tests/cmd/dosmode_readonly_write.c
48529 views
/*1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (c) 2021 iXsystems, Inc.4*5* Redistribution and use in source and binary forms, with or without6* modification, are permitted provided that the following conditions7* are met:8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*26* Test for correct behavior of DOS mode READONLY flag on a file.27* We should be able to open a file RW, set READONLY, and still write to the fd.28*/2930#include <sys/stat.h>31#include <err.h>32#include <errno.h>33#include <fcntl.h>34#include <stdio.h>35#include <string.h>36#include <unistd.h>3738#ifdef __linux__39#include <stdint.h>40#include <sys/fs/zfs.h>41#endif4243int44main(int argc, const char *argv[])45{46const char *buf = "We should be allowed to write this to the fd.\n";47const char *path;48int fd;4950if (argc != 2) {51fprintf(stderr, "usage: %s PATH\n", argv[0]);52return (EXIT_FAILURE);53}54path = argv[1];55fd = open(path, O_CREAT|O_RDWR, 0777);56if (fd == -1)57err(EXIT_FAILURE, "%s: open failed", path);58#ifdef __linux__59uint64_t dosflags = ZFS_READONLY;60if (ioctl(fd, ZFS_IOC_SETDOSFLAGS, &dosflags) == -1)61err(EXIT_FAILURE, "%s: ZFS_IOC_SETDOSFLAGS failed", path);62#else63if (chflags(path, UF_READONLY) == -1)64err(EXIT_FAILURE, "%s: chflags failed", path);65#endif66if (write(fd, buf, strlen(buf)) == -1)67err(EXIT_FAILURE, "%s: write failed", path);68if (close(fd) == -1)69err(EXIT_FAILURE, "%s: close failed", path);70return (EXIT_SUCCESS);71}727374