2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009 - 2013 Daniel Borkmann.
5 * Subject to the GPL, version 2.
21 static ssize_t
pcap_rw_write(int fd
, pcap_pkthdr_t
*phdr
, enum pcap_type type
,
22 const uint8_t *packet
, size_t len
)
24 ssize_t ret
, hdrsize
= pcap_get_hdr_length(phdr
, type
), hdrlen
= 0;
26 ret
= write_or_die(fd
, &phdr
->raw
, hdrsize
);
27 if (unlikely(ret
!= hdrsize
))
28 panic("Failed to write pkt header!\n");
30 hdrlen
= pcap_get_length(phdr
, type
);
31 if (unlikely(hdrlen
!= len
))
34 ret
= write_or_die(fd
, packet
, hdrlen
);
35 if (unlikely(ret
!= hdrlen
))
36 panic("Failed to write pkt payload!\n");
38 return hdrsize
+ hdrlen
;
41 static ssize_t
pcap_rw_read(int fd
, pcap_pkthdr_t
*phdr
, enum pcap_type type
,
42 uint8_t *packet
, size_t len
)
44 ssize_t ret
, hdrsize
= pcap_get_hdr_length(phdr
, type
), hdrlen
= 0;
46 ret
= read_or_die(fd
, &phdr
->raw
, hdrsize
);
47 if (unlikely(ret
!= hdrsize
))
50 hdrlen
= pcap_get_length(phdr
, type
);
51 if (unlikely(hdrlen
== 0 || hdrlen
> len
))
54 ret
= read(fd
, packet
, hdrlen
);
55 if (unlikely(ret
!= hdrlen
))
58 return hdrsize
+ hdrlen
;
61 static int pcap_rw_prepare_access(int fd
, enum pcap_mode mode
, bool jumbo
)
68 static void pcap_rw_fsync(int fd
)
73 const struct pcap_file_ops pcap_rw_ops
= {
74 .pull_fhdr_pcap
= pcap_generic_pull_fhdr
,
75 .push_fhdr_pcap
= pcap_generic_push_fhdr
,
76 .prepare_access_pcap
= pcap_rw_prepare_access
,
77 .read_pcap
= pcap_rw_read
,
78 .write_pcap
= pcap_rw_write
,
79 .fsync_pcap
= pcap_rw_fsync
,