pcap: Use clock_gettime() instead of gettimeofday()
POSIX.1-2008 declared gettimeofday() as obsolete, but I'm a dinosaur. Usually, C libraries translate that to the clock_gettime() system call anyway, but this doesn't happen in Jon's environment, and, there, seccomp happily kills pasta(1) when started with --pcap, because we didn't add gettimeofday() to our seccomp profiles. Use clock_gettime() instead. Reported-by: Jon Maloy <jmaloy@redhat.com> Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
0761f29a14
commit
3fe9878db7
2 changed files with 14 additions and 13 deletions
26
pcap.c
26
pcap.c
|
@ -72,17 +72,17 @@ struct pcap_pkthdr {
|
||||||
* @iov: IO vector containing frame (with L2 headers and tap headers)
|
* @iov: IO vector containing frame (with L2 headers and tap headers)
|
||||||
* @iovcnt: Number of buffers (@iov entries) in frame
|
* @iovcnt: Number of buffers (@iov entries) in frame
|
||||||
* @offset: Byte offset of the L2 headers within @iov
|
* @offset: Byte offset of the L2 headers within @iov
|
||||||
* @tv: Timestamp
|
* @now: Timestamp
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -errno on error writing to the file
|
* Returns: 0 on success, -errno on error writing to the file
|
||||||
*/
|
*/
|
||||||
static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
||||||
size_t offset, const struct timeval *tv)
|
size_t offset, const struct timespec *now)
|
||||||
{
|
{
|
||||||
size_t len = iov_size(iov, iovcnt) - offset;
|
size_t len = iov_size(iov, iovcnt) - offset;
|
||||||
struct pcap_pkthdr h = {
|
struct pcap_pkthdr h = {
|
||||||
.tv_sec = tv->tv_sec,
|
.tv_sec = now->tv_sec,
|
||||||
.tv_usec = tv->tv_usec,
|
.tv_usec = DIV_ROUND_CLOSEST(now->tv_nsec, 1000),
|
||||||
.caplen = len,
|
.caplen = len,
|
||||||
.len = len
|
.len = len
|
||||||
};
|
};
|
||||||
|
@ -103,13 +103,13 @@ static void pcap_frame(const struct iovec *iov, size_t iovcnt,
|
||||||
void pcap(const char *pkt, size_t len)
|
void pcap(const char *pkt, size_t len)
|
||||||
{
|
{
|
||||||
struct iovec iov = { (char *)pkt, len };
|
struct iovec iov = { (char *)pkt, len };
|
||||||
struct timeval tv;
|
struct timespec now;
|
||||||
|
|
||||||
if (pcap_fd == -1)
|
if (pcap_fd == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
clock_gettime(CLOCK_REALTIME, &now);
|
||||||
pcap_frame(&iov, 1, 0, &tv);
|
pcap_frame(&iov, 1, 0, &now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -122,16 +122,16 @@ void pcap(const char *pkt, size_t len)
|
||||||
void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
||||||
size_t offset)
|
size_t offset)
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timespec now;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (pcap_fd == -1)
|
if (pcap_fd == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
clock_gettime(CLOCK_REALTIME, &now);
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
pcap_frame(iov + i * frame_parts, frame_parts, offset, &tv);
|
pcap_frame(iov + i * frame_parts, frame_parts, offset, &now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -145,13 +145,13 @@ void pcap_multiple(const struct iovec *iov, size_t frame_parts, unsigned int n,
|
||||||
/* cppcheck-suppress unusedFunction */
|
/* cppcheck-suppress unusedFunction */
|
||||||
void pcap_iov(const struct iovec *iov, size_t iovcnt)
|
void pcap_iov(const struct iovec *iov, size_t iovcnt)
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timespec now;
|
||||||
|
|
||||||
if (pcap_fd == -1)
|
if (pcap_fd == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
clock_gettime(CLOCK_REALTIME, &now);
|
||||||
pcap_frame(iov, iovcnt, 0, &tv);
|
pcap_frame(iov, iovcnt, 0, &now);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
1
util.h
1
util.h
|
@ -40,6 +40,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
|
||||||
|
#define DIV_ROUND_CLOSEST(n, d) (((n) + (d) / 2) / (d))
|
||||||
#define ROUND_DOWN(x, y) ((x) & ~((y) - 1))
|
#define ROUND_DOWN(x, y) ((x) & ~((y) - 1))
|
||||||
#define ROUND_UP(x, y) (((x) + (y) - 1) & ~((y) - 1))
|
#define ROUND_UP(x, y) (((x) + (y) - 1) & ~((y) - 1))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue