summaryrefslogtreecommitdiff
path: root/src/lib/dev.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/dev.c')
-rw-r--r--src/lib/dev.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 115cd565..d0766783 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -897,6 +897,7 @@ ssize_t flow_read(int fd,
struct timespec * abstime = NULL;
struct flow * flow;
bool noblock;
+ bool partrd;
if (fd < 0 || fd > PROG_MAX_FLOWS)
return -EBADF;
@@ -919,6 +920,7 @@ ssize_t flow_read(int fd,
rb = flow->rx_rb;
noblock = flow->oflags & FLOWFRNOBLOCK;
+ partrd = !(flow->oflags & FLOWFRNOPART);
if (ai.flows[fd].rcv_timesout) {
ts_add(&abs, &flow->rcv_timeo, &abs);
@@ -948,14 +950,20 @@ ssize_t flow_read(int fd,
if (n <= (ssize_t) count) {
memcpy(buf, sdu, n);
shm_rdrbuff_remove(ai.rdrb, idx);
- flow->part_idx = (n == (ssize_t) count) ? DONE_PART : NO_PART;
+ flow->part_idx = (partrd && n == (ssize_t) count) ?
+ DONE_PART : NO_PART;
return n;
} else {
- memcpy(buf, sdu, count);
- sdb = shm_rdrbuff_get(ai.rdrb, idx);
- shm_du_buff_head_release(sdb, n);
- flow->part_idx = idx;
- return count;
+ if (partrd) {
+ memcpy(buf, sdu, count);
+ sdb = shm_rdrbuff_get(ai.rdrb, idx);
+ shm_du_buff_head_release(sdb, n);
+ flow->part_idx = idx;
+ return count;
+ } else {
+ shm_rdrbuff_remove(ai.rdrb, idx);
+ return -EMSGSIZE;
+ }
}
}