Annotation of embedaddon/dhcp/includes/tree.h, revision 1.1
1.1 ! misho 1: /* tree.h
! 2:
! 3: Definitions for address trees... */
! 4:
! 5: /*
! 6: * Copyright (c) 2011 by Internet Systems Consortium, Inc. ("ISC")
! 7: * Copyright (c) 2004,2007-2009 by Internet Systems Consortium, Inc. ("ISC")
! 8: * Copyright (c) 1996-2003 by Internet Software Consortium
! 9: *
! 10: * Permission to use, copy, modify, and distribute this software for any
! 11: * purpose with or without fee is hereby granted, provided that the above
! 12: * copyright notice and this permission notice appear in all copies.
! 13: *
! 14: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
! 15: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 16: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
! 17: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 18: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 19: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 20: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 21: *
! 22: * Internet Systems Consortium, Inc.
! 23: * 950 Charter Street
! 24: * Redwood City, CA 94063
! 25: * <info@isc.org>
! 26: * https://www.isc.org/
! 27: *
! 28: * This software has been written for Internet Systems Consortium
! 29: * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
! 30: * To learn more about Internet Systems Consortium, see
! 31: * ``https://www.isc.org/''. To learn more about Vixie Enterprises,
! 32: * see ``http://www.vix.com''. To learn more about Nominum, Inc., see
! 33: * ``http://www.nominum.com''.
! 34: */
! 35:
! 36: /* A pair of pointers, suitable for making a linked list. */
! 37: typedef struct _pair {
! 38: caddr_t car;
! 39: struct _pair *cdr;
! 40: } *pair;
! 41:
! 42: struct option_chain_head {
! 43: int refcnt;
! 44: pair first;
! 45: };
! 46:
! 47: struct enumeration_value {
! 48: const char *name;
! 49: u_int8_t value;
! 50: };
! 51:
! 52: struct enumeration {
! 53: struct enumeration *next;
! 54: const char *name;
! 55: unsigned width;
! 56: struct enumeration_value *values;
! 57: };
! 58:
! 59: /* Tree node types... */
! 60: #define TREE_CONCAT 1
! 61: #define TREE_HOST_LOOKUP 2
! 62: #define TREE_CONST 3
! 63: #define TREE_LIMIT 4
! 64: #define TREE_DATA_EXPR 5
! 65:
! 66: /* A data buffer with a reference count. */
! 67: struct buffer {
! 68: int refcnt;
! 69: unsigned char data [1];
! 70: };
! 71:
! 72: /* XXX The mechanism by which data strings are returned is currently
! 73: XXX broken: rather than returning an ephemeral pointer, we create
! 74: XXX a reference to the data in the caller's space, which the caller
! 75: XXX then has to dereference - instead, the reference should be
! 76: XXX ephemeral by default and be made a persistent reference explicitly. */
! 77: /* XXX on the other hand, it seems to work pretty nicely, so maybe the
! 78: XXX above comment is meshuggenah. */
! 79: /* XXX I think the above comment tries to say this:
! 80: XXX http://tinyurl.com/2tjqre */
! 81:
! 82: /* A string of data bytes, possibly accompanied by a larger buffer. */
! 83: struct data_string {
! 84: struct buffer *buffer;
! 85: const unsigned char *data;
! 86: unsigned len; /* Does not include NUL terminator, if any. */
! 87: int terminated;
! 88: };
! 89:
! 90: enum expression_context {
! 91: context_any, /* indefinite */
! 92: context_boolean,
! 93: context_data,
! 94: context_numeric,
! 95: context_dns,
! 96: context_data_or_numeric, /* indefinite */
! 97: context_function
! 98: };
! 99:
! 100: struct fundef {
! 101: int refcnt;
! 102: struct string_list *args;
! 103: struct executable_statement *statements;
! 104: };
! 105:
! 106: struct binding_value {
! 107: int refcnt;
! 108: enum {
! 109: binding_boolean,
! 110: binding_data,
! 111: binding_numeric,
! 112: binding_dns,
! 113: binding_function
! 114: } type;
! 115: union value {
! 116: struct data_string data;
! 117: unsigned long intval;
! 118: int boolean;
! 119: #if defined (NSUPDATE)
! 120: ns_updrec *dns;
! 121: #endif
! 122: struct fundef *fundef;
! 123: struct binding_value *bv;
! 124: } value;
! 125: };
! 126:
! 127: struct binding {
! 128: struct binding *next;
! 129: char *name;
! 130: struct binding_value *value;
! 131: };
! 132:
! 133: struct binding_scope {
! 134: int refcnt;
! 135: struct binding_scope *outer;
! 136: struct binding *bindings;
! 137: };
! 138:
! 139: /* Expression tree structure. */
! 140:
! 141: enum expr_op {
! 142: expr_none,
! 143: expr_match,
! 144: expr_check,
! 145: expr_equal,
! 146: expr_substring,
! 147: expr_suffix,
! 148: expr_concat,
! 149: expr_host_lookup,
! 150: expr_and,
! 151: expr_or,
! 152: expr_not,
! 153: expr_option,
! 154: expr_hardware,
! 155: expr_packet,
! 156: expr_const_data,
! 157: expr_extract_int8,
! 158: expr_extract_int16,
! 159: expr_extract_int32,
! 160: expr_encode_int8,
! 161: expr_encode_int16,
! 162: expr_encode_int32,
! 163: expr_const_int,
! 164: expr_exists,
! 165: expr_encapsulate,
! 166: expr_known,
! 167: expr_reverse,
! 168: expr_leased_address,
! 169: expr_binary_to_ascii,
! 170: expr_config_option,
! 171: expr_host_decl_name,
! 172: expr_pick_first_value,
! 173: expr_lease_time,
! 174: expr_dns_transaction,
! 175: expr_static,
! 176: expr_ns_add,
! 177: expr_ns_delete,
! 178: expr_ns_exists,
! 179: expr_ns_not_exists,
! 180: expr_not_equal,
! 181: expr_null,
! 182: expr_variable_exists,
! 183: expr_variable_reference,
! 184: expr_filename,
! 185: expr_sname,
! 186: expr_arg,
! 187: expr_funcall,
! 188: expr_function,
! 189: expr_add,
! 190: expr_subtract,
! 191: expr_multiply,
! 192: expr_divide,
! 193: expr_remainder,
! 194: expr_binary_and,
! 195: expr_binary_or,
! 196: expr_binary_xor,
! 197: expr_client_state,
! 198: expr_ucase,
! 199: expr_lcase,
! 200: expr_regex_match,
! 201: expr_iregex_match
! 202: };
! 203:
! 204: struct expression {
! 205: int refcnt;
! 206: enum expr_op op;
! 207: union expr_union {
! 208: struct {
! 209: struct expression *expr;
! 210: struct expression *offset;
! 211: struct expression *len;
! 212: } substring;
! 213: struct expression *equal [2];
! 214: struct expression *and [2];
! 215: struct expression *or [2];
! 216: struct expression *not;
! 217: struct expression *add;
! 218: struct expression *subtract;
! 219: struct expression *multiply;
! 220: struct expression *divide;
! 221: struct expression *remainder;
! 222: struct collection *check;
! 223: struct {
! 224: struct expression *expr;
! 225: struct expression *len;
! 226: } suffix;
! 227: struct expression *lcase;
! 228: struct expression *ucase;
! 229: struct option *option;
! 230: struct option *config_option;
! 231: struct {
! 232: struct expression *offset;
! 233: struct expression *len;
! 234: } packet;
! 235: struct data_string const_data;
! 236: struct expression *extract_int;
! 237: struct expression *encode_int;
! 238: unsigned long const_int;
! 239: struct expression *concat [2];
! 240: struct dns_host_entry *host_lookup;
! 241: struct option *exists;
! 242: struct data_string encapsulate;
! 243: struct {
! 244: struct expression *base;
! 245: struct expression *width;
! 246: struct expression *separator;
! 247: struct expression *buffer;
! 248: } b2a;
! 249: struct {
! 250: struct expression *width;
! 251: struct expression *buffer;
! 252: } reverse;
! 253: struct {
! 254: struct expression *car;
! 255: struct expression *cdr;
! 256: } pick_first_value;
! 257: struct {
! 258: struct expression *car;
! 259: struct expression *cdr;
! 260: } dns_transaction;
! 261: struct {
! 262: unsigned rrclass;
! 263: unsigned rrtype;
! 264: struct expression *rrname;
! 265: struct expression *rrdata;
! 266: struct expression *ttl;
! 267: } ns_add;
! 268: struct {
! 269: unsigned rrclass;
! 270: unsigned rrtype;
! 271: struct expression *rrname;
! 272: struct expression *rrdata;
! 273: } ns_delete, ns_exists, ns_not_exists;
! 274: char *variable;
! 275: struct {
! 276: struct expression *val;
! 277: struct expression *next;
! 278: } arg;
! 279: struct {
! 280: char *name;
! 281: struct expression *arglist;
! 282: } funcall;
! 283: struct fundef *func;
! 284: } data;
! 285: int flags;
! 286: # define EXPR_EPHEMERAL 1
! 287: };
! 288:
! 289: /* DNS host entry structure... */
! 290: struct dns_host_entry {
! 291: int refcnt;
! 292: TIME timeout;
! 293: struct data_string data;
! 294: char hostname [1];
! 295: };
! 296:
! 297: struct option_cache; /* forward */
! 298: struct packet; /* forward */
! 299: struct option_state; /* forward */
! 300: struct decoded_option_state; /* forward */
! 301: struct lease; /* forward */
! 302: struct client_state; /* forward */
! 303:
! 304: struct universe {
! 305: const char *name;
! 306: struct option_cache *(*lookup_func) (struct universe *,
! 307: struct option_state *,
! 308: unsigned);
! 309: void (*save_func) (struct universe *, struct option_state *,
! 310: struct option_cache *, isc_boolean_t);
! 311: void (*foreach) (struct packet *,
! 312: struct lease *, struct client_state *,
! 313: struct option_state *, struct option_state *,
! 314: struct binding_scope **, struct universe *, void *,
! 315: void (*) (struct option_cache *, struct packet *,
! 316: struct lease *, struct client_state *,
! 317: struct option_state *,
! 318: struct option_state *,
! 319: struct binding_scope **,
! 320: struct universe *, void *));
! 321: void (*delete_func) (struct universe *universe,
! 322: struct option_state *, int);
! 323: int (*option_state_dereference) (struct universe *,
! 324: struct option_state *,
! 325: const char *, int);
! 326: int (*decode) (struct option_state *,
! 327: const unsigned char *, unsigned, struct universe *);
! 328: int (*encapsulate) (struct data_string *, struct packet *,
! 329: struct lease *, struct client_state *,
! 330: struct option_state *, struct option_state *,
! 331: struct binding_scope **,
! 332: struct universe *);
! 333: u_int32_t (*get_tag) (const unsigned char *);
! 334: void (*store_tag) (unsigned char *, u_int32_t);
! 335: u_int32_t (*get_length) (const unsigned char *);
! 336: void (*store_length) (unsigned char *, u_int32_t);
! 337: int tag_size, length_size;
! 338: unsigned site_code_min, end;
! 339: option_name_hash_t *name_hash;
! 340: option_code_hash_t *code_hash;
! 341: struct option *enc_opt;
! 342: int index;
! 343:
! 344: /* Flags should probably become condensed. */
! 345: int concat_duplicates;
! 346: };
! 347:
! 348: struct option {
! 349: const char *name;
! 350: const char *format;
! 351: struct universe *universe;
! 352: unsigned code;
! 353: int refcnt;
! 354: };
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>