/* computes string to be appended to cstr so that src would be added to * the compression (best case, it's a 2-byte pointer to some offset within * cstr; worst case, it's all of src, converted to rfc3011 format). * The computed string is returned directly; its length is returned via retlen; * NULL and 0, respectively, are returned if an error occurs. */ uint8_t* FAST_FUNC dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) { uint8_t *d, *dname; int off; dname = convert_dname(src); if (dname == NULL) { *retlen = 0; return NULL; } for (d = dname; *d != 0; d += *d + 1) { off = find_offset(cstr, clen, d); if (off >= 0) { /* found a match, add pointer and terminate string */ *d++ = NS_CMPRSFLGS; *d = off; break; } } *retlen = d - dname + 1; return dname; }
/* Computes string to be appended to cstr so that src would be added to * the compression (best case, it's a 2-byte pointer to some offset within * cstr; worst case, it's all of src, converted to <4>host<3>com<0> format). * The computed string is returned directly; its length is returned via retlen; * NULL and 0, respectively, are returned if an error occurs. */ uint8_t* FAST_FUNC dname_enc(const uint8_t *cstr, int clen, const char *src, int *retlen) { uint8_t *d, *dname; int off; dname = convert_dname(src); if (dname == NULL) { *retlen = 0; return NULL; } d = dname; while (*d) { if (cstr) { off = find_offset(cstr, clen, d); if (off >= 0) { /* found a match, add pointer and return */ *d++ = NS_CMPRSFLGS | (off >> 8); *d = off; break; } } d += *d + 1; }