int dnstcppkt::input (int fd) { compact (); u_int sz = pktsize (); if (sz > inbufsize) { inbufsize = sz; inbuf = static_cast<u_char *> (xrealloc (inbuf, inbufsize)); } if (inbufpos < sz) { int n = read (fd, inbuf + inbufpos, inbufsize - inbufpos); if (n > 0) inbufpos += n; else if (!n || errno != EAGAIN) return -1; } return inbufpos >= pktsize (); }
bool dnstcppkt::getpkt (u_char **pp, size_t *sp) { u_int sz = pktsize (); if (sz > inbufpos - inbufused) return false; *pp = inbuf + inbufused + 2; *sp = sz - 2; inbufused += sz; return true; }