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.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index a3082a7d..77c2d06a 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -561,6 +561,7 @@ int flow_dealloc(int fd)
ai.flows[fd].port_id = -1;
shm_ap_rbuff_close(ai.flows[fd].rb);
ai.flows[fd].rb = NULL;
+ ai.flows[fd].oflags = 0;
ai.flows[fd].api = -1;
if (ai.flows[fd].timeout != NULL) {
free(ai.flows[fd].timeout);
@@ -602,6 +603,10 @@ int flow_cntl(int fd, int cmd, int oflags)
return old;
case FLOW_F_SETFL: /* SET FLOW FLAGS */
ai.flows[fd].oflags = oflags;
+ if (oflags & FLOW_O_WRONLY)
+ shm_ap_rbuff_close_port(ai.rb, ai.flows[fd].port_id);
+ if (oflags & FLOW_O_RDWR)
+ shm_ap_rbuff_open_port(ai.rb, ai.flows[fd].port_id);
pthread_rwlock_unlock(&ai.flows_lock);
pthread_rwlock_unlock(&ai.data_lock);
return old;
@@ -632,6 +637,12 @@ ssize_t flow_write(int fd, void * buf, size_t count)
return -ENOTALLOC;
}
+ if (ai.flows[fd].oflags & FLOW_O_RDONLY) {
+ pthread_rwlock_unlock(&ai.flows_lock);
+ pthread_rwlock_unlock(&ai.data_lock);
+ return -EPERM;
+ }
+
if (ai.flows[fd].oflags & FLOW_O_NONBLOCK) {
idx = shm_rdrbuff_write(ai.rdrb,
ai.flows[fd].api,
@@ -1078,6 +1089,12 @@ int ipcp_flow_write(int fd, struct shm_du_buff * sdb)
pthread_rwlock_rdlock(&ai.data_lock);
pthread_rwlock_rdlock(&ai.flows_lock);
+ if (ai.flows[fd].oflags & FLOW_O_RDONLY) {
+ pthread_rwlock_unlock(&ai.flows_lock);
+ pthread_rwlock_unlock(&ai.data_lock);
+ return -EPERM;
+ }
+
if (ai.flows[fd].rb == NULL) {
pthread_rwlock_unlock(&ai.flows_lock);
pthread_rwlock_unlock(&ai.data_lock);