As a side-note to the larger control flow questions: Why not read() into &drv->buf[drv->buflen] and use it directly with vp_handle_packet(). I don't think we need memcpy or temporary buffers since we already have a buffer in drv.
There are extra buffers and memcpys here which make the code more complex. Stefan