1 1.1 christos /* $NetBSD: fsaccess.c,v 1.1 2024/02/18 20:57:49 christos Exp $ */ 2 1.1 christos 3 1.1 christos /* 4 1.1 christos * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5 1.1 christos * 6 1.1 christos * SPDX-License-Identifier: MPL-2.0 7 1.1 christos * 8 1.1 christos * This Source Code Form is subject to the terms of the Mozilla Public 9 1.1 christos * License, v. 2.0. If a copy of the MPL was not distributed with this 10 1.1 christos * file, you can obtain one at https://mozilla.org/MPL/2.0/. 11 1.1 christos * 12 1.1 christos * See the COPYRIGHT file distributed with this work for additional 13 1.1 christos * information regarding copyright ownership. 14 1.1 christos */ 15 1.1 christos 16 1.1 christos /*! \file 17 1.1 christos * \brief 18 1.1 christos * This file contains the OS-independent functionality of the API. 19 1.1 christos */ 20 1.1 christos #include <stdbool.h> 21 1.1 christos 22 1.1 christos #include <isc/fsaccess.h> 23 1.1 christos #include <isc/print.h> 24 1.1 christos #include <isc/result.h> 25 1.1 christos #include <isc/util.h> 26 1.1 christos 27 1.1 christos /*! 28 1.1 christos * Shorthand. Maybe ISC__FSACCESS_PERMISSIONBITS should not even be in 29 1.1 christos * <isc/fsaccess.h>. Could check consistency with sizeof(isc_fsaccess_t) 30 1.1 christos * and the number of bits in each function. 31 1.1 christos */ 32 1.1 christos #define STEP (ISC__FSACCESS_PERMISSIONBITS) 33 1.1 christos #define GROUP (STEP) 34 1.1 christos #define OTHER (STEP * 2) 35 1.1 christos 36 1.1 christos void 37 1.1 christos isc_fsaccess_add(int trustee, int permission, isc_fsaccess_t *access) { 38 1.1 christos REQUIRE(trustee <= 0x7); 39 1.1 christos REQUIRE(permission <= 0xFF); 40 1.1 christos 41 1.1 christos if ((trustee & ISC_FSACCESS_OWNER) != 0) { 42 1.1 christos *access |= permission; 43 1.1 christos } 44 1.1 christos 45 1.1 christos if ((trustee & ISC_FSACCESS_GROUP) != 0) { 46 1.1 christos *access |= (permission << GROUP); 47 1.1 christos } 48 1.1 christos 49 1.1 christos if ((trustee & ISC_FSACCESS_OTHER) != 0) { 50 1.1 christos *access |= (permission << OTHER); 51 1.1 christos } 52 1.1 christos } 53 1.1 christos 54 1.1 christos void 55 1.1 christos isc_fsaccess_remove(int trustee, int permission, isc_fsaccess_t *access) { 56 1.1 christos REQUIRE(trustee <= 0x7); 57 1.1 christos REQUIRE(permission <= 0xFF); 58 1.1 christos 59 1.1 christos if ((trustee & ISC_FSACCESS_OWNER) != 0) { 60 1.1 christos *access &= ~permission; 61 1.1 christos } 62 1.1 christos 63 1.1 christos if ((trustee & ISC_FSACCESS_GROUP) != 0) { 64 1.1 christos *access &= ~(permission << GROUP); 65 1.1 christos } 66 1.1 christos 67 1.1 christos if ((trustee & ISC_FSACCESS_OTHER) != 0) { 68 1.1 christos *access &= ~(permission << OTHER); 69 1.1 christos } 70 1.1 christos } 71 1.1 christos 72 1.1 christos static isc_result_t 73 1.1 christos check_bad_bits(isc_fsaccess_t access, bool is_dir) { 74 1.1 christos isc_fsaccess_t bits; 75 1.1 christos 76 1.1 christos /* 77 1.1 christos * Check for disallowed user bits. 78 1.1 christos */ 79 1.1 christos if (is_dir) { 80 1.1 christos bits = ISC_FSACCESS_READ | ISC_FSACCESS_WRITE | 81 1.1 christos ISC_FSACCESS_EXECUTE; 82 1.1 christos } else { 83 1.1 christos bits = ISC_FSACCESS_CREATECHILD | ISC_FSACCESS_ACCESSCHILD | 84 1.1 christos ISC_FSACCESS_DELETECHILD | ISC_FSACCESS_LISTDIRECTORY; 85 1.1 christos } 86 1.1 christos 87 1.1 christos /* 88 1.1 christos * Set group bad bits. 89 1.1 christos */ 90 1.1 christos bits |= bits << STEP; 91 1.1 christos /* 92 1.1 christos * Set other bad bits. 93 1.1 christos */ 94 1.1 christos bits |= bits << STEP; 95 1.1 christos 96 1.1 christos if ((access & bits) != 0) { 97 1.1 christos if (is_dir) { 98 1.1 christos return (ISC_R_NOTFILE); 99 1.1 christos } else { 100 1.1 christos return (ISC_R_NOTDIRECTORY); 101 1.1 christos } 102 1.1 christos } 103 1.1 christos 104 1.1 christos return (ISC_R_SUCCESS); 105 1.1 christos } 106