basic: introduce generic ascii_strlower_n() call and make use of it everywhere

This commit is contained in:
Lennart Poettering 2016-01-07 19:43:26 +01:00
parent d424da2ae0
commit b577e3d589
5 changed files with 32 additions and 29 deletions

View file

@ -317,14 +317,33 @@ char *truncate_nl(char *s) {
return s; return s;
} }
char ascii_tolower(char x) {
if (x >= 'A' && x <= 'Z')
return x - 'A' + 'a';
return x;
}
char *ascii_strlower(char *t) { char *ascii_strlower(char *t) {
char *p; char *p;
assert(t); assert(t);
for (p = t; *p; p++) for (p = t; *p; p++)
if (*p >= 'A' && *p <= 'Z') *p = ascii_tolower(*p);
*p = *p - 'A' + 'a';
return t;
}
char *ascii_strlower_n(char *t, size_t n) {
size_t i;
if (n <= 0)
return t;
for (i = 0; i < n; i++)
t[i] = ascii_tolower(t[i]);
return t; return t;
} }

View file

@ -130,7 +130,9 @@ char *strstrip(char *s);
char *delete_chars(char *s, const char *bad); char *delete_chars(char *s, const char *bad);
char *truncate_nl(char *s); char *truncate_nl(char *s);
char *ascii_strlower(char *path); char ascii_tolower(char x);
char *ascii_strlower(char *s);
char *ascii_strlower_n(char *s, size_t n);
bool chars_intersect(const char *a, const char *b) _pure_; bool chars_intersect(const char *a, const char *b) _pure_;

View file

@ -890,8 +890,6 @@ int dnssec_canonicalize(const char *n, char *buffer, size_t buffer_max) {
return -ENOBUFS; return -ENOBUFS;
for (;;) { for (;;) {
size_t i;
r = dns_label_unescape(&n, buffer, buffer_max); r = dns_label_unescape(&n, buffer, buffer_max);
if (r < 0) if (r < 0)
return r; return r;
@ -918,11 +916,7 @@ int dnssec_canonicalize(const char *n, char *buffer, size_t buffer_max) {
if (memchr(buffer, '.', r)) if (memchr(buffer, '.', r))
return -EINVAL; return -EINVAL;
for (i = 0; i < (size_t) r; i ++) { ascii_strlower_n(buffer, (size_t) r);
if (buffer[i] >= 'A' && buffer[i] <= 'Z')
buffer[i] = buffer[i] - 'A' + 'a';
}
buffer[r] = '.'; buffer[r] = '.';
buffer += r + 1; buffer += r + 1;

View file

@ -466,12 +466,8 @@ int dns_packet_append_label(DnsPacket *p, const char *d, size_t l, bool canonica
/* Generate in canonical form, as defined by DNSSEC /* Generate in canonical form, as defined by DNSSEC
* RFC 4034, Section 6.2, i.e. all lower-case. */ * RFC 4034, Section 6.2, i.e. all lower-case. */
for (i = 0; i < l; i++) { for (i = 0; i < l; i++)
if (d[i] >= 'A' && d[i] <= 'Z') w[i] = (uint8_t) ascii_tolower(d[i]);
w[i] = (uint8_t) (d[i] - 'A' + 'a');
else
w[i] = (uint8_t) d[i];
}
} else } else
/* Otherwise, just copy the string unaltered. This is /* Otherwise, just copy the string unaltered. This is
* essential for DNS-SD, where the casing of labels * essential for DNS-SD, where the casing of labels

View file

@ -913,19 +913,11 @@ int dns_name_to_wire_format(const char *domain, uint8_t *buffer, size_t len, boo
if (r < 0) if (r < 0)
return r; return r;
if (canonical) { /* Optionally, output the name in DNSSEC canonical
size_t i; * format, as described in RFC 4034, section 6.2. Or
* in other words: in lower-case. */
/* Optionally, output the name in DNSSEC if (canonical)
* canonical format, as described in RFC 4034, ascii_strlower_n((char*) out, (size_t) r);
* section 6.2. Or in other words: in
* lower-case. */
for (i = 0; i < (size_t) r; i++) {
if (out[i] >= 'A' && out[i] <= 'Z')
out[i] = out[i] - 'A' + 'a';
}
}
/* Fill label length, move forward */ /* Fill label length, move forward */
*label_length = r; *label_length = r;