syslog(2), so just use vis(3).
}
return dst;
}
+
+char *
+vis(char *dst, int c, int flag, int nextc)
+{
+
+ return svis(dst, c, flag, nextc, "");
+}
#define VIS_OCTAL 0x0001 /* use octal \ddd format */
#define VIS_CSTYLE 0x0002 /* use \[nrft0..] where appropiate */
+char *vis(char *dst, int c, int flag, int nextc);
char *svis(char *dst, int c, int flag, int nextc, const char *meta);
#endif
* Any non visible characters are escaped as an octal number.
*/
ssize_t
-print_string(char *s, size_t len, const uint8_t *data, size_t dl)
+print_string(char *s, size_t len, int flags, const uint8_t *data, size_t dl)
{
uint8_t c;
const uint8_t *e, *p;
if (p == e)
break;
}
- ve = svis(v, c, VIS_CSTYLE | VIS_OCTAL,
- data <= e ? *data : 0, ESCAPE_CHARS);
+ if (flags)
+ ve = svis(v, c, VIS_CSTYLE | VIS_OCTAL,
+ data <= e ? *data : 0, ESCAPE_CHARS);
+ else
+ ve = vis(v, c, VIS_CSTYLE | VIS_OCTAL,
+ data <= e ? *data : 0);
if (s && len < (size_t)(ve - v) + 1) {
errno = ENOBUFS;
return -1;
if (tmp == NULL)
return -1;
decode_rfc3397(tmp, l, data, dl);
- sl = print_string(s, len, (uint8_t *)tmp, l - 1);
+ sl = print_string(s, len, 1, (uint8_t *)tmp, l - 1);
free(tmp);
return sl;
}
if ((tmp = decode_rfc3361(data, dl)) == NULL)
return -1;
l = strlen(tmp);
- sl = print_string(s, len, (uint8_t *)tmp, l);
+ sl = print_string(s, len, 1, (uint8_t *)tmp, l);
free(tmp);
return sl;
}
/* Some DHCP servers return NULL strings */
if (*data == '\0')
return 0;
- return print_string(s, len, data, dl);
+ return print_string(s, len, 1, data, dl);
}
if (type & FLAG) {
size_t encode_rfc1035(const char *src, uint8_t *dst);
ssize_t decode_rfc3397(char *, size_t, const uint8_t *, size_t);
-ssize_t print_string(char *, size_t, const uint8_t *, size_t);
+ssize_t print_string(char *, size_t, int, const uint8_t *, size_t);
ssize_t print_option(char *, size_t, int, const uint8_t *, size_t,
const char *);
}
if (*dhcp->bootfile && !(overl & 1)) {
- print_string(safe, sizeof(safe),
+ print_string(safe, sizeof(safe), 1,
dhcp->bootfile, sizeof(dhcp->bootfile));
setvar(&ep, prefix, "filename", safe);
}
if (*dhcp->servername && !(overl & 2)) {
- print_string(safe, sizeof(safe),
+ print_string(safe, sizeof(safe), 1,
dhcp->servername, sizeof(dhcp->servername));
setvar(&ep, prefix, "server_name", safe);
}
struct in_addr addr;
int r;
- if (strcmp(msg, "NAK:") == 0)
+ if (strcmp(msg, "NAK:") == 0) {
a = get_option_string(iface->ctx, dhcp, DHO_MESSAGE);
- else if (ad && dhcp->yiaddr != 0) {
+ if (a) {
+ char *tmp;
+ size_t al, tmpl;
+
+ al = strlen(a);
+ tmpl = (al * 4) + 1;
+ tmp = malloc(tmpl);
+ if (tmp == NULL) {
+ syslog(LOG_ERR, "%s: %m", __func__);
+ free(a);
+ return;
+ }
+ print_string(tmp, tmpl, 0, (uint8_t *)a, al);
+ free(a);
+ a = tmp;
+ }
+ } else if (ad && dhcp->yiaddr != 0) {
addr.s_addr = dhcp->yiaddr;
a = strdup(inet_ntoa(addr));
if (a == NULL) {
tfrom = "from";
r = get_option_addr(iface->ctx, &addr, dhcp, DHO_SERVERID);
if (dhcp->servername[0] && r == 0) {
- print_string(sname, sizeof(sname),
+ print_string(sname, sizeof(sname), 0,
dhcp->servername, strlen((const char *)dhcp->servername));
if (a == NULL)
syslog(lvl, "%s: %s %s %s `%s'", iface->name, msg,
if (ifp->ssid_len) {
ssize_t r;
- r =print_string(pssid, sizeof(pssid), ifp->ssid, ifp->ssid_len);
+
+ r = print_string(pssid, sizeof(pssid), 0,
+ ifp->ssid, ifp->ssid_len);
if (r == -1) {
syslog(LOG_ERR, "%s: %s: %m", ifp->name, __func__);
pssid[0] = '\0';
if (tmp) {
decode_rfc3397(tmp, l, op, n);
l -= 1;
- n = (size_t)print_string(NULL, 0,
+ n = (size_t)print_string(NULL, 0, 1,
(const uint8_t *)tmp, l);
opt = malloc(n);
if (opt)
- print_string(opt, n,
+ print_string(opt, n, 1,
(const uint8_t *)tmp, l);
else
syslog(LOG_ERR, "%s: %m",
ssize_t psl;
pfx_len = strlen(pfx);
- psl = print_string(NULL, 0,
+ psl = print_string(NULL, 0, 1,
(const uint8_t *)ifp->ssid, ifp->ssid_len);
if (psl != -1) {
EMALLOC(elen, pfx_len + (size_t)psl + 1);
memcpy(env[elen], pfx, pfx_len);
- print_string(env[elen] + pfx_len, (size_t)psl,
+ print_string(env[elen] + pfx_len, (size_t)psl, 1,
(const uint8_t *)ifp->ssid, ifp->ssid_len);
elen++;
}