Code:
int decodehostname(string &buf, string &packet, unsigned int len, unsigned int pos) {
unsigned int label;
int bufpos = 0, r = 0;
while(pos < len) {
label = packet[pos++];
if (label & 0xC0) {
if (pos >= len) return 0;
label = ((label & 0x3F) << 8) | packet[pos++];
if (r == 0) r = pos;
pos = label;
continue;
}
//printf(" bufpos: %d pos: %d label: %d\n len: %d\n", bufpos, pos, label, len);
if (label == 0)
break;
//check
if (bufpos + label + 1 >= 128) return 0;
if (pos + label > len) return 0;
string part = packet.substr(pos, label);
buf.replace(bufpos, part.length() ,part );
pos += label;
bufpos += label;
buf[bufpos++] = '.';
}
if (bufpos) bufpos--;
buf[bufpos] = 0;
return (r ? r : pos);
}