void ds_put_format(struct ds *, const char *, ...) PRINTF_FORMAT(2, 3);
void ds_put_format_valist(struct ds *, const char *, va_list)
PRINTF_FORMAT(2, 0);
+void ds_put_printable(struct ds *, const char *, size_t);
void ds_put_hex_dump(struct ds *ds, const void *buf_, size_t size,
uintptr_t ofs, bool ascii);
char *ds_cstr(struct ds *);
if (class->type == DHCP_ARG_STRING) {
ds_put_char(ds, '"');
+ ds_put_printable(ds, opt->data, opt->n);
+ ds_put_char(ds, '"');
+ return ds_cstr(ds);
}
for (offset = 0; offset + type->size <= opt->n; offset += type->size) {
const void *p = (const char *) opt->data + offset;
const uint8_t *uint8 = p;
const uint32_t *uint32 = p;
const uint16_t *uint16 = p;
- const char *cp = p;
- unsigned char c;
if (offset && class->type != DHCP_ARG_STRING) {
ds_put_cstr(ds, class->type == DHCP_ARG_UINT8 ? ":" : ", ");
put_duration(ds, ntohl(*uint32));
break;
case DHCP_ARG_STRING:
- c = *cp;
- if (isprint(c) && (!isspace(c) || c == ' ') && c != '\\') {
- ds_put_char(ds, *cp);
- } else {
- ds_put_format(ds, "\\%03o", (int) c);
- }
- break;
+ NOT_REACHED();
case DHCP_ARG_BOOLEAN:
if (*uint8 == 0) {
ds_put_cstr(ds, "false");
break;
}
}
- if (class->type == DHCP_ARG_STRING) {
- ds_put_char(ds, '"');
- }
if (offset != opt->n) {
if (offset) {
ds_put_cstr(ds, ", ");
}
}
+void
+ds_put_printable(struct ds *ds, const char *s, size_t n)
+{
+ ds_reserve(ds, ds->length + n);
+ while (n-- > 0) {
+ unsigned char c = *s++;
+ if (c < 0x20 || c > 0x7e || c == '\\' || c == '"') {
+ ds_put_format(ds, "\\%03o", (int) c);
+ } else {
+ ds_put_char(ds, c);
+ }
+ }
+}
+
char *
ds_cstr(struct ds *ds)
{