39 for (sp = s; sp && *sp; sp++) {
42 else if (!isascii ((
int)*sp) || !isprint ((
int)*sp))
44 else if (*sp ==
'"' || *sp ==
'\\')
50 buf =
dmalloc (len + 1, file, line);
53 for (sp = s; sp && *sp; sp++) {
56 else if (!isascii ((
int)*sp) || !isprint ((
int)*sp)) {
57 sprintf (nsp,
"\\%03o",
58 *(
const unsigned char *)sp);
60 }
else if (*sp ==
'"' || *sp ==
'\\') {
71 char *
quotify_buf (
const unsigned char *s,
unsigned len,
char enclose_char,
78 for (i = 0; i < len; i++) {
81 else if (!isascii (s [i]) || !isprint (s [i]))
83 else if (s [i] ==
'"' || s [i] ==
'\\')
97 *nsp++ = enclose_char;
100 for (i = 0; i < len; i++) {
103 else if (!isascii (s [i]) || !isprint (s [i])) {
104 sprintf (nsp,
"\\%03o", s [i]);
106 }
else if (s [i] ==
'"' || s [i] ==
'\\') {
114 *nsp++ = enclose_char;
128 static char to64 [] =
129 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
131 bl = ((len * 4 + 2) / 3) + 1;
132 b =
dmalloc (bl + 1, file, line);
144 *s++ = to64 [extra << 4];
148 val = (extra << 8) + buf [i++];
153 *s++ = to64 [extra << 2];
157 val = (extra << 8) + buf [i++];
174 const
unsigned char *
data;
176 static char habuf [49];
184 for (i = 0; i < hlen; i++) {
185 sprintf (s,
"%02x", data [i]);
203 t = gmtime (&lease -> starts);
204 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
207 t = gmtime (&lease -> ends);
208 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
211 if (lease -> hardware_addr.hlen)
214 lease -> hardware_addr.hlen - 1,
215 &lease -> hardware_addr.hbuf [1]));
217 lease -> host ? lease -> host -> name :
"<none>");
220 #if defined (DEBUG_PACKET) 230 const char *name, *dot;
232 memset (&ds, 0,
sizeof ds);
242 in_options, cfg_options, scope, oc,
MDL)) {
244 name, dot, oc ->
option -> name,
256 log_debug (
"packet length %d", tp -> packet_length);
257 log_debug (
"op = %d htype = %d hlen = %d hops = %d",
259 log_debug (
"xid = %x secs = %ld flags = %x",
265 log_debug (
"chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
266 ((
unsigned char *)(tdp ->
chaddr)) [0],
267 ((
unsigned char *)(tdp ->
chaddr)) [1],
268 ((
unsigned char *)(tdp ->
chaddr)) [2],
269 ((
unsigned char *)(tdp ->
chaddr)) [3],
270 ((
unsigned char *)(tdp ->
chaddr)) [4],
271 ((
unsigned char *)(tdp ->
chaddr)) [5]);
274 if (tp -> options_valid) {
294 const
unsigned char *buf;
307 memset(lbuf,
' ', 79);
310 for (i = 0; i < len; i++) {
319 memset(lbuf,
' ', 79);
321 sprintf (lbuf,
"%03x:", i);
323 }
else if ((i & 7) == 0)
326 if(isprint(buf[i])) {
327 lbuf[56+(i%16)]=buf[i];
332 sprintf (&lbuf [lbix],
" %02x", buf [i]);
353 for (i = 0; i < table -> hash_count; i++) {
354 if (!table -> buckets [i])
357 for (bp = table -> buckets [i]; bp; bp = bp ->
next) {
382 const u_int8_t *data;
388 if ((buf == NULL) || (limit < 3))
391 for (i = 0; (i < limit / 3) && (i < len); i++) {
392 sprintf(&buf[i*3],
"%02x:", data[i]);
394 buf[(i * 3) - 1] = 0;
409 const u_int8_t *data;
414 if ((buf == NULL) || (limit < 3))
417 for (i = 0; (i < (limit - 3)) && (i <
len); i++) {
418 if (!isascii(data[i]) || !isprint(data[i])) {
428 memcpy(&buf[1], data, i);
446 const u_int8_t *data;
450 static char hex_buf_1[
HBLEN + 1];
451 static char hex_buf_2[
HBLEN + 1];
452 static char hex_buf_3[
HBLEN + 1];
458 if (limit >=
sizeof(hex_buf_1))
459 limit =
sizeof(hex_buf_1);
463 if (limit >=
sizeof(hex_buf_2))
464 limit =
sizeof(hex_buf_2);
468 if (limit >=
sizeof(hex_buf_3))
469 limit =
sizeof(hex_buf_3);
483 const u_int8_t *data;
485 static char dq_buf [
DQLEN + 1];
499 sprintf (s,
"%u.%u.%u.%u, ",
500 data [i], data [i + 1], data [i + 2], data [i + 3]);
503 }
while ((s - &dq_buf [0] >
DQLEN - 21) &&
515 static char vbuf [32];
516 sprintf (vbuf,
"%lu", val);
523 static char vbuf [32];
524 sprintf (vbuf,
"%lu", val);
528 static unsigned print_subexpression (
struct expression *,
char *,
unsigned);
530 static unsigned print_subexpression (expr, buf,
len)
538 switch (expr ->
op) {
548 strcpy (buf,
"(match)");
554 rv = 10 + strlen (expr ->
data.
check -> name);
556 sprintf (buf,
"(check %s)",
565 strcpy (buf,
"(eq ");
566 rv += print_subexpression (expr ->
data.
equal [0],
567 buf + rv, len - rv - 2);
569 rv += print_subexpression (expr ->
data.
equal [1],
570 buf + rv, len - rv - 1);
580 strcpy (buf,
"(neq ");
581 rv += print_subexpression (expr ->
data.
equal [0],
582 buf + rv, len - rv - 2);
584 rv += print_subexpression (expr ->
data.
equal [1],
585 buf + rv, len - rv - 1);
595 strcpy(buf,
"(regex ");
596 rv += print_subexpression(expr->
data.
equal[0],
597 buf + rv, len - rv - 2);
599 rv += print_subexpression(expr->
data.
equal[1],
600 buf + rv, len - rv - 1);
610 strcpy (buf,
"(substr ");
612 buf + rv, len - rv - 3);
614 rv += print_subexpression
616 buf + rv, len - rv - 2);
619 buf + rv, len - rv - 1);
629 strcpy (buf,
"(suffix ");
631 buf + rv, len - rv - 2);
635 buf + rv, len - rv - 1);
646 strcpy(buf,
"(lcase ");
647 rv += print_subexpression(expr->
data.
lcase,
648 buf + rv, len - rv - 1);
658 strcpy(buf,
"(ucase ");
659 rv += print_subexpression(expr->
data.
ucase,
660 buf + rv, len - rv - 1);
670 strcpy (buf,
"(concat ");
671 rv += print_subexpression (expr ->
data.
concat [0],
672 buf + rv, len - rv - 2);
674 rv += print_subexpression (expr ->
data.
concat [1],
675 buf + rv, len - rv - 1);
685 strcpy (buf,
"(pick1st ");
686 rv += print_subexpression
688 buf + rv, len - rv - 2);
690 rv += print_subexpression
692 buf + rv, len - rv - 1);
702 sprintf (buf,
"(dns-lookup %s)",
714 strcpy (&buf [1], s);
717 rv += print_subexpression (expr ->
data.
and [0],
718 buf + rv, len - rv - 2);
720 rv += print_subexpression (expr ->
data.
and [1],
721 buf + rv, len - rv - 1);
767 strcpy (buf,
"(not ");
768 rv += print_subexpression (expr ->
data.
not,
769 buf + rv, len - rv - 1);
783 rv = strlen (s) + 2 + (strlen (expr ->
data.
option -> name) +
786 sprintf (buf,
"(option %s.%s)",
795 strcpy (buf,
"(hardware)");
803 strcpy (buf,
"(substr ");
805 buf + rv, len - rv - 2);
808 buf + rv, len - rv - 1);
821 strncpy (buf, s, rv);
827 strcpy (buf,
"(encapsulate ");
840 strcpy (buf,
"(int8 ");
842 buf + rv, len - rv - 1);
852 strcpy (buf,
"(int16 ");
854 buf + rv, len - rv - 1);
864 strcpy (buf,
"(int32 ");
866 buf + rv, len - rv - 1);
876 strcpy (buf,
"(to-int8 ");
878 buf + rv, len - rv - 1);
888 strcpy (buf,
"(to-int16 ");
890 buf + rv, len - rv - 1);
900 strcpy (buf,
"(to-int32 ");
902 buf + rv, len - rv - 1);
919 rv = 10 + (strlen (expr ->
data.
option -> name) +
922 sprintf (buf,
"(exists %s.%s)",
956 s =
"leased-address";
964 s =
"host-decl-name";
986 strcpy (buf,
"(reverse ");
988 buf + rv, len - rv - 2);
991 buf + rv, len - rv - 1);
1001 strcpy (buf,
"(b2a ");
1003 buf + rv, len - rv - 4);
1006 buf + rv, len - rv - 3);
1009 buf + rv, len - rv - 2);
1012 buf + rv, len - rv - 1);
1023 strcpy (&buf [1],
"ns-update ");
1024 while (len < rv + 2) {
1025 rv += print_subexpression
1027 buf + rv, len - rv - 2);
1054 if (len > strlen (s) + 1) {
1056 strcpy (buf + 1, s);
1060 if (len > rv + strlen (s) + left) {
1061 strcpy (&buf [rv], s);
1062 rv += strlen (&buf [rv]);
1067 if (len > rv + strlen (s) + left) {
1068 strcpy (&buf [rv], s);
1069 rv += strlen (&buf [rv]);
1073 rv += print_subexpression
1075 buf + rv, len - rv - left);
1078 rv += print_subexpression
1080 buf + rv, len - rv - left);
1083 rv += print_subexpression
1085 buf + rv, len - rv - left);
1094 strcpy (buf,
"(null)");
1101 strcpy (buf,
"(funcall ");
1104 rv += print_subexpression
1114 rv = print_subexpression (expr ->
data.
arg.
val, buf, len);
1129 strcpy (buf,
"(function");
1130 for (foo = expr -> data.func -> args;
1131 foo; foo = foo ->
next) {
1132 if (len > rv + 2 + strlen (foo ->
string)) {
1134 strcpy (&buf [rv], foo ->
string);
1135 rv += strlen (foo ->
string);
1146 strcpy(buf,
"(gethostname)");
1152 log_fatal(
"Impossible case at %s:%d (undefined expression " 1153 "%d).",
MDL, expr->
op);
1165 print_subexpression (expr, buf,
sizeof buf);
1171 const char *suffix, ...)
1177 va_start (list, suffix);
1178 s = va_arg (list,
char *);
1182 s = va_arg (list,
char *);
1188 log_fatal (
"token_print_indent: no memory for copy buffer");
1190 va_start (list, suffix);
1191 s = va_arg (list,
char *);
1197 s = va_arg (list,
char *);
1208 const char *prefix,
const char *suffix,
1216 for (i = 0; i < data -> len; i++)
1217 if (!isascii (data -> data [i]) ||
1218 !isprint (data -> data [i]))
1222 if (i == data -> len) {
1226 memcpy (buf + 1, data -> data, data -> len);
1227 buf [data -> len + 1] =
'"';
1228 buf [data -> len + 2] = 0;
1230 prefix, suffix, buf);
1236 for (i = 0; i < data -> len; i++) {
1237 sprintf (obuf,
"%2.2x", data -> data [i]);
1239 i == 0 ? prefix :
"",
1240 (i + 1 == data -> len
1243 if (i + 1 != data -> len)
1245 prefix, suffix,
":");
1252 const char *suffix,
const char *buf)
1256 len += strlen (prefix);
1258 len += strlen (buf);
1260 if (col + len > 79) {
1261 if (indent + len < 79) {
1266 col = len > 79 ? 0 : 79 - len - 1;
1268 }
else if (prefix && *prefix) {
1269 fputs (prefix, file);
1270 col += strlen (prefix);
1272 if ((buf != NULL) && (*buf != 0)) {
1276 if (suffix && *suffix) {
1277 if (col + strlen (suffix) > 79) {
1281 fputs (suffix, file);
1282 col += strlen (suffix);
1292 for (i = 0; i <
indent; i++)
1296 #if defined (NSUPDATE) 1297 #if defined (DEBUG_DNS_UPDATES) 1318 isc_result_t result)
1321 char *s = obuf, *end = &obuf[
sizeof(obuf)-2];
1323 const char *result_str;
1325 sizeof(
"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")];
1328 log_info(
"DDNS reply: id ptr %p, result: %s",
1337 memset(obuf, 0, 1024);
1339 en =
"DDNS request: id ptr ";
1340 if (s + strlen(en) + 16 < end) {
1347 switch (ddns_cb->
state) {
1349 en =
" add forward ";
1352 en =
" modify forward ";
1356 en =
" add reverse ";
1360 en =
" remove forward ";
1364 en =
" remove rrset ";
1368 en =
" remove reverse ";
1376 en =
" unknown state ";
1380 switch (ddns_cb->
state) {
1386 if (s + strlen(en) + strlen(ddns_address) +
1388 sprintf(s,
"%s%s for %.*s", en, ddns_address,
1401 sprintf(s,
"%s%.*s for %.*s", en,
1414 if (s + strlen(en) < end) {
1415 sprintf(s,
"%s", en);
1424 if (s + strlen(en) + strlen((
char *)ddns_cb->
zone_name) < end) {
1425 sprintf(s,
"%s%s", en, ddns_cb->
zone_name);
1433 if (s + strlen(en) + ddns_cb->
dhcid.
len-1 < end) {
1436 strncpy(s, (
char *)ddns_cb->
dhcid.
data+1,
1443 en =
" dhcid: <empty>";
1444 if (s + strlen(en) < end) {
1453 if (s + strlen(en) + 10 < end) {
1454 sprintf(s,
"%s%ld", en, ddns_cb->
ttl);
1461 result_str = isc_result_totext(result);
1462 if (s + strlen(en) + strlen(result_str) < end) {
1463 sprintf(s,
"%s%s", en, result_str);
1487 static char buf[
sizeof(
"epoch 9223372036854775807; " 1488 "# Wed Jun 30 21:49:08 2147483647")];
1489 static char buf1[
sizeof(
"# Wed Jun 30 21:49:08 2147483647")];
1506 #if (MAX_TIME > 0x7fffffffffffffff) 1507 if (t > 0x7fffffffffffffff)
1512 since_epoch = mktime(localtime(&t));
1513 if ((strftime(buf1,
sizeof(buf1),
1514 "# %a %b %d %H:%M:%S %Y",
1515 localtime(&t)) == 0) ||
1516 (snprintf(buf,
sizeof(buf),
"epoch %lu; %s",
1517 (
unsigned long)since_epoch, buf1) >=
sizeof(buf)))
1524 if (strftime(buf,
sizeof(buf),
"%w %Y/%m/%d %H:%M:%S;",
1601 int format,
const char *
file,
int line) {
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)
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)
char * quotify_buf(const unsigned char *s, unsigned len, char enclose_char, const char *file, int line)
#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
char * format_lease_id(const unsigned char *s, unsigned len, int format, const char *file, int line)
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
char * buf_to_hex(const unsigned char *s, unsigned len, const char *file, int line)
struct expression::expr_union::@18 packet
unsigned char options[DHCP_MAX_OPTION_LEN]
struct expression * separator