1aa015c8eSEdward Tomasz Napierala /*- 2aa015c8eSEdward Tomasz Napierala * Copyright (c) 2008, 2009 Edward Tomasz Napierała <trasz@FreeBSD.org> 3aa015c8eSEdward Tomasz Napierala * All rights reserved. 4aa015c8eSEdward Tomasz Napierala * 5aa015c8eSEdward Tomasz Napierala * Redistribution and use in source and binary forms, with or without 6aa015c8eSEdward Tomasz Napierala * modification, are permitted provided that the following conditions 7aa015c8eSEdward Tomasz Napierala * are met: 8aa015c8eSEdward Tomasz Napierala * 1. Redistributions of source code must retain the above copyright 9aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer. 10aa015c8eSEdward Tomasz Napierala * 2. Redistributions in binary form must reproduce the above copyright 11aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer in the 12aa015c8eSEdward Tomasz Napierala * documentation and/or other materials provided with the distribution. 13aa015c8eSEdward Tomasz Napierala * 14aa015c8eSEdward Tomasz Napierala * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15aa015c8eSEdward Tomasz Napierala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16aa015c8eSEdward Tomasz Napierala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17aa015c8eSEdward Tomasz Napierala * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18aa015c8eSEdward Tomasz Napierala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19aa015c8eSEdward Tomasz Napierala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20aa015c8eSEdward Tomasz Napierala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21aa015c8eSEdward Tomasz Napierala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22aa015c8eSEdward Tomasz Napierala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23aa015c8eSEdward Tomasz Napierala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24aa015c8eSEdward Tomasz Napierala * SUCH DAMAGE. 25aa015c8eSEdward Tomasz Napierala */ 26aa015c8eSEdward Tomasz Napierala 27aa015c8eSEdward Tomasz Napierala #include <sys/cdefs.h> 28aa015c8eSEdward Tomasz Napierala __FBSDID("$FreeBSD$"); 29aa015c8eSEdward Tomasz Napierala 30aa015c8eSEdward Tomasz Napierala #include <stdio.h> 31aa015c8eSEdward Tomasz Napierala #include <errno.h> 32aa015c8eSEdward Tomasz Napierala #include <sys/acl.h> 33aa015c8eSEdward Tomasz Napierala 34aa015c8eSEdward Tomasz Napierala #include "acl_support.h" 35aa015c8eSEdward Tomasz Napierala 36aa015c8eSEdward Tomasz Napierala static int 37aa015c8eSEdward Tomasz Napierala _flag_is_invalid(acl_flag_t flag) 38aa015c8eSEdward Tomasz Napierala { 39aa015c8eSEdward Tomasz Napierala 40aa015c8eSEdward Tomasz Napierala if ((flag & ACL_FLAGS_BITS) == flag) 41aa015c8eSEdward Tomasz Napierala return (0); 42aa015c8eSEdward Tomasz Napierala 43aa015c8eSEdward Tomasz Napierala errno = EINVAL; 44aa015c8eSEdward Tomasz Napierala 45aa015c8eSEdward Tomasz Napierala return (1); 46aa015c8eSEdward Tomasz Napierala } 47aa015c8eSEdward Tomasz Napierala 48aa015c8eSEdward Tomasz Napierala int 49aa015c8eSEdward Tomasz Napierala acl_add_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 50aa015c8eSEdward Tomasz Napierala { 51aa015c8eSEdward Tomasz Napierala 52aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 53aa015c8eSEdward Tomasz Napierala errno = EINVAL; 54aa015c8eSEdward Tomasz Napierala return (-1); 55aa015c8eSEdward Tomasz Napierala } 56aa015c8eSEdward Tomasz Napierala 57aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 58aa015c8eSEdward Tomasz Napierala return (-1); 59aa015c8eSEdward Tomasz Napierala 60aa015c8eSEdward Tomasz Napierala *flagset_d |= flag; 61aa015c8eSEdward Tomasz Napierala 62aa015c8eSEdward Tomasz Napierala return (0); 63aa015c8eSEdward Tomasz Napierala } 64aa015c8eSEdward Tomasz Napierala 65aa015c8eSEdward Tomasz Napierala int 66aa015c8eSEdward Tomasz Napierala acl_clear_flags_np(acl_flagset_t flagset_d) 67aa015c8eSEdward Tomasz Napierala { 68aa015c8eSEdward Tomasz Napierala 69aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 70aa015c8eSEdward Tomasz Napierala errno = EINVAL; 71aa015c8eSEdward Tomasz Napierala return (-1); 72aa015c8eSEdward Tomasz Napierala } 73aa015c8eSEdward Tomasz Napierala 74aa015c8eSEdward Tomasz Napierala *flagset_d |= 0; 75aa015c8eSEdward Tomasz Napierala 76aa015c8eSEdward Tomasz Napierala return (0); 77aa015c8eSEdward Tomasz Napierala } 78aa015c8eSEdward Tomasz Napierala 79aa015c8eSEdward Tomasz Napierala int 80aa015c8eSEdward Tomasz Napierala acl_delete_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 81aa015c8eSEdward Tomasz Napierala { 82aa015c8eSEdward Tomasz Napierala 83aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 84aa015c8eSEdward Tomasz Napierala errno = EINVAL; 85aa015c8eSEdward Tomasz Napierala return (-1); 86aa015c8eSEdward Tomasz Napierala } 87aa015c8eSEdward Tomasz Napierala 88aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 89aa015c8eSEdward Tomasz Napierala return (-1); 90aa015c8eSEdward Tomasz Napierala 91aa015c8eSEdward Tomasz Napierala *flagset_d &= ~flag; 92aa015c8eSEdward Tomasz Napierala 93aa015c8eSEdward Tomasz Napierala return (0); 94aa015c8eSEdward Tomasz Napierala } 95aa015c8eSEdward Tomasz Napierala 96aa015c8eSEdward Tomasz Napierala int 97aa015c8eSEdward Tomasz Napierala acl_get_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 98aa015c8eSEdward Tomasz Napierala { 99aa015c8eSEdward Tomasz Napierala 100aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 101aa015c8eSEdward Tomasz Napierala errno = EINVAL; 102aa015c8eSEdward Tomasz Napierala return (-1); 103aa015c8eSEdward Tomasz Napierala } 104aa015c8eSEdward Tomasz Napierala 105aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 106aa015c8eSEdward Tomasz Napierala return (-1); 107aa015c8eSEdward Tomasz Napierala 108aa015c8eSEdward Tomasz Napierala if (*flagset_d & flag) 109aa015c8eSEdward Tomasz Napierala return (1); 110aa015c8eSEdward Tomasz Napierala 111aa015c8eSEdward Tomasz Napierala return (0); 112aa015c8eSEdward Tomasz Napierala } 113aa015c8eSEdward Tomasz Napierala 114aa015c8eSEdward Tomasz Napierala int 115aa015c8eSEdward Tomasz Napierala acl_get_flagset_np(acl_entry_t entry_d, acl_flagset_t *flagset_p) 116aa015c8eSEdward Tomasz Napierala { 117aa015c8eSEdward Tomasz Napierala 118aa015c8eSEdward Tomasz Napierala if (entry_d == NULL || flagset_p == NULL) { 119aa015c8eSEdward Tomasz Napierala errno = EINVAL; 120aa015c8eSEdward Tomasz Napierala return (-1); 121aa015c8eSEdward Tomasz Napierala } 122aa015c8eSEdward Tomasz Napierala 123aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 124aa015c8eSEdward Tomasz Napierala errno = EINVAL; 125aa015c8eSEdward Tomasz Napierala return (-1); 126aa015c8eSEdward Tomasz Napierala } 127aa015c8eSEdward Tomasz Napierala 128aa015c8eSEdward Tomasz Napierala *flagset_p = &entry_d->ae_flags; 129aa015c8eSEdward Tomasz Napierala 130aa015c8eSEdward Tomasz Napierala return (0); 131aa015c8eSEdward Tomasz Napierala } 132aa015c8eSEdward Tomasz Napierala 133aa015c8eSEdward Tomasz Napierala int 134aa015c8eSEdward Tomasz Napierala acl_set_flagset_np(acl_entry_t entry_d, acl_flagset_t flagset_d) 135aa015c8eSEdward Tomasz Napierala { 136aa015c8eSEdward Tomasz Napierala 137aa015c8eSEdward Tomasz Napierala if (entry_d == NULL) { 138aa015c8eSEdward Tomasz Napierala errno = EINVAL; 139aa015c8eSEdward Tomasz Napierala return (-1); 140aa015c8eSEdward Tomasz Napierala } 141aa015c8eSEdward Tomasz Napierala 142aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 143aa015c8eSEdward Tomasz Napierala errno = EINVAL; 144aa015c8eSEdward Tomasz Napierala return (-1); 145aa015c8eSEdward Tomasz Napierala } 146aa015c8eSEdward Tomasz Napierala 147aa015c8eSEdward Tomasz Napierala _entry_brand_as(entry_d, ACL_BRAND_NFS4); 148aa015c8eSEdward Tomasz Napierala 149aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(*flagset_d)) 150aa015c8eSEdward Tomasz Napierala return (-1); 151aa015c8eSEdward Tomasz Napierala 152aa015c8eSEdward Tomasz Napierala entry_d->ae_flags = *flagset_d; 153aa015c8eSEdward Tomasz Napierala 154aa015c8eSEdward Tomasz Napierala return (0); 155aa015c8eSEdward Tomasz Napierala } 156aa015c8eSEdward Tomasz Napierala /*- 157aa015c8eSEdward Tomasz Napierala * Copyright (c) 2008, 2009 Edward Tomasz Napierała <trasz@FreeBSD.org> 158aa015c8eSEdward Tomasz Napierala * All rights reserved. 159aa015c8eSEdward Tomasz Napierala * 160aa015c8eSEdward Tomasz Napierala * Redistribution and use in source and binary forms, with or without 161aa015c8eSEdward Tomasz Napierala * modification, are permitted provided that the following conditions 162aa015c8eSEdward Tomasz Napierala * are met: 163aa015c8eSEdward Tomasz Napierala * 1. Redistributions of source code must retain the above copyright 164aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer. 165aa015c8eSEdward Tomasz Napierala * 2. Redistributions in binary form must reproduce the above copyright 166aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer in the 167aa015c8eSEdward Tomasz Napierala * documentation and/or other materials provided with the distribution. 168aa015c8eSEdward Tomasz Napierala * 169aa015c8eSEdward Tomasz Napierala * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 170aa015c8eSEdward Tomasz Napierala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 171aa015c8eSEdward Tomasz Napierala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 172aa015c8eSEdward Tomasz Napierala * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 173aa015c8eSEdward Tomasz Napierala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 174aa015c8eSEdward Tomasz Napierala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 175aa015c8eSEdward Tomasz Napierala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 176aa015c8eSEdward Tomasz Napierala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 177aa015c8eSEdward Tomasz Napierala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 178aa015c8eSEdward Tomasz Napierala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 179aa015c8eSEdward Tomasz Napierala * SUCH DAMAGE. 180aa015c8eSEdward Tomasz Napierala */ 181aa015c8eSEdward Tomasz Napierala 182aa015c8eSEdward Tomasz Napierala #include <sys/cdefs.h> 183aa015c8eSEdward Tomasz Napierala __FBSDID("$FreeBSD$"); 184aa015c8eSEdward Tomasz Napierala 185aa015c8eSEdward Tomasz Napierala #include <stdio.h> 186aa015c8eSEdward Tomasz Napierala #include <errno.h> 187aa015c8eSEdward Tomasz Napierala #include <sys/acl.h> 188aa015c8eSEdward Tomasz Napierala 189aa015c8eSEdward Tomasz Napierala #include "acl_support.h" 190aa015c8eSEdward Tomasz Napierala 191aa015c8eSEdward Tomasz Napierala static int 192aa015c8eSEdward Tomasz Napierala _flag_is_invalid(acl_flag_t flag) 193aa015c8eSEdward Tomasz Napierala { 194aa015c8eSEdward Tomasz Napierala 195aa015c8eSEdward Tomasz Napierala if ((flag & ACL_FLAGS_BITS) == flag) 196aa015c8eSEdward Tomasz Napierala return (0); 197aa015c8eSEdward Tomasz Napierala 198aa015c8eSEdward Tomasz Napierala errno = EINVAL; 199aa015c8eSEdward Tomasz Napierala 200aa015c8eSEdward Tomasz Napierala return (1); 201aa015c8eSEdward Tomasz Napierala } 202aa015c8eSEdward Tomasz Napierala 203aa015c8eSEdward Tomasz Napierala int 204aa015c8eSEdward Tomasz Napierala acl_add_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 205aa015c8eSEdward Tomasz Napierala { 206aa015c8eSEdward Tomasz Napierala 207aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 208aa015c8eSEdward Tomasz Napierala errno = EINVAL; 209aa015c8eSEdward Tomasz Napierala return (-1); 210aa015c8eSEdward Tomasz Napierala } 211aa015c8eSEdward Tomasz Napierala 212aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 213aa015c8eSEdward Tomasz Napierala return (-1); 214aa015c8eSEdward Tomasz Napierala 215aa015c8eSEdward Tomasz Napierala *flagset_d |= flag; 216aa015c8eSEdward Tomasz Napierala 217aa015c8eSEdward Tomasz Napierala return (0); 218aa015c8eSEdward Tomasz Napierala } 219aa015c8eSEdward Tomasz Napierala 220aa015c8eSEdward Tomasz Napierala int 221aa015c8eSEdward Tomasz Napierala acl_clear_flags_np(acl_flagset_t flagset_d) 222aa015c8eSEdward Tomasz Napierala { 223aa015c8eSEdward Tomasz Napierala 224aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 225aa015c8eSEdward Tomasz Napierala errno = EINVAL; 226aa015c8eSEdward Tomasz Napierala return (-1); 227aa015c8eSEdward Tomasz Napierala } 228aa015c8eSEdward Tomasz Napierala 229aa015c8eSEdward Tomasz Napierala *flagset_d |= 0; 230aa015c8eSEdward Tomasz Napierala 231aa015c8eSEdward Tomasz Napierala return (0); 232aa015c8eSEdward Tomasz Napierala } 233aa015c8eSEdward Tomasz Napierala 234aa015c8eSEdward Tomasz Napierala int 235aa015c8eSEdward Tomasz Napierala acl_delete_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 236aa015c8eSEdward Tomasz Napierala { 237aa015c8eSEdward Tomasz Napierala 238aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 239aa015c8eSEdward Tomasz Napierala errno = EINVAL; 240aa015c8eSEdward Tomasz Napierala return (-1); 241aa015c8eSEdward Tomasz Napierala } 242aa015c8eSEdward Tomasz Napierala 243aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 244aa015c8eSEdward Tomasz Napierala return (-1); 245aa015c8eSEdward Tomasz Napierala 246aa015c8eSEdward Tomasz Napierala *flagset_d &= ~flag; 247aa015c8eSEdward Tomasz Napierala 248aa015c8eSEdward Tomasz Napierala return (0); 249aa015c8eSEdward Tomasz Napierala } 250aa015c8eSEdward Tomasz Napierala 251aa015c8eSEdward Tomasz Napierala int 252aa015c8eSEdward Tomasz Napierala acl_get_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 253aa015c8eSEdward Tomasz Napierala { 254aa015c8eSEdward Tomasz Napierala 255aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 256aa015c8eSEdward Tomasz Napierala errno = EINVAL; 257aa015c8eSEdward Tomasz Napierala return (-1); 258aa015c8eSEdward Tomasz Napierala } 259aa015c8eSEdward Tomasz Napierala 260aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 261aa015c8eSEdward Tomasz Napierala return (-1); 262aa015c8eSEdward Tomasz Napierala 263aa015c8eSEdward Tomasz Napierala if (*flagset_d & flag) 264aa015c8eSEdward Tomasz Napierala return (1); 265aa015c8eSEdward Tomasz Napierala 266aa015c8eSEdward Tomasz Napierala return (0); 267aa015c8eSEdward Tomasz Napierala } 268aa015c8eSEdward Tomasz Napierala 269aa015c8eSEdward Tomasz Napierala int 270aa015c8eSEdward Tomasz Napierala acl_get_flagset_np(acl_entry_t entry_d, acl_flagset_t *flagset_p) 271aa015c8eSEdward Tomasz Napierala { 272aa015c8eSEdward Tomasz Napierala 273aa015c8eSEdward Tomasz Napierala if (entry_d == NULL || flagset_p == NULL) { 274aa015c8eSEdward Tomasz Napierala errno = EINVAL; 275aa015c8eSEdward Tomasz Napierala return (-1); 276aa015c8eSEdward Tomasz Napierala } 277aa015c8eSEdward Tomasz Napierala 278aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 279aa015c8eSEdward Tomasz Napierala errno = EINVAL; 280aa015c8eSEdward Tomasz Napierala return (-1); 281aa015c8eSEdward Tomasz Napierala } 282aa015c8eSEdward Tomasz Napierala 283aa015c8eSEdward Tomasz Napierala *flagset_p = &entry_d->ae_flags; 284aa015c8eSEdward Tomasz Napierala 285aa015c8eSEdward Tomasz Napierala return (0); 286aa015c8eSEdward Tomasz Napierala } 287aa015c8eSEdward Tomasz Napierala 288aa015c8eSEdward Tomasz Napierala int 289aa015c8eSEdward Tomasz Napierala acl_set_flagset_np(acl_entry_t entry_d, acl_flagset_t flagset_d) 290aa015c8eSEdward Tomasz Napierala { 291aa015c8eSEdward Tomasz Napierala 292aa015c8eSEdward Tomasz Napierala if (entry_d == NULL) { 293aa015c8eSEdward Tomasz Napierala errno = EINVAL; 294aa015c8eSEdward Tomasz Napierala return (-1); 295aa015c8eSEdward Tomasz Napierala } 296aa015c8eSEdward Tomasz Napierala 297aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 298aa015c8eSEdward Tomasz Napierala errno = EINVAL; 299aa015c8eSEdward Tomasz Napierala return (-1); 300aa015c8eSEdward Tomasz Napierala } 301aa015c8eSEdward Tomasz Napierala 302aa015c8eSEdward Tomasz Napierala _entry_brand_as(entry_d, ACL_BRAND_NFS4); 303aa015c8eSEdward Tomasz Napierala 304aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(*flagset_d)) 305aa015c8eSEdward Tomasz Napierala return (-1); 306aa015c8eSEdward Tomasz Napierala 307aa015c8eSEdward Tomasz Napierala entry_d->ae_flags = *flagset_d; 308aa015c8eSEdward Tomasz Napierala 309aa015c8eSEdward Tomasz Napierala return (0); 310aa015c8eSEdward Tomasz Napierala } 311aa015c8eSEdward Tomasz Napierala /*- 312aa015c8eSEdward Tomasz Napierala * Copyright (c) 2008, 2009 Edward Tomasz Napierała <trasz@FreeBSD.org> 313aa015c8eSEdward Tomasz Napierala * All rights reserved. 314aa015c8eSEdward Tomasz Napierala * 315aa015c8eSEdward Tomasz Napierala * Redistribution and use in source and binary forms, with or without 316aa015c8eSEdward Tomasz Napierala * modification, are permitted provided that the following conditions 317aa015c8eSEdward Tomasz Napierala * are met: 318aa015c8eSEdward Tomasz Napierala * 1. Redistributions of source code must retain the above copyright 319aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer. 320aa015c8eSEdward Tomasz Napierala * 2. Redistributions in binary form must reproduce the above copyright 321aa015c8eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer in the 322aa015c8eSEdward Tomasz Napierala * documentation and/or other materials provided with the distribution. 323aa015c8eSEdward Tomasz Napierala * 324aa015c8eSEdward Tomasz Napierala * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 325aa015c8eSEdward Tomasz Napierala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 326aa015c8eSEdward Tomasz Napierala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 327aa015c8eSEdward Tomasz Napierala * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 328aa015c8eSEdward Tomasz Napierala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 329aa015c8eSEdward Tomasz Napierala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 330aa015c8eSEdward Tomasz Napierala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 331aa015c8eSEdward Tomasz Napierala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 332aa015c8eSEdward Tomasz Napierala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 333aa015c8eSEdward Tomasz Napierala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 334aa015c8eSEdward Tomasz Napierala * SUCH DAMAGE. 335aa015c8eSEdward Tomasz Napierala */ 336aa015c8eSEdward Tomasz Napierala 337aa015c8eSEdward Tomasz Napierala #include <sys/cdefs.h> 338aa015c8eSEdward Tomasz Napierala __FBSDID("$FreeBSD$"); 339aa015c8eSEdward Tomasz Napierala 340aa015c8eSEdward Tomasz Napierala #include <stdio.h> 341aa015c8eSEdward Tomasz Napierala #include <errno.h> 342aa015c8eSEdward Tomasz Napierala #include <sys/acl.h> 343aa015c8eSEdward Tomasz Napierala 344aa015c8eSEdward Tomasz Napierala #include "acl_support.h" 345aa015c8eSEdward Tomasz Napierala 346aa015c8eSEdward Tomasz Napierala static int 347aa015c8eSEdward Tomasz Napierala _flag_is_invalid(acl_flag_t flag) 348aa015c8eSEdward Tomasz Napierala { 349aa015c8eSEdward Tomasz Napierala 350aa015c8eSEdward Tomasz Napierala if ((flag & ACL_FLAGS_BITS) == flag) 351aa015c8eSEdward Tomasz Napierala return (0); 352aa015c8eSEdward Tomasz Napierala 353aa015c8eSEdward Tomasz Napierala errno = EINVAL; 354aa015c8eSEdward Tomasz Napierala 355aa015c8eSEdward Tomasz Napierala return (1); 356aa015c8eSEdward Tomasz Napierala } 357aa015c8eSEdward Tomasz Napierala 358aa015c8eSEdward Tomasz Napierala int 359aa015c8eSEdward Tomasz Napierala acl_add_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 360aa015c8eSEdward Tomasz Napierala { 361aa015c8eSEdward Tomasz Napierala 362aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 363aa015c8eSEdward Tomasz Napierala errno = EINVAL; 364aa015c8eSEdward Tomasz Napierala return (-1); 365aa015c8eSEdward Tomasz Napierala } 366aa015c8eSEdward Tomasz Napierala 367aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 368aa015c8eSEdward Tomasz Napierala return (-1); 369aa015c8eSEdward Tomasz Napierala 370aa015c8eSEdward Tomasz Napierala *flagset_d |= flag; 371aa015c8eSEdward Tomasz Napierala 372aa015c8eSEdward Tomasz Napierala return (0); 373aa015c8eSEdward Tomasz Napierala } 374aa015c8eSEdward Tomasz Napierala 375aa015c8eSEdward Tomasz Napierala int 376aa015c8eSEdward Tomasz Napierala acl_clear_flags_np(acl_flagset_t flagset_d) 377aa015c8eSEdward Tomasz Napierala { 378aa015c8eSEdward Tomasz Napierala 379aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 380aa015c8eSEdward Tomasz Napierala errno = EINVAL; 381aa015c8eSEdward Tomasz Napierala return (-1); 382aa015c8eSEdward Tomasz Napierala } 383aa015c8eSEdward Tomasz Napierala 384aa015c8eSEdward Tomasz Napierala *flagset_d |= 0; 385aa015c8eSEdward Tomasz Napierala 386aa015c8eSEdward Tomasz Napierala return (0); 387aa015c8eSEdward Tomasz Napierala } 388aa015c8eSEdward Tomasz Napierala 389aa015c8eSEdward Tomasz Napierala int 390aa015c8eSEdward Tomasz Napierala acl_delete_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 391aa015c8eSEdward Tomasz Napierala { 392aa015c8eSEdward Tomasz Napierala 393aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 394aa015c8eSEdward Tomasz Napierala errno = EINVAL; 395aa015c8eSEdward Tomasz Napierala return (-1); 396aa015c8eSEdward Tomasz Napierala } 397aa015c8eSEdward Tomasz Napierala 398aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 399aa015c8eSEdward Tomasz Napierala return (-1); 400aa015c8eSEdward Tomasz Napierala 401aa015c8eSEdward Tomasz Napierala *flagset_d &= ~flag; 402aa015c8eSEdward Tomasz Napierala 403aa015c8eSEdward Tomasz Napierala return (0); 404aa015c8eSEdward Tomasz Napierala } 405aa015c8eSEdward Tomasz Napierala 406aa015c8eSEdward Tomasz Napierala int 407aa015c8eSEdward Tomasz Napierala acl_get_flag_np(acl_flagset_t flagset_d, acl_flag_t flag) 408aa015c8eSEdward Tomasz Napierala { 409aa015c8eSEdward Tomasz Napierala 410aa015c8eSEdward Tomasz Napierala if (flagset_d == NULL) { 411aa015c8eSEdward Tomasz Napierala errno = EINVAL; 412aa015c8eSEdward Tomasz Napierala return (-1); 413aa015c8eSEdward Tomasz Napierala } 414aa015c8eSEdward Tomasz Napierala 415aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(flag)) 416aa015c8eSEdward Tomasz Napierala return (-1); 417aa015c8eSEdward Tomasz Napierala 418aa015c8eSEdward Tomasz Napierala if (*flagset_d & flag) 419aa015c8eSEdward Tomasz Napierala return (1); 420aa015c8eSEdward Tomasz Napierala 421aa015c8eSEdward Tomasz Napierala return (0); 422aa015c8eSEdward Tomasz Napierala } 423aa015c8eSEdward Tomasz Napierala 424aa015c8eSEdward Tomasz Napierala int 425aa015c8eSEdward Tomasz Napierala acl_get_flagset_np(acl_entry_t entry_d, acl_flagset_t *flagset_p) 426aa015c8eSEdward Tomasz Napierala { 427aa015c8eSEdward Tomasz Napierala 428aa015c8eSEdward Tomasz Napierala if (entry_d == NULL || flagset_p == NULL) { 429aa015c8eSEdward Tomasz Napierala errno = EINVAL; 430aa015c8eSEdward Tomasz Napierala return (-1); 431aa015c8eSEdward Tomasz Napierala } 432aa015c8eSEdward Tomasz Napierala 433aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 434aa015c8eSEdward Tomasz Napierala errno = EINVAL; 435aa015c8eSEdward Tomasz Napierala return (-1); 436aa015c8eSEdward Tomasz Napierala } 437aa015c8eSEdward Tomasz Napierala 438aa015c8eSEdward Tomasz Napierala *flagset_p = &entry_d->ae_flags; 439aa015c8eSEdward Tomasz Napierala 440aa015c8eSEdward Tomasz Napierala return (0); 441aa015c8eSEdward Tomasz Napierala } 442aa015c8eSEdward Tomasz Napierala 443aa015c8eSEdward Tomasz Napierala int 444aa015c8eSEdward Tomasz Napierala acl_set_flagset_np(acl_entry_t entry_d, acl_flagset_t flagset_d) 445aa015c8eSEdward Tomasz Napierala { 446aa015c8eSEdward Tomasz Napierala 447aa015c8eSEdward Tomasz Napierala if (entry_d == NULL) { 448aa015c8eSEdward Tomasz Napierala errno = EINVAL; 449aa015c8eSEdward Tomasz Napierala return (-1); 450aa015c8eSEdward Tomasz Napierala } 451aa015c8eSEdward Tomasz Napierala 452aa015c8eSEdward Tomasz Napierala if (!_entry_brand_may_be(entry_d, ACL_BRAND_NFS4)) { 453aa015c8eSEdward Tomasz Napierala errno = EINVAL; 454aa015c8eSEdward Tomasz Napierala return (-1); 455aa015c8eSEdward Tomasz Napierala } 456aa015c8eSEdward Tomasz Napierala 457aa015c8eSEdward Tomasz Napierala _entry_brand_as(entry_d, ACL_BRAND_NFS4); 458aa015c8eSEdward Tomasz Napierala 459aa015c8eSEdward Tomasz Napierala if (_flag_is_invalid(*flagset_d)) 460aa015c8eSEdward Tomasz Napierala return (-1); 461aa015c8eSEdward Tomasz Napierala 462aa015c8eSEdward Tomasz Napierala entry_d->ae_flags = *flagset_d; 463aa015c8eSEdward Tomasz Napierala 464aa015c8eSEdward Tomasz Napierala return (0); 465aa015c8eSEdward Tomasz Napierala } 466