summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_socket.c
diff options
context:
space:
mode:
authorchris <chris@FreeBSD.org>2000-07-02 23:56:45 +0000
committerchris <chris@FreeBSD.org>2000-07-02 23:56:45 +0000
commita51c1232f7c5d3b55c246f3898742c425603e7ab (patch)
tree4029b91e68ad4828ca9e8c203e6f7669e61e4c65 /sys/kern/sys_socket.c
parentfce3810f11701cf8ea94b4f147be464e84b392a9 (diff)
downloadFreeBSD-src-a51c1232f7c5d3b55c246f3898742c425603e7ab.zip
FreeBSD-src-a51c1232f7c5d3b55c246f3898742c425603e7ab.tar.gz
Instead of just blindly setting -rw-rw-rw-:
o Set access mode to -r--r--r-- if SS_CANTRCVMORE is set and the receive buffer is empty. o Set access mode to --w--w--w- is SS_CANTSENDMORE is set. Discussed with: alfred
Diffstat (limited to 'sys/kern/sys_socket.c')
-rw-r--r--sys/kern/sys_socket.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index 06955bb..f58720b 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -164,8 +164,17 @@ soo_stat(fp, ub, p)
struct socket *so = (struct socket *)fp->f_data;
bzero((caddr_t)ub, sizeof (*ub));
- ub->st_mode = S_IFSOCK | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP |
- S_IROTH | S_IWOTH;
+ ub->st_mode = S_IFSOCK;
+ /*
+ * If SS_CANTRCVMORE is set, but there's still data left in the
+ * receive buffer, the socket is still readable.
+ */
+ if ((so->so_state & SS_CANTRCVMORE) == 0 ||
+ so->so_rcv.sb_cc != 0)
+ ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH;
+ if ((so->so_state & SS_CANTSENDMORE) == 0)
+ ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH;
+ ub->st_size = so->so_rcv.sb_cc;
ub->st_uid = so->so_cred->cr_uid;
ub->st_gid = so->so_cred->cr_gid;
return ((*so->so_proto->pr_usrreqs->pru_sense)(so, ub));
OpenPOWER on IntegriCloud