Annotation of embedaddon/dhcp/server/stables.c, revision 1.1

1.1     ! misho       1: /* stables.c
        !             2: 
        !             3:    Tables of information only used by server... */
        !             4: 
        !             5: /*
        !             6:  * Copyright (c) 2004-2011 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: #include <syslog.h>
        !            37: 
        !            38: #if defined (FAILOVER_PROTOCOL)
        !            39: 
        !            40: /* This is used to indicate some kind of failure when generating a
        !            41:    failover option. */
        !            42: failover_option_t null_failover_option = { 0, 0 };
        !            43: failover_option_t skip_failover_option = { 0, 0 };
        !            44: 
        !            45: /* Information about failover options, for printing, encoding
        !            46:    and decoding. */
        !            47: struct failover_option_info ft_options [] =
        !            48: {
        !            49:        { 0, "unused", FT_UNDEF, 0, 0, 0 },
        !            50:        { FTO_ADDRESSES_TRANSFERRED, "addresses-transferred", FT_UINT32, 1,
        !            51:          FM_OFFSET(addresses_transferred), FTB_ADDRESSES_TRANSFERRED },
        !            52:        { FTO_ASSIGNED_IP_ADDRESS, "assigned-IP-address", FT_IPADDR, 1,
        !            53:          FM_OFFSET(assigned_addr), FTB_ASSIGNED_IP_ADDRESS },
        !            54:        { FTO_BINDING_STATUS, "binding-status", FT_UINT8, 1,
        !            55:          FM_OFFSET(binding_status), FTB_BINDING_STATUS },
        !            56:        { FTO_CLIENT_IDENTIFIER, "client-identifier", FT_BYTES, 0,
        !            57:          FM_OFFSET(client_identifier), FTB_CLIENT_IDENTIFIER },
        !            58:        { FTO_CHADDR, "client-hardware-address", FT_BYTES, 0,
        !            59:          FM_OFFSET(chaddr), FTB_CHADDR },
        !            60:        { FTO_CLTT, "client-last-transaction-time", FT_UINT32, 1,
        !            61:          FM_OFFSET(cltt), FTB_CLTT },
        !            62:        { FTO_REPLY_OPTIONS, "client-reply-options", FT_BYTES, 0,
        !            63:          FM_OFFSET(reply_options), FTB_REPLY_OPTIONS },
        !            64:        { FTO_REQUEST_OPTIONS, "client-request-options", FT_BYTES, 0,
        !            65:          FM_OFFSET(request_options), FTB_REQUEST_OPTIONS },
        !            66:        { FTO_DDNS, "DDNS", FT_DDNS, 1, FM_OFFSET(ddns), FTB_DDNS },
        !            67:        { FTO_DELAYED_SERVICE, "delayed-service", FT_UINT8, 1,
        !            68:          FM_OFFSET(delayed_service), FTB_DELAYED_SERVICE },
        !            69:        { FTO_HBA, "hash-bucket-assignment", FT_BYTES, 0,
        !            70:          FM_OFFSET(hba), FTB_HBA },
        !            71:        { FTO_IP_FLAGS, "IP-flags", FT_UINT16, 1,
        !            72:          FM_OFFSET(ip_flags), FTB_IP_FLAGS },
        !            73:        { FTO_LEASE_EXPIRY, "lease-expiration-time", FT_UINT32, 1,
        !            74:          FM_OFFSET(expiry), FTB_LEASE_EXPIRY },
        !            75:        { FTO_MAX_UNACKED, "max-unacked-bndupd", FT_UINT32, 1, 
        !            76:          FM_OFFSET(max_unacked), FTB_MAX_UNACKED },
        !            77:        { FTO_MCLT, "MCLT", FT_UINT32, 1, FM_OFFSET(mclt), FTB_MCLT },
        !            78:        { FTO_MESSAGE, "message", FT_TEXT, 0,
        !            79:          FM_OFFSET(message), FTB_MESSAGE },
        !            80:        { FTO_MESSAGE_DIGEST, "message-digest", FT_BYTES, 0,
        !            81:          FM_OFFSET(message_digest), FTB_MESSAGE_DIGEST },
        !            82:        { FTO_POTENTIAL_EXPIRY, "potential-expiration-time", FT_UINT32, 1,
        !            83:          FM_OFFSET(potential_expiry), FTB_POTENTIAL_EXPIRY },
        !            84:        { FTO_RECEIVE_TIMER, "receive-timer", FT_UINT32, 1,
        !            85:          FM_OFFSET(receive_timer), FTB_RECEIVE_TIMER },
        !            86:        { FTO_PROTOCOL_VERSION, "protocol-version", FT_UINT8, 1,
        !            87:          FM_OFFSET(protocol_version), FTB_PROTOCOL_VERSION },
        !            88:        { FTO_REJECT_REASON, "reject-reason", FT_UINT8, 1,
        !            89:          FM_OFFSET(reject_reason), FTB_REJECT_REASON },
        !            90:        { FTO_RELATIONSHIP_NAME, "relationship-name", FT_BYTES, 0,
        !            91:          FM_OFFSET(relationship_name), FTB_RELATIONSHIP_NAME },
        !            92:        { FTO_SERVER_FLAGS, "server-flags", FT_UINT8, 1,
        !            93:          FM_OFFSET(server_flags), FTB_SERVER_FLAGS },
        !            94:        { FTO_SERVER_STATE, "server-state", FT_UINT8, 1,
        !            95:          FM_OFFSET(server_state), FTB_SERVER_STATE },
        !            96:        { FTO_STOS, "start-time-of-state", FT_UINT32, 1,
        !            97:          FM_OFFSET(stos), FTB_STOS },
        !            98:        { FTO_TLS_REPLY, "TLS-reply", FT_UINT8, 1,
        !            99:          FM_OFFSET(tls_reply), FTB_TLS_REPLY },
        !           100:        { FTO_TLS_REQUEST, "TLS-request", FT_UINT8, 1,
        !           101:          FM_OFFSET(tls_request), FTB_TLS_REQUEST },
        !           102:        { FTO_VENDOR_CLASS, "vendor-class-identifier", FT_BYTES, 0,
        !           103:          FM_OFFSET(vendor_class), FTB_VENDOR_CLASS },
        !           104:        { FTO_VENDOR_OPTIONS, "vendor-specific-options", FT_BYTES, 0,
        !           105:          FM_OFFSET(vendor_options), FTB_VENDOR_OPTIONS }
        !           106: };
        !           107: 
        !           108: /* These are really options that make sense for a particular request - if
        !           109:    some other option comes in, we're not going to use it, so we can just
        !           110:    discard it.  Note that the message-digest option is allowed for all
        !           111:    message types, but is not saved - it's just used to validate the message
        !           112:    and then discarded - so it's not mentioned here. */
        !           113: 
        !           114: u_int32_t fto_allowed [] = {
        !           115:        0,      /* 0 unused */
        !           116:        0,      /* 1 POOLREQ */
        !           117:        FTB_ADDRESSES_TRANSFERRED, /* 2 POOLRESP */
        !           118:        (FTB_ASSIGNED_IP_ADDRESS | FTB_BINDING_STATUS | FTB_CLIENT_IDENTIFIER |
        !           119:         FTB_CHADDR | FTB_DDNS | FTB_IP_FLAGS | FTB_LEASE_EXPIRY |
        !           120:         FTB_POTENTIAL_EXPIRY | FTB_STOS | FTB_CLTT | FTB_REQUEST_OPTIONS |
        !           121:         FTB_REPLY_OPTIONS), /* 3 BNDUPD */
        !           122:        (FTB_ASSIGNED_IP_ADDRESS | FTB_BINDING_STATUS | FTB_CLIENT_IDENTIFIER |
        !           123:         FTB_CHADDR | FTB_DDNS | FTB_IP_FLAGS | FTB_LEASE_EXPIRY |
        !           124:         FTB_POTENTIAL_EXPIRY | FTB_STOS | FTB_CLTT | FTB_REQUEST_OPTIONS |
        !           125:         FTB_REPLY_OPTIONS | FTB_REJECT_REASON | FTB_MESSAGE), /* 4 BNDACK */
        !           126:        (FTB_RELATIONSHIP_NAME | FTB_MAX_UNACKED | FTB_RECEIVE_TIMER |
        !           127:         FTB_VENDOR_CLASS | FTB_PROTOCOL_VERSION | FTB_TLS_REQUEST |
        !           128:         FTB_MCLT | FTB_HBA), /* 5 CONNECT */
        !           129:        (FTB_RELATIONSHIP_NAME | FTB_MAX_UNACKED | FTB_RECEIVE_TIMER |
        !           130:         FTB_VENDOR_CLASS | FTB_PROTOCOL_VERSION | FTB_TLS_REPLY |
        !           131:         FTB_REJECT_REASON | FTB_MESSAGE), /* CONNECTACK */
        !           132:        0, /* 7 UPDREQALL */
        !           133:        0, /* 8 UPDDONE */
        !           134:        0, /* 9 UPDREQ */
        !           135:        (FTB_SERVER_STATE | FTB_SERVER_FLAGS | FTB_STOS), /* 10 STATE */
        !           136:        0,      /* 11 CONTACT */
        !           137:        (FTB_REJECT_REASON | FTB_MESSAGE) /* 12 DISCONNECT */
        !           138: };
        !           139: 
        !           140: /* Sizes of the various types. */
        !           141: int ft_sizes [] = {
        !           142:        1, /* FT_UINT8 */
        !           143:        4, /* FT_IPADDR */
        !           144:        4, /* FT_UINT32 */
        !           145:        1, /* FT_BYTES */
        !           146:        1, /* FT_TEXT_OR_BYTES */
        !           147:        0, /* FT_DDNS */
        !           148:        0, /* FT_DDNS1 */
        !           149:        2, /* FT_UINT16 */
        !           150:        1, /* FT_TEXT */
        !           151:        0, /* FT_UNDEF */
        !           152:        0, /* FT_DIGEST */
        !           153: };
        !           154: 
        !           155: /* Names of the various failover link states. */
        !           156: const char *dhcp_flink_state_names [] = {
        !           157:        "invalid state 0",
        !           158:        "startup",
        !           159:        "message length wait",
        !           160:        "message wait",
        !           161:        "disconnected"
        !           162: };
        !           163: #endif /* FAILOVER_PROTOCOL */
        !           164: 
        !           165: /* Failover binding state names.   These are used even if there is no
        !           166:    failover protocol support. */
        !           167: const char *binding_state_names [] = {
        !           168:        "free", "active", "expired", "released", "abandoned",
        !           169:        "reset", "backup" };
        !           170: 
        !           171: struct universe agent_universe;
        !           172: static struct option agent_options[] = {
        !           173:        { "circuit-id", "X",                    &agent_universe,   1, 1 },
        !           174:        { "remote-id", "X",                     &agent_universe,   2, 1 },
        !           175:        { "agent-id", "I",                      &agent_universe,   3, 1 },
        !           176:        { "DOCSIS-device-class", "L",           &agent_universe,   4, 1 },
        !           177:        { "link-selection", "I",                &agent_universe,   5, 1 },
        !           178:        { NULL, NULL, NULL, 0, 0 }
        !           179: };
        !           180: 
        !           181: struct universe server_universe;
        !           182: static struct option server_options[] = {
        !           183:        { "default-lease-time", "T",            &server_universe,   1, 1 },
        !           184:        { "max-lease-time", "T",                &server_universe,   2, 1 },
        !           185:        { "min-lease-time", "T",                &server_universe,   3, 1 },
        !           186:        { "dynamic-bootp-lease-cutoff", "T",    &server_universe,   4, 1 },
        !           187:        { "dynamic-bootp-lease-length", "L",    &server_universe,   5, 1 },
        !           188:        { "boot-unknown-clients", "f",          &server_universe,   6, 1 },
        !           189:        { "dynamic-bootp", "f",                 &server_universe,   7, 1 },
        !           190:        { "allow-bootp", "f",                   &server_universe,   8, 1 },
        !           191:        { "allow-booting", "f",                 &server_universe,   9, 1 },
        !           192:        { "one-lease-per-client", "f",          &server_universe,  10, 1 },
        !           193:        { "get-lease-hostnames", "f",           &server_universe,  11, 1 },
        !           194:        { "use-host-decl-names", "f",           &server_universe,  12, 1 },
        !           195:        { "use-lease-addr-for-default-route", "f",
        !           196:                                                &server_universe,  13, 1 },
        !           197:        { "min-secs", "B",                      &server_universe,  14, 1 },
        !           198:        { "filename", "t",                      &server_universe,  15, 1 },
        !           199:        { "server-name", "t",                   &server_universe,  16, 1 },
        !           200:        { "next-server", "I",                   &server_universe,  17, 1 },
        !           201:        { "authoritative", "f",                 &server_universe,  18, 1 },
        !           202:        { "vendor-option-space", "U",           &server_universe,  19, 1 },
        !           203:        { "always-reply-rfc1048", "f",          &server_universe,  20, 1 },
        !           204:        { "site-option-space", "X",             &server_universe,  21, 1 },
        !           205:        { "always-broadcast", "f",              &server_universe,  22, 1 },
        !           206:        { "ddns-domainname", "t",               &server_universe,  23, 1 },
        !           207:        { "ddns-hostname", "t",                 &server_universe,  24, 1 },
        !           208:        { "ddns-rev-domainname", "t",           &server_universe,  25, 1 },
        !           209:        { "lease-file-name", "t",               &server_universe,  26, 1 },
        !           210:        { "pid-file-name", "t",                 &server_universe,  27, 1 },
        !           211:        { "duplicates", "f",                    &server_universe,  28, 1 },
        !           212:        { "declines", "f",                      &server_universe,  29, 1 },
        !           213:        { "ddns-updates", "f",                  &server_universe,  30, 1 },
        !           214:        { "omapi-port", "S",                    &server_universe,  31, 1 },
        !           215:        { "local-port", "S",                    &server_universe,  32, 1 },
        !           216:        { "limited-broadcast-address", "I",     &server_universe,  33, 1 },
        !           217:        { "remote-port", "S",                   &server_universe,  34, 1 },
        !           218:        { "local-address", "I",                 &server_universe,  35, 1 },
        !           219:        { "omapi-key", "d",                     &server_universe,  36, 1 },
        !           220:        { "stash-agent-options", "f",           &server_universe,  37, 1 },
        !           221:        { "ddns-ttl", "T",                      &server_universe,  38, 1 },
        !           222:        { "ddns-update-style", "Nddns-styles.", &server_universe,  39, 1 },
        !           223:        { "client-updates", "f",                &server_universe,  40, 1 },
        !           224:        { "update-optimization", "f",           &server_universe,  41, 1 },
        !           225:        { "ping-check", "f",                    &server_universe,  42, 1 },
        !           226:        { "update-static-leases", "f",          &server_universe,  43, 1 },
        !           227:        { "log-facility", "Nsyslog-facilities.",
        !           228:                                                &server_universe,  44, 1 },
        !           229:        { "do-forward-updates", "f",            &server_universe,  45, 1 },
        !           230:        { "ping-timeout", "T",                  &server_universe,  46, 1 },
        !           231:        { "infinite-is-reserved", "f",          &server_universe,  47, 1 },
        !           232:        { "update-conflict-detection", "f",     &server_universe,  48, 1 },
        !           233:        { "leasequery", "f",                    &server_universe,  49, 1 },
        !           234:        { "adaptive-lease-time-threshold", "B", &server_universe,  50, 1 },
        !           235:        { "do-reverse-updates", "f",            &server_universe,  51, 1 },
        !           236:        { "fqdn-reply", "f",                    &server_universe,  52, 1 },
        !           237:        { "preferred-lifetime", "T",            &server_universe,  53, 1 },
        !           238:        { "dhcpv6-lease-file-name", "t",        &server_universe,  54, 1 },
        !           239:        { "dhcpv6-pid-file-name", "t",          &server_universe,  55, 1 },
        !           240:        { "limit-addrs-per-ia", "L",            &server_universe,  56, 1 },
        !           241:        { "limit-prefs-per-ia", "L",            &server_universe,  57, 1 },
        !           242: /* Assert a configuration parsing error if delayed-ack isn't compiled in. */
        !           243: #if defined(DELAYED_ACK)
        !           244:        { "delayed-ack", "S",                   &server_universe,  58, 1 },
        !           245:        { "max-ack-delay", "L",                 &server_universe,  59, 1 },
        !           246: #endif
        !           247:        { NULL, NULL, NULL, 0, 0 }
        !           248: };
        !           249: 
        !           250: struct enumeration_value ddns_styles_values [] = {
        !           251:        { "none", 0 },
        !           252:        { "ad-hoc", 1 },
        !           253:        { "interim", 2 },
        !           254:        { (char *)0, 0 }
        !           255: };
        !           256: 
        !           257: struct enumeration ddns_styles = {
        !           258:        (struct enumeration *)0,
        !           259:        "ddns-styles", 1,
        !           260:        ddns_styles_values
        !           261: };
        !           262: 
        !           263: struct enumeration_value syslog_values [] = {
        !           264: #if defined (LOG_KERN)
        !           265:        { "kern", LOG_KERN },
        !           266: #endif
        !           267: #if defined (LOG_USER)
        !           268:        { "user", LOG_USER },
        !           269: #endif
        !           270: #if defined (LOG_MAIL)
        !           271:        { "mail", LOG_MAIL },
        !           272: #endif
        !           273: #if defined (LOG_DAEMON)
        !           274:        { "daemon", LOG_DAEMON },
        !           275: #endif
        !           276: #if defined (LOG_AUTH)
        !           277:        { "auth", LOG_AUTH },
        !           278: #endif
        !           279: #if defined (LOG_SYSLOG)
        !           280:        { "syslog", LOG_SYSLOG },
        !           281: #endif
        !           282: #if defined (LOG_LPR)
        !           283:        { "lpr", LOG_LPR },
        !           284: #endif
        !           285: #if defined (LOG_NEWS)
        !           286:        { "news", LOG_NEWS },
        !           287: #endif
        !           288: #if defined (LOG_UUCP)
        !           289:        { "uucp", LOG_UUCP },
        !           290: #endif
        !           291: #if defined (LOG_CRON)
        !           292:        { "cron", LOG_CRON },
        !           293: #endif
        !           294: #if defined (LOG_AUTHPRIV)
        !           295:        { "authpriv", LOG_AUTHPRIV },
        !           296: #endif
        !           297: #if defined (LOG_FTP)
        !           298:        { "ftp", LOG_FTP },
        !           299: #endif
        !           300: #if defined (LOG_LOCAL0)
        !           301:        { "local0", LOG_LOCAL0 },
        !           302: #endif
        !           303: #if defined (LOG_LOCAL1)
        !           304:        { "local1", LOG_LOCAL1 },
        !           305: #endif
        !           306: #if defined (LOG_LOCAL2)
        !           307:        { "local2", LOG_LOCAL2 },
        !           308: #endif
        !           309: #if defined (LOG_LOCAL3)
        !           310:        { "local3", LOG_LOCAL3 },
        !           311: #endif
        !           312: #if defined (LOG_LOCAL4)
        !           313:        { "local4", LOG_LOCAL4 },
        !           314: #endif
        !           315: #if defined (LOG_LOCAL5)
        !           316:        { "local5", LOG_LOCAL5 },
        !           317: #endif
        !           318: #if defined (LOG_LOCAL6)
        !           319:        { "local6", LOG_LOCAL6 },
        !           320: #endif
        !           321: #if defined (LOG_LOCAL7)
        !           322:        { "local7", LOG_LOCAL7 },
        !           323: #endif
        !           324:        { (char *)0, 0 }
        !           325: };
        !           326: 
        !           327: struct enumeration syslog_enum = {
        !           328:        (struct enumeration *)0,
        !           329:        "syslog-facilities", 1,
        !           330:        syslog_values
        !           331: };
        !           332: 
        !           333: void initialize_server_option_spaces()
        !           334: {
        !           335:        int i;
        !           336:        unsigned code;
        !           337: 
        !           338:        /* Set up the Relay Agent Information Option suboption space... */
        !           339:        agent_universe.name = "agent";
        !           340:        agent_universe.concat_duplicates = 0;
        !           341:        agent_universe.option_state_dereference =
        !           342:                linked_option_state_dereference;
        !           343:        agent_universe.lookup_func = lookup_linked_option;
        !           344:        agent_universe.save_func = save_linked_option;
        !           345:        agent_universe.delete_func = delete_linked_option;
        !           346:        agent_universe.encapsulate = linked_option_space_encapsulate;
        !           347:        agent_universe.foreach = linked_option_space_foreach;
        !           348:        agent_universe.decode = parse_option_buffer;
        !           349:        agent_universe.index = universe_count++;
        !           350:        agent_universe.length_size = 1;
        !           351:        agent_universe.tag_size = 1;
        !           352:        agent_universe.get_tag = getUChar;
        !           353:        agent_universe.store_tag = putUChar;
        !           354:        agent_universe.get_length = getUChar;
        !           355:        agent_universe.store_length = putUChar;
        !           356:        agent_universe.site_code_min = 0;
        !           357:        agent_universe.end = 0;
        !           358:        universes [agent_universe.index] = &agent_universe;
        !           359:        if (!option_name_new_hash(&agent_universe.name_hash,
        !           360:                                  AGENT_HASH_SIZE, MDL) ||
        !           361:            !option_code_new_hash(&agent_universe.code_hash,
        !           362:                                  AGENT_HASH_SIZE, MDL))
        !           363:                log_fatal ("Can't allocate agent option hash table.");
        !           364:        for (i = 0 ; agent_options[i].name ; i++) {
        !           365:                option_code_hash_add(agent_universe.code_hash,
        !           366:                                     &agent_options[i].code, 0,
        !           367:                                     &agent_options[i], MDL);
        !           368:                option_name_hash_add(agent_universe.name_hash,
        !           369:                                     agent_options[i].name, 0,
        !           370:                                     &agent_options[i], MDL);
        !           371:        }
        !           372: #if defined(REPORT_HASH_PERFORMANCE)
        !           373:        log_info("Relay Agent name hash: %s",
        !           374:                 option_name_hash_report(agent_universe.name_hash));
        !           375:        log_info("Relay Agent code hash: %s",
        !           376:                 option_code_hash_report(agent_universe.code_hash));
        !           377: #endif
        !           378:        code = DHO_DHCP_AGENT_OPTIONS;
        !           379:        option_code_hash_lookup(&agent_universe.enc_opt,
        !           380:                                dhcp_universe.code_hash, &code, 0, MDL);
        !           381: 
        !           382:        /* Set up the server option universe... */
        !           383:        server_universe.name = "server";
        !           384:        server_universe.concat_duplicates = 0;
        !           385:        server_universe.lookup_func = lookup_hashed_option;
        !           386:        server_universe.option_state_dereference =
        !           387:                hashed_option_state_dereference;
        !           388:        server_universe.save_func = save_hashed_option;
        !           389:        server_universe.delete_func = delete_hashed_option;
        !           390:        server_universe.encapsulate = hashed_option_space_encapsulate;
        !           391:        server_universe.foreach = hashed_option_space_foreach;
        !           392:        server_universe.length_size = 1; /* Never used ... */
        !           393:        server_universe.tag_size = 4;
        !           394:        server_universe.store_tag = putUChar;
        !           395:        server_universe.store_length = putUChar;
        !           396:        server_universe.site_code_min = 0;
        !           397:        server_universe.end = 0;
        !           398:        server_universe.index = universe_count++;
        !           399:        universes [server_universe.index] = &server_universe;
        !           400:        if (!option_name_new_hash(&server_universe.name_hash,
        !           401:                                  SERVER_HASH_SIZE, MDL) ||
        !           402:            !option_code_new_hash(&server_universe.code_hash,
        !           403:                                  SERVER_HASH_SIZE, MDL))
        !           404:                log_fatal ("Can't allocate server option hash table.");
        !           405:        for (i = 0 ; server_options[i].name ; i++) {
        !           406:                option_code_hash_add(server_universe.code_hash,
        !           407:                                     &server_options[i].code, 0,
        !           408:                                     &server_options[i], MDL);
        !           409:                option_name_hash_add(server_universe.name_hash,
        !           410:                                     server_options[i].name, 0,
        !           411:                                     &server_options[i], MDL);
        !           412:        }
        !           413: #if defined(REPORT_HASH_PERFORMANCE)
        !           414:        log_info("Server-Config Option name hash: %s",
        !           415:                 option_name_hash_report(server_universe.name_hash));
        !           416:        log_info("Server-Config Option code hash: %s",
        !           417:                 option_code_hash_report(server_universe.code_hash));
        !           418: #endif
        !           419: 
        !           420:        /* Add the server and agent option spaces to the option space hash. */
        !           421:        universe_hash_add (universe_hash,
        !           422:                           agent_universe.name, 0, &agent_universe, MDL);
        !           423:        universe_hash_add (universe_hash,
        !           424:                           server_universe.name, 0, &server_universe, MDL);
        !           425: 
        !           426:        /* Make the server universe the configuration option universe. */
        !           427:        config_universe = &server_universe;
        !           428: 
        !           429:        code = SV_VENDOR_OPTION_SPACE;
        !           430:        option_code_hash_lookup(&vendor_cfg_option, server_universe.code_hash,
        !           431:                                &code, 0, MDL);
        !           432: }

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