? dhcpd.conf-example ? mcr-diff ? rfc2317.patch Index: Makefile =================================================================== RCS file: /warez/dhcp/Makefile,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- Makefile 2003/10/04 21:03:43 1.1.1.1 +++ Makefile 2003/10/04 22:36:35 1.2 @@ -94,3 +94,5 @@ (cd work.$$sysname; make links); \ fi +TAGS: + etags `find . -type f -name '*.[ch]' -print` Index: common/conflex.c =================================================================== RCS file: /warez/dhcp/common/conflex.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- conflex.c 2003/10/04 21:03:43 1.1.1.1 +++ conflex.c 2003/10/04 22:40:08 1.2 @@ -938,6 +940,8 @@ return REMOVE; if (!strcasecmp (atom + 1, "efresh")) return REFRESH; + if (!strcasecmp (atom + 1, "everse-name")) + return REVERSE_NAME; break; case 's': if (!strcasecmp (atom + 1, "tate")) Index: common/parse.c =================================================================== RCS file: /warez/dhcp/common/parse.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 parse.c --- parse.c 2003/10/04 21:03:43 1.1.1.1 +++ parse.c 2003/10/07 01:13:58 @@ -3112,6 +3112,33 @@ if (!(parse_data_expression (&(*expr) -> data.reverse.buffer, cfile, lose))) + goto nodata; + + token = next_token (&val, (unsigned *)0, cfile); + if (token != RPAREN) + goto norparen; + break; + + case REVERSE_NAME: + token = next_token (&val, (unsigned *)0, cfile); + if (!expression_allocate (expr, MDL)) + log_fatal ("can't allocate expression"); + (*expr) -> op = expr_reverse_name; + + token = next_token (&val, (unsigned *)0, cfile); + if (token != LPAREN) + goto nolparen; + + if (!(parse_data_expression + (&(*expr) -> data.reverse_name.buffer, cfile, lose))) + goto nodata; + + token = next_token (&val, (unsigned *)0, cfile); + if (token != COMMA) + goto nocomma; + + if (!(parse_data_expression + (&(*expr) -> data.reverse_name.fourthdot, cfile, lose))) goto nodata; token = next_token (&val, (unsigned *)0, cfile); Index: common/tree.c =================================================================== RCS file: /warez/dhcp/common/tree.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 tree.c --- tree.c 2003/10/04 21:03:43 1.1.1.1 +++ tree.c 2003/10/07 01:13:58 @@ -424,6 +424,26 @@ return 1; } +int reverse_name(struct data_string *d, + struct data_string *fourthfmt, + unsigned char *b, size_t buflen) +{ + struct binding *binding; + const unsigned char *dot; + + dot = "."; + + if(fourthfmt->len > 0) { + dot = fourthfmt->data; + } + + log_debug("fourthfmt: %s", dot); + + snprintf(b, buflen, "%d%s%d.%d.%d.in-addr.arpa.", + d->data[3], dot, d->data[2], d->data[1], d->data[0]); +} + + int evaluate_expression (result, packet, lease, client_state, in_options, cfg_options, scope, expr, file, line) struct binding_value **result; @@ -850,6 +871,7 @@ case expr_encode_int16: case expr_encode_int32: case expr_binary_to_ascii: + case expr_reverse_name: case expr_reverse: case expr_filename: case expr_sname: @@ -1214,6 +1236,7 @@ case expr_encode_int32: case expr_binary_to_ascii: case expr_reverse: + case expr_reverse_name: case expr_pick_first_value: case expr_host_decl_name: case expr_config_option: @@ -1875,6 +1898,65 @@ return 1; return 0; + case expr_reverse_name: + memset (&data, 0, sizeof data); + memset (&other, 0, sizeof data); + s0 = evaluate_data_expression (&data, packet, lease, + client_state, + in_options, cfg_options, scope, + expr->data.reverse_name.buffer, + MDL); + + s1 = evaluate_data_expression (&other, packet, lease, + client_state, + in_options, cfg_options, scope, + expr->data.reverse_name.fourthdot, + MDL); + + if (s0 && s1) { + char *upper; + int i, buflen; + + /* The buffer must be a exactly 4 bytes in size */ + if (data.len != 4) { + log_info ("reverse_name: %s %d %s!", + "length of buffer", data.len, + "must be 4"); + status = 0; + goto reverse_name_out; + } + + buflen = sizeof("000.000/000.000.000.000"); + + if (!buffer_allocate (&result -> buffer, + buflen + 1, file, line)) { + log_error ("data: reverse_name: no memory"); + status = 0; + goto b2a_out; + } + reverse_name(&data, &other, result->buffer->data, buflen); + + result -> data = &result -> buffer -> data [0]; + result -> len = strlen(result->buffer->data); + result -> terminated = 1; + buflen = 0; + status = 1; + } else + status = 0; + + reverse_name_out: +#if defined (DEBUG_EXPRESSIONS) + log_debug ("data: reverse_name (%s) = %s", + s0 ? print_hex_1 (data.len, data.data, 30) : "NULL", + (status ? print_hex_3 (result -> len, result -> data, 30) + : "NULL")); +#endif + if (s0) + data_string_forget (&data, MDL); + if (status) + return 1; + return 0; + case expr_leased_address: if (!lease) { log_error ("data: leased_address: not available"); @@ -2288,6 +2370,8 @@ cur = next; } while (next); + log_debug ("calling ns_update"); + /* Do the update and record the error code, if there was an error; otherwise set it to NOERROR. */ *result = minires_nupdate (&resolver_state, @@ -2998,6 +3082,7 @@ expr -> op == expr_filename || expr -> op == expr_sname || expr -> op == expr_reverse || + expr -> op == expr_reverse_name || expr -> op == expr_pick_first_value || expr -> op == expr_host_decl_name || expr -> op == expr_leased_address || @@ -3498,6 +3583,20 @@ ")"); break; + case expr_reverse_name: + col = token_print_indent (file, col, indent, "", "", + "reverse-name"); + col = token_print_indent (file, col, indent, " ", "", "("); + scol = col; + col = write_expression (file, expr -> data.reverse_name.buffer, + col, scol, 0); + col = token_print_indent (file, col, scol, "", " ", ","); + col = write_expression (file, expr -> data.reverse_name.fourthdot, + col, scol, 0); + col = token_print_indent (file, col, indent, "", "", + ")"); + break; + case expr_leased_address: col = token_print_indent (file, col, indent, "", "", "leased-address"); @@ -3880,6 +3979,10 @@ return data_subexpression_length (rv, expr -> data.reverse.buffer); + case expr_reverse_name: + return data_subexpression_length (rv, + expr -> data.reverse_name.buffer); + case expr_leased_address: case expr_lease_time: *rv = 4; @@ -3944,6 +4047,7 @@ case expr_binary_or: case expr_binary_xor: case expr_client_state: + case expr_reverse_name: return 0; } return 0; Index: includes/dhcpd.h =================================================================== RCS file: /warez/dhcp/includes/dhcpd.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- dhcpd.h 2003/10/04 21:03:43 1.1.1.1 +++ dhcpd.h 2003/10/04 22:39:55 1.2 @@ -420,7 +420,8 @@ #define SV_UPDATE_STATIC_LEASES 43 #define SV_LOG_FACILITY 44 #define SV_DO_FORWARD_UPDATES 45 -#define SV_PING_TIMEOUT 46 +#define SV_PING_TIMEOUT 46 +#define SV_FOURTH_OCTET_FMT 47 #if !defined (DEFAULT_PING_TIMEOUT) # define DEFAULT_PING_TIMEOUT 1 Index: includes/dhctoken.h =================================================================== RCS file: /warez/dhcp/includes/dhctoken.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- dhctoken.h 2003/10/04 21:03:43 1.1.1.1 +++ dhctoken.h 2003/10/04 22:39:55 1.2 @@ -316,7 +316,9 @@ REMOVE = 611, REFRESH = 612, DOMAIN_NAME = 613, - DO_FORWARD_UPDATE = 614 + DO_FORWARD_UPDATE = 614, + REVERSE_NAME = 615, + FOURTH_OCTET_FMT = 616 }; #define is_identifier(x) ((x) >= FIRST_TOKEN && \ Index: includes/tree.h =================================================================== RCS file: /warez/dhcp/includes/tree.h,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 tree.h --- tree.h 2003/10/04 21:03:43 1.1.1.1 +++ tree.h 2003/10/07 01:13:58 @@ -199,7 +199,8 @@ expr_binary_and, expr_binary_or, expr_binary_xor, - expr_client_state + expr_client_state, + expr_reverse_name }; struct expression { @@ -249,6 +250,10 @@ struct expression *width; struct expression *buffer; } reverse; + struct { + struct expression *buffer; + struct expression *fourthdot; + } reverse_name; struct { struct expression *car; struct expression *cdr; Index: server/ddns.c =================================================================== RCS file: /warez/dhcp/server/ddns.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 ddns.c --- ddns.c 2003/10/04 21:03:43 1.1.1.1 +++ ddns.c 2003/10/07 01:13:58 @@ -234,9 +234,10 @@ struct data_string ddns_rev_name; struct data_string ddns_dhcid; unsigned len; - struct data_string d1; - struct option_cache *oc; - int s1, s2; + struct data_string d1, d2; + struct option_cache *oc, *oc2; + int s1, s2, s3; + char *dot; int result = 0; isc_result_t rcode1 = ISC_R_SUCCESS, rcode2 = ISC_R_SUCCESS; int server_updates_a = 1; @@ -473,6 +474,7 @@ */ oc = lookup_option (&server_universe, state -> options, SV_DDNS_REV_DOMAIN_NAME); + memset (&d1, 0, sizeof d1); if (oc) s1 = evaluate_option_cache (&d1, packet, lease, (struct client_state *)0, @@ -480,24 +482,42 @@ state -> options, &lease -> scope, oc, MDL); + oc2 = lookup_option (&server_universe, state -> options, + SV_FOURTH_OCTET_FMT); + memset (&d2, 0, sizeof d2); + if (oc2) + s2 = evaluate_option_cache (&d2, packet, lease, + (struct client_state *)0, + packet -> options, + state -> options, + &lease -> scope, oc2, MDL); + + dot = "."; + if (oc2 && s2) { + dot = d2.buffer->data; + } + if (oc && s1) { /* Buffer length: XXX.XXX.XXX.XXX.\0 */ - buffer_allocate (&ddns_rev_name.buffer, - d1.len + 17, MDL); + int nlen = d1.len + 17 + strlen(dot); + + buffer_allocate (&ddns_rev_name.buffer, nlen, MDL); if (ddns_rev_name.buffer) { ddns_rev_name.data = ddns_rev_name.buffer -> data; #ifndef NO_SNPRINTF - snprintf ((char *)ddns_rev_name.buffer -> data, 17, - "%d.%d.%d.%d.", + snprintf ((char *)ddns_rev_name.buffer -> data, nlen, + "%d%s%d.%d.%d.", lease -> ip_addr . iabuf[3], + dot, lease -> ip_addr . iabuf[2], lease -> ip_addr . iabuf[1], lease -> ip_addr . iabuf[0]); #else sprintf ((char *)ddns_rev_name.buffer -> data, - "%d.%d.%d.%d.", + "%d%s%d.%d.%d.", lease -> ip_addr . iabuf[3], + dot, lease -> ip_addr . iabuf[2], lease -> ip_addr . iabuf[1], lease -> ip_addr . iabuf[0]); @@ -510,6 +530,10 @@ } data_string_forget (&d1, MDL); + } + + if(oc2 && s2) { + data_string_forget (&d2, MDL); } /* Index: server/stables.c =================================================================== RCS file: /warez/dhcp/server/stables.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -r1.1.1.1 -r1.2 --- stables.c 2003/10/04 21:03:43 1.1.1.1 +++ stables.c 2003/10/04 22:41:56 1.2 @@ -492,7 +492,7 @@ { "log-facility", "Nsyslog-facilities.", &server_universe, 44 }, { "do-forward-updates", "f", &server_universe, 45 }, { "ping-timeout", "T", &server_universe, 46 }, - { "unknown-47", "X", &server_universe, 47 }, + { "fourth-octet-fmt", "X", &server_universe, 47 }, { "unknown-48", "X", &server_universe, 48 }, { "unknown-49", "X", &server_universe, 49 }, { "unknown-50", "X", &server_universe, 50 },