114721edaSChris D. Faulhaber /* 2e76872c1SChris D. Faulhaber * Copyright (c) 2001-2002 Chris D. Faulhaber 314721edaSChris D. Faulhaber * All rights reserved. 414721edaSChris D. Faulhaber * 514721edaSChris D. Faulhaber * Redistribution and use in source and binary forms, with or without 614721edaSChris D. Faulhaber * modification, are permitted provided that the following conditions 714721edaSChris D. Faulhaber * are met: 814721edaSChris D. Faulhaber * 1. Redistributions of source code must retain the above copyright 914721edaSChris D. Faulhaber * notice, this list of conditions and the following disclaimer. 1014721edaSChris D. Faulhaber * 2. Redistributions in binary form must reproduce the above copyright 1114721edaSChris D. Faulhaber * notice, this list of conditions and the following disclaimer in the 1214721edaSChris D. Faulhaber * documentation and/or other materials provided with the distribution. 1314721edaSChris D. Faulhaber * 1414721edaSChris D. Faulhaber * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1514721edaSChris D. Faulhaber * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1614721edaSChris D. Faulhaber * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1714721edaSChris D. Faulhaber * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1814721edaSChris D. Faulhaber * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1914721edaSChris D. Faulhaber * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2014721edaSChris D. Faulhaber * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2114721edaSChris D. Faulhaber * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2214721edaSChris D. Faulhaber * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2314721edaSChris D. Faulhaber * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2414721edaSChris D. Faulhaber * SUCH DAMAGE. 2514721edaSChris D. Faulhaber */ 2614721edaSChris D. Faulhaber 27333fc21eSDavid E. O'Brien #include <sys/cdefs.h> 28333fc21eSDavid E. O'Brien __FBSDID("$FreeBSD$"); 29333fc21eSDavid E. O'Brien 3014721edaSChris D. Faulhaber #include <sys/types.h> 317bd44e92SThomas Moestl #include "namespace.h" 3214721edaSChris D. Faulhaber #include <sys/acl.h> 337bd44e92SThomas Moestl #include "un-namespace.h" 3414721edaSChris D. Faulhaber #include <errno.h> 3514721edaSChris D. Faulhaber #include <string.h> 3614721edaSChris D. Faulhaber 370f626307SChris D. Faulhaber /* 380f626307SChris D. Faulhaber * acl_delete_entry() (23.4.9): remove the ACL entry indicated by entry_d 390f626307SChris D. Faulhaber * from acl. 400f626307SChris D. Faulhaber */ 4114721edaSChris D. Faulhaber int 4214721edaSChris D. Faulhaber acl_delete_entry(acl_t acl, acl_entry_t entry_d) 4314721edaSChris D. Faulhaber { 440f626307SChris D. Faulhaber struct acl *acl_int; 4514721edaSChris D. Faulhaber int i; 4614721edaSChris D. Faulhaber 47e76872c1SChris D. Faulhaber if (acl == NULL || entry_d == NULL) { 4814721edaSChris D. Faulhaber errno = EINVAL; 49e76872c1SChris D. Faulhaber return (-1); 5014721edaSChris D. Faulhaber } 510f626307SChris D. Faulhaber 520f626307SChris D. Faulhaber acl_int = &acl->ats_acl; 530f626307SChris D. Faulhaber 540f626307SChris D. Faulhaber if ((acl->ats_acl.acl_cnt < 1) || 550f626307SChris D. Faulhaber (acl->ats_acl.acl_cnt > ACL_MAX_ENTRIES)) { 560f626307SChris D. Faulhaber errno = EINVAL; 57e76872c1SChris D. Faulhaber return (-1); 580f626307SChris D. Faulhaber } 590f626307SChris D. Faulhaber for (i = 0; i < acl->ats_acl.acl_cnt; i++) { 6014721edaSChris D. Faulhaber /* if this is our entry... */ 610f626307SChris D. Faulhaber if ((acl->ats_acl.acl_entry[i].ae_tag == entry_d->ae_tag) && 620f626307SChris D. Faulhaber (acl->ats_acl.acl_entry[i].ae_id == entry_d->ae_id)) { 6314721edaSChris D. Faulhaber /* ...shift the remaining entries... */ 642a8d656dSJacques Vidrine for (; i < acl->ats_acl.acl_cnt - 1; ++i) 650f626307SChris D. Faulhaber acl->ats_acl.acl_entry[i] = 66ff5fe653SJacques Vidrine acl->ats_acl.acl_entry[i+1]; 6714721edaSChris D. Faulhaber /* ...drop the count and zero the unused entry... */ 680f626307SChris D. Faulhaber acl->ats_acl.acl_cnt--; 690f626307SChris D. Faulhaber bzero(&acl->ats_acl.acl_entry[i], 700f626307SChris D. Faulhaber sizeof(struct acl_entry)); 710f626307SChris D. Faulhaber acl->ats_cur_entry = 0; 72e76872c1SChris D. Faulhaber return (0); 7314721edaSChris D. Faulhaber } 7414721edaSChris D. Faulhaber } 7514721edaSChris D. Faulhaber 7614721edaSChris D. Faulhaber 7714721edaSChris D. Faulhaber errno = EINVAL; 78e76872c1SChris D. Faulhaber return (-1); 7914721edaSChris D. Faulhaber } 80