39 for (sp = s; sp && *sp; sp++) {
42 else if (!isascii ((
int)*sp) || !isprint ((
int)*sp))
44 else if (*sp ==
'"' || *sp ==
'\\')
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;
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;
178 static char habuf [60];
179 int max_bytes =
sizeof(habuf) / 3;
183 if (hlen <= 0 || data == NULL)
187 if (hlen > max_bytes) {
193 for (i = 0; i < hlen; i++) {
194 sprintf (s,
"%02x", data [i]);
201 log_error(
"Hardware address %s truncated from %d to %d bytes",
202 habuf, orig_hlen, max_bytes);
217 t = gmtime (&
lease -> starts);
218 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
221 t = gmtime (&
lease -> ends);
222 strftime (tbuf,
sizeof tbuf,
"%Y/%m/%d %H:%M:%S", t);
225 if (
lease -> hardware_addr.hlen)
228 lease -> hardware_addr.hlen - 1,
229 &
lease -> hardware_addr.hbuf [1]));
231 lease -> host ?
lease -> host -> name :
"<none>");
234 #if defined (DEBUG_PACKET)
244 const char *name, *dot;
246 memset (&ds, 0,
sizeof ds);
256 in_options, cfg_options, scope, oc,
MDL)) {
258 name, dot, oc ->
option -> name,
260 ds.data, ds.len, 1, 1));
270 log_debug (
"packet length %d", tp -> packet_length);
271 log_debug (
"op = %d htype = %d hlen = %d hops = %d",
273 log_debug (
"xid = %x secs = %ld flags = %x",
279 log_debug (
"chaddr = %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x",
280 ((
unsigned char *)(tdp ->
chaddr)) [0],
281 ((
unsigned char *)(tdp ->
chaddr)) [1],
282 ((
unsigned char *)(tdp ->
chaddr)) [2],
283 ((
unsigned char *)(tdp ->
chaddr)) [3],
284 ((
unsigned char *)(tdp ->
chaddr)) [4],
285 ((
unsigned char *)(tdp ->
chaddr)) [5]);
288 if (tp -> options_valid) {
308 const unsigned char *buf;
321 memset(lbuf,
' ', 79);
324 for (i = 0; i < len; i++) {
333 memset(lbuf,
' ', 79);
335 sprintf (lbuf,
"%03x:", i);
337 }
else if ((i & 7) == 0)
340 if(isprint(buf[i])) {
341 lbuf[56+(i%16)]=buf[i];
346 sprintf (&lbuf [lbix],
" %02x", buf [i]);
367 for (i = 0; i < table -> hash_count; i++) {
368 if (!table -> buckets [i])
371 for (bp = table -> buckets [i]; bp; bp = bp ->
next) {
396 const u_int8_t *data;
403 if (data == NULL || bufptr == NULL || limit == 0) {
407 if (((
len == 0) || ((
len * 3) > limit))) {
412 for ( ;
byte <
len; ++byte) {
417 sprintf(bufptr,
"%02x", data[
byte]);
435 const u_int8_t *data;
440 if ((buf == NULL) || (limit < 3))
443 for (i = 0; (i < (limit - 3)) && (i <
len); i++) {
444 if (!isascii(data[i]) || !isprint(data[i])) {
454 memcpy(&buf[1], data, i);
472 const u_int8_t *data;
476 static char hex_buf_1[
HBLEN + 1];
477 static char hex_buf_2[
HBLEN + 1];
478 static char hex_buf_3[
HBLEN + 1];
484 if (limit >=
sizeof(hex_buf_1))
485 limit =
sizeof(hex_buf_1);
489 if (limit >=
sizeof(hex_buf_2))
490 limit =
sizeof(hex_buf_2);
494 if (limit >=
sizeof(hex_buf_3))
495 limit =
sizeof(hex_buf_3);
509 const u_int8_t *data;
511 static char dq_buf [
DQLEN + 1];
525 sprintf (s,
"%u.%u.%u.%u, ",
526 data [i], data [i + 1], data [i + 2], data [i + 3]);
529 }
while ((s - &dq_buf [0] >
DQLEN - 21) &&
541 static char vbuf [32];
542 sprintf (vbuf,
"%lu", val);
549 static char vbuf [32];
550 sprintf (vbuf,
"%lu", val);
554 static unsigned print_subexpression (
struct expression *,
char *,
unsigned);
556 static unsigned print_subexpression (expr, buf,
len)
564 switch (expr ->
op) {
574 strcpy (buf,
"(match)");
580 rv = 10 + strlen (expr ->
data.
check -> name);
582 sprintf (buf,
"(check %s)",
591 strcpy (buf,
"(eq ");
592 rv += print_subexpression (expr ->
data.
equal [0],
593 buf + rv, len - rv - 2);
595 rv += print_subexpression (expr ->
data.
equal [1],
596 buf + rv, len - rv - 1);
606 strcpy (buf,
"(neq ");
607 rv += print_subexpression (expr ->
data.
equal [0],
608 buf + rv, len - rv - 2);
610 rv += print_subexpression (expr ->
data.
equal [1],
611 buf + rv, len - rv - 1);
621 strcpy(buf,
"(regex ");
622 rv += print_subexpression(expr->
data.
equal[0],
623 buf + rv, len - rv - 2);
625 rv += print_subexpression(expr->
data.
equal[1],
626 buf + rv, len - rv - 1);
636 strcpy (buf,
"(substr ");
638 buf + rv, len - rv - 3);
640 rv += print_subexpression
642 buf + rv, len - rv - 2);
645 buf + rv, len - rv - 1);
655 strcpy (buf,
"(suffix ");
657 buf + rv, len - rv - 2);
661 buf + rv, len - rv - 1);
672 strcpy(buf,
"(lcase ");
673 rv += print_subexpression(expr->
data.
lcase,
674 buf + rv, len - rv - 1);
684 strcpy(buf,
"(ucase ");
685 rv += print_subexpression(expr->
data.
ucase,
686 buf + rv, len - rv - 1);
696 strcpy (buf,
"(concat ");
697 rv += print_subexpression (expr ->
data.
concat [0],
698 buf + rv, len - rv - 2);
700 rv += print_subexpression (expr ->
data.
concat [1],
701 buf + rv, len - rv - 1);
711 strcpy (buf,
"(pick1st ");
712 rv += print_subexpression
714 buf + rv, len - rv - 2);
716 rv += print_subexpression
718 buf + rv, len - rv - 1);
728 sprintf (buf,
"(dns-lookup %s)",
740 strcpy (&buf [1], s);
743 rv += print_subexpression (expr ->
data.
and [0],
744 buf + rv, len - rv - 2);
746 rv += print_subexpression (expr ->
data.
and [1],
747 buf + rv, len - rv - 1);
793 strcpy (buf,
"(not ");
794 rv += print_subexpression (expr ->
data.
not,
795 buf + rv, len - rv - 1);
809 rv = strlen (s) + 2 + (strlen (expr ->
data.
option -> name) +
812 sprintf (buf,
"(option %s.%s)",
821 strcpy (buf,
"(hardware)");
829 strcpy (buf,
"(substr ");
831 buf + rv, len - rv - 2);
834 buf + rv, len - rv - 1);
847 strncpy (buf, s, rv);
853 strcpy (buf,
"(encapsulate ");
866 strcpy (buf,
"(int8 ");
868 buf + rv, len - rv - 1);
878 strcpy (buf,
"(int16 ");
880 buf + rv, len - rv - 1);
890 strcpy (buf,
"(int32 ");
892 buf + rv, len - rv - 1);
902 strcpy (buf,
"(to-int8 ");
904 buf + rv, len - rv - 1);
914 strcpy (buf,
"(to-int16 ");
916 buf + rv, len - rv - 1);
926 strcpy (buf,
"(to-int32 ");
928 buf + rv, len - rv - 1);
945 rv = 10 + (strlen (expr ->
data.
option -> name) +
948 sprintf (buf,
"(exists %s.%s)",
982 s =
"leased-address";
990 s =
"host-decl-name";
1012 strcpy (buf,
"(reverse ");
1014 buf + rv, len - rv - 2);
1017 buf + rv, len - rv - 1);
1027 strcpy (buf,
"(b2a ");
1029 buf + rv, len - rv - 4);
1032 buf + rv, len - rv - 3);
1035 buf + rv, len - rv - 2);
1038 buf + rv, len - rv - 1);
1049 strcpy (&buf [1],
"ns-update ");
1050 while (len < rv + 2) {
1051 rv += print_subexpression
1053 buf + rv, len - rv - 2);
1080 if (len > strlen (s) + 1) {
1082 strcpy (buf + 1, s);
1086 if (len > rv + strlen (s) + left) {
1087 strcpy (&buf [rv], s);
1088 rv += strlen (&buf [rv]);
1093 if (len > rv + strlen (s) + left) {
1094 strcpy (&buf [rv], s);
1095 rv += strlen (&buf [rv]);
1099 rv += print_subexpression
1101 buf + rv, len - rv - left);
1104 rv += print_subexpression
1106 buf + rv, len - rv - left);
1109 rv += print_subexpression
1111 buf + rv, len - rv - left);
1120 strcpy (buf,
"(null)");
1127 strcpy (buf,
"(funcall ");
1130 rv += print_subexpression
1140 rv = print_subexpression (expr ->
data.
arg.
val, buf, len);
1155 strcpy (buf,
"(function");
1156 for (foo = expr -> data.func -> args;
1157 foo; foo = foo ->
next) {
1158 if (len > rv + 2 + strlen (foo ->
string)) {
1160 strcpy (&buf [rv], foo ->
string);
1161 rv += strlen (foo ->
string);
1172 strcpy(buf,
"(gethostname)");
1178 log_fatal(
"Impossible case at %s:%d (undefined expression "
1179 "%d).",
MDL, expr->
op);
1191 print_subexpression (expr, buf,
sizeof buf);
1197 const char *suffix, ...)
1203 va_start (list, suffix);
1204 s = va_arg (list,
char *);
1208 s = va_arg (list,
char *);
1214 log_fatal (
"token_print_indent: no memory for copy buffer");
1216 va_start (list, suffix);
1217 s = va_arg (list,
char *);
1223 s = va_arg (list,
char *);
1234 const char *prefix,
const char *suffix,
1242 for (i = 0; i <
data -> len; i++)
1248 if (i ==
data -> len) {
1253 buf [
data -> len + 1] =
'"';
1254 buf [
data -> len + 2] = 0;
1256 prefix, suffix, buf);
1262 for (i = 0; i <
data -> len; i++) {
1263 sprintf (obuf,
"%2.2x",
data ->
data [i]);
1265 i == 0 ? prefix :
"",
1266 (i + 1 ==
data -> len
1269 if (i + 1 !=
data -> len)
1271 prefix, suffix,
":");
1278 const char *suffix,
const char *buf)
1282 len += strlen (prefix);
1284 len += strlen (buf);
1286 if (col + len > 79) {
1292 col = len > 79 ? 0 : 79 - len - 1;
1294 }
else if (prefix && *prefix) {
1295 fputs (prefix,
file);
1296 col += strlen (prefix);
1298 if ((buf != NULL) && (*buf != 0)) {
1302 if (suffix && *suffix) {
1303 if (col + strlen (suffix) > 79) {
1307 fputs (suffix,
file);
1308 col += strlen (suffix);
1318 for (i = 0; i <
indent; i++)
1328 static char buf[
sizeof(
"epoch 9223372036854775807; "
1329 "# Wed Jun 30 21:49:08 2147483647")];
1330 static char buf1[
sizeof(
"# Wed Jun 30 21:49:08 2147483647")];
1347 #if (MAX_TIME > 0x7fffffffffffffff)
1348 if (t > 0x7fffffffffffffff)
1353 since_epoch = mktime(localtime(&t));
1354 if ((strftime(buf1,
sizeof(buf1),
1355 "# %a %b %d %H:%M:%S %Y",
1356 localtime(&t)) == 0) ||
1357 (snprintf(buf,
sizeof(buf),
"epoch %lu; %s",
1358 (
unsigned long)since_epoch, buf1) >=
sizeof(buf)))
1365 if (strftime(buf,
sizeof(buf),
"%w %Y/%m/%d %H:%M:%S;",
1442 int format,
const char *
file,
int line) {
1468 char *abspath = NULL;
1476 if (realpath(orgpath, buf) == NULL) {
1477 const char* errmsg = strerror(errno);
1478 log_fatal(
"Failed to get realpath for %s: %s",
1484 if (abspath == NULL) {
1485 log_fatal(
"No memory for filename:%s\n",
1489 memcpy (abspath, buf, strlen(buf));
1490 abspath[strlen(buf)] = 0x0;
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)
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 *))
char * quotify_buf(const unsigned char *s, unsigned len, char enclose_char, const char *file, int line)
int token_indent_data_string(FILE *file, int col, int indent, const char *prefix, const char *suffix, struct data_string *data)
int token_print_indent_concat(FILE *file, int col, int indent, const char *prefix, const char *suffix,...)
void print_expression(char *name, struct expression *expr) const
char * quotify_string(const char *s, const char *file, int line)
char * print_dec_2(unsigned long val)
const char * print_time(TIME t)
char * print_dec_1(unsigned long val)
char * print_hw_addr(int htype, int hlen, const unsigned char *data) const
void indent_spaces(FILE *file, int indent)
void hash_dump(struct hash_table *table)
char * format_lease_id(const unsigned char *s, unsigned len, int format, const char *file, int line)
char * print_hex(unsigned len, const u_int8_t *data, unsigned limit, unsigned buf_num)
void print_lease(struct lease *lease)
void print_hex_or_string(unsigned len, const u_int8_t *data, unsigned limit, char *buf)
char * print_dotted_quads(unsigned len, const u_int8_t *data)
char * buf_to_hex(const unsigned char *s, unsigned len, const char *file, int line)
char * absolute_path(const char *orgpath)
int token_print_indent(FILE *file, int col, int indent, const char *prefix, const char *suffix, const char *buf)
void print_hex_only(unsigned len, const u_int8_t *data, unsigned limit, char *buf)
void dump_raw(unsigned char *buf, unsigned len) const
char * print_base64(const unsigned char *buf, unsigned len, const char *file, int line)
#define DEFAULT_TIME_FORMAT
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 *)
void dump_packet(struct packet *)
#define LOCAL_TIME_FORMAT
struct universe dhcp_universe
#define print_hex_1(len, data, limit)
struct iaddr ip_addr(struct iaddr subnet, struct iaddr mask, u_int32_t host_address)
const char * piaddr(const struct iaddr addr)
void * dmalloc(size_t, const char *, int)
void dfree(void *, const char *, int)
int log_error(const char *,...) __attribute__((__format__(__printf__
int int int log_debug(const char *,...) __attribute__((__format__(__printf__
void log_fatal(const char *,...) __attribute__((__format__(__printf__
int int log_info(const char *,...) __attribute__((__format__(__printf__
const unsigned char * data
unsigned char options[DHCP_MAX_OPTION_LEN]
char sname[DHCP_SNAME_LEN]
union expression::expr_union data
struct hash_bucket * next
const unsigned char * name
struct string_list * next
struct universe ** universes
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)
struct binding_scope * global_scope
@ expr_variable_reference
struct expression * rrname
struct dns_host_entry * host_lookup
struct expression::expr_union::@22 dns_transaction
struct expression * extract_int
struct expression * ucase
struct expression::expr_union::@25 arg
struct expression * rrdata
struct collection * check
struct expression * arglist
struct expression::expr_union::@19 b2a
struct expression * encode_int
struct expression::expr_union::@20 reverse
struct data_string encapsulate
struct expression * and[2]
struct expression * separator
struct expression::expr_union::@17 suffix
struct expression::expr_union::@16 substring
struct expression * lcase
struct expression::expr_union::@18 packet
struct expression::expr_union::@21 pick_first_value
struct data_string const_data
struct expression::expr_union::@23 ns_add
struct expression * offset
struct expression * width
struct expression * buffer
struct expression * concat[2]
struct expression * equal[2]
struct expression::expr_union::@26 funcall