new->refcount = 1;
new->state = -1;
new->dgram = dgram;
+ new->maxbuf = 65536;
numsocks++;
return(new);
}
sk->back->state = state;
}
+struct socket *netsockpipe(void)
+{
+ struct socket *sk;
+
+ sk = sockpair(0);
+ sksetstate(sk, SOCK_EST);
+ return(sk);
+}
+
static void closeufd(struct ufd *ufd)
{
if(ufd->fd != -1)
}
}
+void quitsock(struct socket *sk)
+{
+ sk->readcb = NULL;
+ sk->writecb = NULL;
+ sk->errcb = NULL;
+ putsock(sk);
+}
+
static void linksock(struct scons **list, struct socket *sk)
{
struct scons *sc;
return(ret);
}
-size_t sockqueuesize(struct socket *sk)
+/* size_t sockqueuesize(struct socket *sk) */
+/* { */
+/* return(sockgetdatalen(sk->back)); */
+/* } */
+
+size_t socktqueuesize(struct socket *sk)
+{
+ size_t ret;
+
+ ret = 0;
+ while(1) {
+ ret += sockgetdatalen(sk->back);
+ if((sk = sk->back->pnext) == NULL)
+ return(ret);
+ }
+}
+
+ssize_t sockqueueleft(struct socket *sk)
{
- return(sockgetdatalen(sk->back));
+ return(sk->back->maxbuf - sockgetdatalen(sk->back));
}
/*
for(maxfd = 0, ufd = ufds; ufd != NULL; ufd = ufd->next) {
if(ufd->fd < 0)
continue;
- if(!ufd->ignread)
+ if(!ufd->ignread && ((ufd->sk == NULL) || (sockqueueleft(ufd->sk) > 0)))
FD_SET(ufd->fd, &rfds);
if(ufd->sk != NULL) {
if(sockgetdatalen(ufd->sk) > 0)
return(0);
}
-void sockblock(struct socket *sk, int block)
-{
- struct ufd *ufd;
+/* void sockblock(struct socket *sk, int block) */
+/* { */
+/* struct ufd *ufd; */
- ufd = getskufd(sk);
- ufd->ignread = block;
-}
+/* ufd = getskufd(sk); */
+/* ufd->ignread = block; */
+/* } */
int sockfamily(struct socket *sk)
{