+void pcap(int fd, FILE *out) {
+ sendline(fd, "%d %d", CONTROL, REQ_PCAP);
+ char data[9018];
+
+ struct {
+ uint32_t magic;
+ uint16_t major;
+ uint16_t minor;
+ uint32_t tz_offset;
+ uint32_t tz_accuracy;
+ uint32_t snaplen;
+ uint32_t ll_type;
+ } header = {
+ 0xa1b2c3d4,
+ 2, 4,
+ 0, 0,
+ sizeof data,
+ 1,
+ };
+
+ struct {
+ uint32_t tv_sec;
+ uint32_t tv_usec;
+ uint32_t len;
+ uint32_t origlen;
+ } packet;
+
+ struct timeval tv;
+
+ fwrite(&header, sizeof header, 1, out);
+ fflush(out);
+
+ char line[32];
+ while(recvline(fd, line, sizeof line)) {
+ int code, req, len;
+ int n = sscanf(line, "%d %d %d", &code, &req, &len);
+ gettimeofday(&tv, NULL);
+ if(n != 3 || code != CONTROL || req != REQ_PCAP || len < 0 || len > sizeof data)
+ break;
+ if(!recvdata(fd, data, len))
+ break;
+ packet.tv_sec = tv.tv_sec;
+ packet.tv_usec = tv.tv_usec;
+ packet.len = len;
+ packet.origlen = len;
+ fwrite(&packet, sizeof packet, 1, out);
+ fwrite(data, len, 1, out);
+ fflush(out);
+ }
+}
+