summaryrefslogtreecommitdiff
path: root/libpipe/stream.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-04-27 15:32:39 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2012-04-27 15:32:39 +0200
commit980e2112cf7a987df40b3157a417ad0e3a831476 (patch)
treee447c8095073e225102360ccbfce8a42eda83f4d /libpipe/stream.c
parent69bd9b1d600debf7b758cc7f8353b747430259b4 (diff)
Add MSG_PEEK support to pflocal
* libpipe/pq.h (packet_peek): Declare new function. * libpipe/pq.c (packet_read): Move code to new `packet_fetch' function, call it with `remove' set to 1. (packet_fetch): New function with code from `packet_read', but do not remove data if `remove' is 0. (packet_peek): New function, calls `packet_fetch' with `remove' set to 0. * libpipe/dgram.c (dgram_read): When MSG_PEEK is in *flags, do not dequeue and only peek data. * libpipe/seqpack.c (seqpack_read): Likewise. * libpipe/stream.c (stream_read): Likewise. * pflocal/socket.c (S_socket_recv): Pass MSG_PEEK flag to libpipe.
Diffstat (limited to 'libpipe/stream.c')
-rw-r--r--libpipe/stream.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/libpipe/stream.c b/libpipe/stream.c
index 8eb90435..671907e7 100644
--- a/libpipe/stream.c
+++ b/libpipe/stream.c
@@ -56,8 +56,17 @@ static error_t
stream_read (struct packet *packet, int *dequeue, unsigned *flags,
char **data, size_t *data_len, size_t amount)
{
- error_t err = packet_read (packet, data, data_len, amount);
- *dequeue = (packet_readable (packet) == 0);
+ error_t err;
+ if (flags && *flags & MSG_PEEK)
+ {
+ err = packet_peek (packet, data, data_len, amount);
+ *dequeue = 0;
+ }
+ else
+ {
+ err = packet_read (packet, data, data_len, amount);
+ *dequeue = (packet_readable (packet) == 0);
+ }
return err;
}