40 for (sp = s; sp && *sp; sp++) {
43 else if (!isascii ((
int)*sp) || !isprint ((
int)*sp))
45 else if (*sp ==
'"' || *sp ==
'\\')
51 buf =
dmalloc (len + 1, file, line);
54 for (sp = s; sp && *sp; sp++) {
57 else if (!isascii ((
int)*sp) || !isprint ((
int)*sp)) {
58 sprintf (nsp,
"\\%03o",
59 *(
const unsigned char *)sp);
61 }
else if (*sp ==
'"' || *sp ==
'\\') {
79 for (i = 0; i < len; i++) {
82 else if (!isascii (s [i]) || !isprint (s [i]))
84 else if (s [i] ==
'"' || s [i] ==
'\\')
93 for (i = 0; i < len; i++) {
96 else if (!isascii (s [i]) || !isprint (s [i])) {
97 sprintf (nsp,
"\\%03o", s [i]);
99 }
else if (s [i] ==
'"' || s [i] ==
'\\') {
117 static char to64 [] =
118 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
120 bl = ((len * 4 + 2) / 3) + 1;
121 b =
dmalloc (bl + 1, file, line);
133 *s++ = to64 [extra << 4];
137 val = (extra << 8) + buf [i++];
142 *s++ = to64 [extra << 2];
146 val = (extra << 8) + buf [i++];
163 const
unsigned char *
data;
165 static char habuf [49];
173 for (i = 0; i < hlen; i++) {
174 sprintf (s,
"%02x", data [i]);
192 t = gmtime (&lease -> starts);
193 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
196 t = gmtime (&lease -> ends);
197 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
200 if (lease -> hardware_addr.hlen)
203 lease -> hardware_addr.hlen - 1,
204 &lease -> hardware_addr.hbuf [1]));
206 lease -> host ? lease -> host -> name :
"<none>");
209 #if defined (DEBUG_PACKET) 219 const char *name, *dot;
221 memset (&ds, 0,
sizeof ds);
231 in_options, cfg_options, scope, oc,
MDL)) {
233 name, dot, oc ->
option -> name,
245 log_debug (
"packet length %d", tp -> packet_length);
246 log_debug (
"op = %d htype = %d hlen = %d hops = %d",
248 log_debug (
"xid = %x secs = %ld flags = %x",
254 log_debug (
"chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
255 ((
unsigned char *)(tdp ->
chaddr)) [0],
256 ((
unsigned char *)(tdp ->
chaddr)) [1],
257 ((
unsigned char *)(tdp ->
chaddr)) [2],
258 ((
unsigned char *)(tdp ->
chaddr)) [3],
259 ((
unsigned char *)(tdp ->
chaddr)) [4],
260 ((
unsigned char *)(tdp ->
chaddr)) [5]);
263 if (tp -> options_valid) {
283 const
unsigned char *buf;
296 memset(lbuf,
' ', 79);
299 for (i = 0; i < len; i++) {
308 memset(lbuf,
' ', 79);
310 sprintf (lbuf,
"%03x:", i);
312 }
else if ((i & 7) == 0)
315 if(isprint(buf[i])) {
316 lbuf[56+(i%16)]=buf[i];
321 sprintf (&lbuf [lbix],
" %02x", buf [i]);
342 for (i = 0; i < table -> hash_count; i++) {
343 if (!table -> buckets [i])
346 for (bp = table -> buckets [i]; bp; bp = bp ->
next) {
371 const u_int8_t *data;
377 if ((buf == NULL) || (limit < 3))
380 for (i = 0; (i < limit / 3) && (i < len); i++) {
381 sprintf(&buf[i*3],
"%02x:", data[i]);
383 buf[(i * 3) - 1] = 0;
398 const u_int8_t *data;
403 if ((buf == NULL) || (limit < 3))
406 for (i = 0; (i < (limit - 3)) && (i <
len); i++) {
407 if (!isascii(data[i]) || !isprint(data[i])) {
417 memcpy(&buf[1], data, i);
435 const u_int8_t *data;
439 static char hex_buf_1[
HBLEN + 1];
440 static char hex_buf_2[
HBLEN + 1];
441 static char hex_buf_3[
HBLEN + 1];
447 if (limit >=
sizeof(hex_buf_1))
448 limit =
sizeof(hex_buf_1);
452 if (limit >=
sizeof(hex_buf_2))
453 limit =
sizeof(hex_buf_2);
457 if (limit >=
sizeof(hex_buf_3))
458 limit =
sizeof(hex_buf_3);
472 const u_int8_t *data;
474 static char dq_buf [
DQLEN + 1];
488 sprintf (s,
"%u.%u.%u.%u, ",
489 data [i], data [i + 1], data [i + 2], data [i + 3]);
492 }
while ((s - &dq_buf [0] >
DQLEN - 21) &&
504 static char vbuf [32];
505 sprintf (vbuf,
"%lu", val);
512 static char vbuf [32];
513 sprintf (vbuf,
"%lu", val);
517 static unsigned print_subexpression (
struct expression *,
char *,
unsigned);
519 static unsigned print_subexpression (expr, buf,
len)
527 switch (expr ->
op) {
537 strcpy (buf,
"(match)");
543 rv = 10 + strlen (expr ->
data.
check -> name);
545 sprintf (buf,
"(check %s)",
554 strcpy (buf,
"(eq ");
555 rv += print_subexpression (expr ->
data.
equal [0],
556 buf + rv, len - rv - 2);
558 rv += print_subexpression (expr ->
data.
equal [1],
559 buf + rv, len - rv - 1);
569 strcpy (buf,
"(neq ");
570 rv += print_subexpression (expr ->
data.
equal [0],
571 buf + rv, len - rv - 2);
573 rv += print_subexpression (expr ->
data.
equal [1],
574 buf + rv, len - rv - 1);
584 strcpy(buf,
"(regex ");
585 rv += print_subexpression(expr->
data.
equal[0],
586 buf + rv, len - rv - 2);
588 rv += print_subexpression(expr->
data.
equal[1],
589 buf + rv, len - rv - 1);
599 strcpy (buf,
"(substr ");
601 buf + rv, len - rv - 3);
603 rv += print_subexpression
605 buf + rv, len - rv - 2);
608 buf + rv, len - rv - 1);
618 strcpy (buf,
"(suffix ");
620 buf + rv, len - rv - 2);
624 buf + rv, len - rv - 1);
635 strcpy(buf,
"(lcase ");
636 rv += print_subexpression(expr->
data.
lcase,
637 buf + rv, len - rv - 1);
647 strcpy(buf,
"(ucase ");
648 rv += print_subexpression(expr->
data.
ucase,
649 buf + rv, len - rv - 1);
659 strcpy (buf,
"(concat ");
660 rv += print_subexpression (expr ->
data.
concat [0],
661 buf + rv, len - rv - 2);
663 rv += print_subexpression (expr ->
data.
concat [1],
664 buf + rv, len - rv - 1);
674 strcpy (buf,
"(pick1st ");
675 rv += print_subexpression
677 buf + rv, len - rv - 2);
679 rv += print_subexpression
681 buf + rv, len - rv - 1);
691 sprintf (buf,
"(dns-lookup %s)",
703 strcpy (&buf [1], s);
706 rv += print_subexpression (expr ->
data.
and [0],
707 buf + rv, len - rv - 2);
709 rv += print_subexpression (expr ->
data.
and [1],
710 buf + rv, len - rv - 1);
756 strcpy (buf,
"(not ");
757 rv += print_subexpression (expr ->
data.
not,
758 buf + rv, len - rv - 1);
772 rv = strlen (s) + 2 + (strlen (expr ->
data.
option -> name) +
775 sprintf (buf,
"(option %s.%s)",
784 strcpy (buf,
"(hardware)");
792 strcpy (buf,
"(substr ");
794 buf + rv, len - rv - 2);
797 buf + rv, len - rv - 1);
810 strncpy (buf, s, rv);
816 strcpy (buf,
"(encapsulate ");
829 strcpy (buf,
"(int8 ");
831 buf + rv, len - rv - 1);
841 strcpy (buf,
"(int16 ");
843 buf + rv, len - rv - 1);
853 strcpy (buf,
"(int32 ");
855 buf + rv, len - rv - 1);
865 strcpy (buf,
"(to-int8 ");
867 buf + rv, len - rv - 1);
877 strcpy (buf,
"(to-int16 ");
879 buf + rv, len - rv - 1);
889 strcpy (buf,
"(to-int32 ");
891 buf + rv, len - rv - 1);
908 rv = 10 + (strlen (expr ->
data.
option -> name) +
911 sprintf (buf,
"(exists %s.%s)",
945 s =
"leased-address";
953 s =
"host-decl-name";
975 strcpy (buf,
"(reverse ");
977 buf + rv, len - rv - 2);
980 buf + rv, len - rv - 1);
990 strcpy (buf,
"(b2a ");
992 buf + rv, len - rv - 4);
995 buf + rv, len - rv - 3);
998 buf + rv, len - rv - 2);
1001 buf + rv, len - rv - 1);
1012 strcpy (&buf [1],
"ns-update ");
1013 while (len < rv + 2) {
1014 rv += print_subexpression
1016 buf + rv, len - rv - 2);
1043 if (len > strlen (s) + 1) {
1045 strcpy (buf + 1, s);
1049 if (len > rv + strlen (s) + left) {
1050 strcpy (&buf [rv], s);
1051 rv += strlen (&buf [rv]);
1056 if (len > rv + strlen (s) + left) {
1057 strcpy (&buf [rv], s);
1058 rv += strlen (&buf [rv]);
1062 rv += print_subexpression
1064 buf + rv, len - rv - left);
1067 rv += print_subexpression
1069 buf + rv, len - rv - left);
1072 rv += print_subexpression
1074 buf + rv, len - rv - left);
1083 strcpy (buf,
"(null)");
1090 strcpy (buf,
"(funcall ");
1093 rv += print_subexpression
1103 rv = print_subexpression (expr ->
data.
arg.
val, buf, len);
1118 strcpy (buf,
"(function");
1119 for (foo = expr -> data.func -> args;
1120 foo; foo = foo ->
next) {
1121 if (len > rv + 2 + strlen (foo ->
string)) {
1123 strcpy (&buf [rv], foo ->
string);
1124 rv += strlen (foo ->
string);
1135 strcpy(buf,
"(gethostname)");
1141 log_fatal(
"Impossible case at %s:%d (undefined expression " 1142 "%d).",
MDL, expr->
op);
1154 print_subexpression (expr, buf,
sizeof buf);
1160 const char *suffix, ...)
1166 va_start (list, suffix);
1167 s = va_arg (list,
char *);
1171 s = va_arg (list,
char *);
1177 log_fatal (
"token_print_indent: no memory for copy buffer");
1179 va_start (list, suffix);
1180 s = va_arg (list,
char *);
1186 s = va_arg (list,
char *);
1197 const char *prefix,
const char *suffix,
1205 for (i = 0; i < data -> len; i++)
1206 if (!isascii (data -> data [i]) ||
1207 !isprint (data -> data [i]))
1211 if (i == data -> len) {
1215 memcpy (buf + 1, data -> data, data -> len);
1216 buf [data -> len + 1] =
'"';
1217 buf [data -> len + 2] = 0;
1219 prefix, suffix, buf);
1225 for (i = 0; i < data -> len; i++) {
1226 sprintf (obuf,
"%2.2x", data -> data [i]);
1228 i == 0 ? prefix :
"",
1229 (i + 1 == data -> len
1232 if (i + 1 != data -> len)
1234 prefix, suffix,
":");
1241 const char *suffix,
const char *buf)
1245 len += strlen (prefix);
1247 len += strlen (buf);
1249 if (col + len > 79) {
1250 if (indent + len < 79) {
1255 col = len > 79 ? 0 : 79 - len - 1;
1257 }
else if (prefix && *prefix) {
1258 fputs (prefix, file);
1259 col += strlen (prefix);
1261 if ((buf != NULL) && (*buf != 0)) {
1265 if (suffix && *suffix) {
1266 if (col + strlen (suffix) > 79) {
1270 fputs (suffix, file);
1271 col += strlen (suffix);
1281 for (i = 0; i <
indent; i++)
1285 #if defined (NSUPDATE) 1286 #if defined (DEBUG_DNS_UPDATES) 1307 isc_result_t result)
1310 char *s = obuf, *end = &obuf[
sizeof(obuf)-2];
1312 const char *result_str;
1314 sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
1317 log_info(
"DDNS reply: id ptr %p, result: %s",
1326 memset(obuf, 0, 1024);
1328 en =
"DDNS request: id ptr ";
1329 if (s + strlen(en) + 16 < end) {
1336 switch (ddns_cb->
state) {
1338 en =
" add forward ";
1341 en =
" modify forward ";
1345 en =
" add reverse ";
1349 en =
" remove forward ";
1353 en =
" remove rrset ";
1357 en =
" remove reverse ";
1365 en =
" unknown state ";
1369 switch (ddns_cb->
state) {
1375 if (s + strlen(en) + strlen(ddns_address) +
1377 sprintf(s,
"%s%s for %.*s", en, ddns_address,
1390 sprintf(s,
"%s%.*s for %.*s", en,
1403 if (s + strlen(en) < end) {
1404 sprintf(s,
"%s", en);
1413 if (s + strlen(en) + strlen((
char *)ddns_cb->
zone_name) < end) {
1414 sprintf(s,
"%s%s", en, ddns_cb->
zone_name);
1422 if (s + strlen(en) + ddns_cb->
dhcid.
len-1 < end) {
1425 strncpy(s, (
char *)ddns_cb->
dhcid.
data+1,
1432 en =
" dhcid: <empty>";
1433 if (s + strlen(en) < end) {
1442 if (s + strlen(en) + 10 < end) {
1443 sprintf(s,
"%s%ld", en, ddns_cb->
ttl);
1450 result_str = isc_result_totext(result);
1451 if (s + strlen(en) + strlen(result_str) < end) {
1452 sprintf(s,
"%s%s", en, result_str);
1476 static char buf[
sizeof(
"epoch 9223372036854775807; " 1477 "# Wed Jun 30 21:49:08 2147483647")];
1478 static char buf1[
sizeof(
"# Wed Jun 30 21:49:08 2147483647")];
1495 #if (MAX_TIME > 0x7fffffffffffffff) 1496 if (t > 0x7fffffffffffffff)
1501 since_epoch = mktime(localtime(&t));
1502 if ((strftime(buf1,
sizeof(buf1),
1503 "# %a %b %d %H:%M:%S %Y",
1504 localtime(&t)) == 0) ||
1505 (snprintf(buf,
sizeof(buf),
"epoch %lu; %s",
1506 (
unsigned long)since_epoch, buf1) >=
sizeof(buf)))
1513 if (strftime(buf,
sizeof(buf),
"%w %Y/%m/%d %H:%M:%S;",
char * print_dotted_quads(unsigned len, const u_int8_t *data)
void print_hex_or_string(unsigned len, const u_int8_t *data, unsigned limit, char *buf)
char sname[DHCP_SNAME_LEN]
#define DDNS_PRINT_INBOUND
struct binding_scope * global_scope
unsigned char zone_name[DHCP_MAXDNS_WIRE]
int token_indent_data_string(FILE *file, int col, int indent, const char *prefix, const char *suffix, struct data_string *data)
char * quotify_buf(const unsigned char *s, unsigned len, const char *file, int line)
const char * piaddr(const struct iaddr addr)
#define DDNS_STATE_ADD_FW_NXDOMAIN
struct expression::expr_union::@25 arg
struct expression * equal[2]
struct hash_bucket * next
struct data_string encapsulate
void * dmalloc(unsigned, const char *, int)
struct expression::expr_union::@21 pick_first_value
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
char * print_hw_addr(int htype, const int hlen, const unsigned char *data) const
#define print_hex_1(len, data, limit)
#define DDNS_STATE_REM_PTR
void print_lease(struct lease *lease)
struct expression * lcase
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
struct expression * arglist
struct expression::expr_union::@16 substring
char * print_dec_2(unsigned long val)
void print_expression(char *name, struct expression *expr) const
struct universe dhcp_universe
char * print_dec_1(unsigned long val)
void data_string_forget(struct data_string *data, const char *file, int line)
const char * pretty_print_option(struct option *option, const unsigned char *data, unsigned len, int emit_commas, int emit_quotes)
struct expression * concat[2]
void print_dns_status(int, struct dhcp_ddns_cb *, isc_result_t)
struct expression * offset
void dump_packet(struct packet *)
#define DDNS_STATE_REM_FW_YXDHCID
struct expression * rrdata
struct data_string fwd_name
void indent_spaces(FILE *file, int indent)
#define LOCAL_TIME_FORMAT
struct expression::expr_union::@17 suffix
void log_fatal(const char *,...) __attribute__((__format__(__printf__
struct data_string rev_name
const char * print_time(TIME t)
union expression::expr_union data
struct expression * encode_int
int evaluate_option_cache(struct data_string *result, struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *cfg_options, struct binding_scope **scope, struct option_cache *oc, const char *file, int line)
void print_hex_only(unsigned len, const u_int8_t *data, unsigned limit, char *buf)
struct expression::expr_union::@20 reverse
struct expression * width
#define DDNS_STATE_ADD_PTR
struct expression::expr_union::@22 dns_transaction
void dfree(void *, const char *, int)
struct expression * buffer
#define DEFAULT_TIME_FORMAT
const unsigned char * name
struct expression * and[2]
int int log_info(const char *,...) __attribute__((__format__(__printf__
struct expression::expr_union::@19 b2a
struct expression * extract_int
char * print_base64(const unsigned char *buf, unsigned len, const char *file, int line)
struct universe ** universes
struct data_string const_data
void option_space_foreach(struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, struct option_state *cfg_options, struct binding_scope **scope, struct universe *u, void *stuff, void(*func)(struct option_cache *, struct packet *, struct lease *, struct client_state *, struct option_state *, struct option_state *, struct binding_scope **, struct universe *, void *))
int token_print_indent_concat(FILE *file, int col, int indent, const char *prefix, const char *suffix,...)
struct string_list * next
struct expression * ucase
#define DDNS_STATE_ADD_FW_YXDHCID
char * print_hex(unsigned len, const u_int8_t *data, unsigned limit, unsigned buf_num)
struct expression::expr_union::@23 ns_add
struct collection * check
void dump_raw(unsigned char *buf, unsigned len) const
int token_print_indent(FILE *file, int col, int indent, const char *prefix, const char *suffix, const char *buf)
struct expression * rrname
void dump_packet_option(struct option_cache *, struct packet *, struct lease *, struct client_state *, struct option_state *, struct option_state *, struct binding_scope **, struct universe *, void *)
struct dns_host_entry * host_lookup
void hash_dump(struct hash_table *table)
char * quotify_string(const char *s, const char *file, int line)
const unsigned char * data
struct expression::expr_union::@26 funcall
#define DDNS_STATE_CLEANUP
#define DDNS_STATE_REM_FW_NXRR
struct expression::expr_union::@18 packet
unsigned char options[DHCP_MAX_OPTION_LEN]
struct expression * separator