File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / dhcp / server / stables.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Oct 9 09:06:55 2012 UTC (12 years ago) by misho
Branches: dhcp, MAIN
CVS tags: v4_1_R7p0, v4_1_R7, v4_1_R4, HEAD
dhcp 4.1 r7

    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>