Annotation of embedaddon/dhcp/common/memory.c, revision 1.1

1.1     ! misho       1: /* memory.c
        !             2: 
        !             3:    Memory-resident database... */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2004,2007,2009 by Internet Systems Consortium, Inc. ("ISC")
        !             7:  * Copyright (c) 1995-2003 by Internet Software Consortium
        !             8:  *
        !             9:  * Permission to use, copy, modify, and distribute this software for any
        !            10:  * purpose with or without fee is hereby granted, provided that the above
        !            11:  * copyright notice and this permission notice appear in all copies.
        !            12:  *
        !            13:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
        !            14:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            15:  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
        !            16:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            17:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            18:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
        !            19:  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            20:  *
        !            21:  *   Internet Systems Consortium, Inc.
        !            22:  *   950 Charter Street
        !            23:  *   Redwood City, CA 94063
        !            24:  *   <info@isc.org>
        !            25:  *   https://www.isc.org/
        !            26:  *
        !            27:  * This software has been written for Internet Systems Consortium
        !            28:  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
        !            29:  * To learn more about Internet Systems Consortium, see
        !            30:  * ``https://www.isc.org/''.  To learn more about Vixie Enterprises,
        !            31:  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
        !            32:  * ``http://www.nominum.com''.
        !            33:  */
        !            34: 
        !            35: #include "dhcpd.h"
        !            36: 
        !            37: struct group *root_group;
        !            38: group_hash_t *group_name_hash;
        !            39: int (*group_write_hook) (struct group_object *);
        !            40: 
        !            41: isc_result_t delete_group (struct group_object *group, int writep)
        !            42: {
        !            43:        struct group_object *d;
        !            44: 
        !            45:        /* The group should exist and be hashed - if not, it's invalid. */
        !            46:        if (group_name_hash) {
        !            47:                d = (struct group_object *)0;
        !            48:                group_hash_lookup (&d, group_name_hash, group -> name,
        !            49:                                   strlen (group -> name), MDL);
        !            50:        } else
        !            51:                return ISC_R_INVALIDARG;
        !            52:        if (!d)
        !            53:                return ISC_R_INVALIDARG;
        !            54: 
        !            55:        /* Also not okay to delete a group that's not the one in
        !            56:           the hash table. */
        !            57:        if (d != group)
        !            58:                return ISC_R_INVALIDARG;
        !            59: 
        !            60:        /* If it's dynamic, and we're deleting it, we can just blow away the
        !            61:           hash table entry. */
        !            62:        if ((group -> flags & GROUP_OBJECT_DYNAMIC) &&
        !            63:            !(group -> flags & GROUP_OBJECT_STATIC)) {
        !            64:                group_hash_delete (group_name_hash,
        !            65:                                   group -> name, strlen (group -> name), MDL);
        !            66:        } else {
        !            67:                group -> flags |= GROUP_OBJECT_DELETED;
        !            68:                if (group -> group)
        !            69:                        group_dereference (&group -> group, MDL);
        !            70:        }
        !            71: 
        !            72:        /* Store the group declaration in the lease file. */
        !            73:        if (writep && group_write_hook) {
        !            74:                if (!(*group_write_hook) (group))
        !            75:                        return ISC_R_IOERROR;
        !            76:        }
        !            77:        return ISC_R_SUCCESS;
        !            78: }
        !            79: 
        !            80: isc_result_t supersede_group (struct group_object *group, int writep)
        !            81: {
        !            82:        struct group_object *t;
        !            83: 
        !            84:        /* Register the group in the group name hash table,
        !            85:           so we can look it up later. */
        !            86:        if (group_name_hash) {
        !            87:                t = (struct group_object *)0;
        !            88:                group_hash_lookup (&t, group_name_hash,
        !            89:                        group -> name,
        !            90:                             strlen (group -> name), MDL);
        !            91:                if (t && t != group) {
        !            92:                        /* If this isn't a dynamic entry, then we need to flag
        !            93:                           the replacement as not dynamic either - otherwise,
        !            94:                           if the dynamic entry is deleted later, the static
        !            95:                           entry will come back next time the server is stopped
        !            96:                           and restarted. */
        !            97:                        if (!(t -> flags & GROUP_OBJECT_DYNAMIC))
        !            98:                                group -> flags |= GROUP_OBJECT_STATIC;
        !            99: 
        !           100:                        /* Delete the old object if it hasn't already been
        !           101:                           deleted.  If it has already been deleted, get rid of
        !           102:                           the hash table entry.  This is a legitimate
        !           103:                           situation - a deleted static object needs to be kept
        !           104:                           around so we remember it's deleted. */
        !           105:                        if (!(t -> flags & GROUP_OBJECT_DELETED))
        !           106:                                delete_group (t, 0);
        !           107:                        else {
        !           108:                                group_hash_delete (group_name_hash,
        !           109:                                                   group -> name,
        !           110:                                                   strlen (group -> name),
        !           111:                                                   MDL);
        !           112:                                group_object_dereference (&t, MDL);
        !           113:                        }
        !           114:                }
        !           115:        } else {
        !           116:                group_new_hash(&group_name_hash, GROUP_HASH_SIZE, MDL);
        !           117:                t = (struct group_object *)0;
        !           118:        }
        !           119: 
        !           120:        /* Add the group to the group name hash if it's not
        !           121:           already there, and also thread it into the list of
        !           122:           dynamic groups if appropriate. */
        !           123:        if (!t) {
        !           124:                group_hash_add (group_name_hash, group -> name,
        !           125:                                strlen (group -> name), group, MDL);
        !           126:        }
        !           127: 
        !           128:        /* Store the group declaration in the lease file. */
        !           129:        if (writep && group_write_hook) {
        !           130:                if (!(*group_write_hook) (group))
        !           131:                        return ISC_R_IOERROR;
        !           132:        }
        !           133:        return ISC_R_SUCCESS;
        !           134: }
        !           135: 
        !           136: int clone_group (struct group **gp, struct group *group,
        !           137:                 const char *file, int line)
        !           138: {
        !           139:        struct group *g = (struct group *)0;
        !           140: 
        !           141:        /* Normally gp should contain the null pointer, but for convenience
        !           142:           it's permissible to clone a group into itself. */
        !           143:        if (*gp && *gp != group)
        !           144:                return 0;
        !           145:        if (!group_allocate (&g, file, line))
        !           146:                return 0;
        !           147:        if (group == *gp)
        !           148:                *gp = (struct group *)0;
        !           149:        group_reference (gp, g, file, line);
        !           150:        g -> authoritative = group -> authoritative;
        !           151:        group_reference (&g -> next, group, file, line);
        !           152:        group_dereference (&g, file, line);
        !           153:        return 1;
        !           154: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>