- register struct uap {
- int nfd;
- fd_set *rp, *wp;
- int timo;
- } *ap = (struct uap *)u.u_ap;
- fd_set rd, wr;
- int nfds = 0, readable = 0, writeable = 0;
- time_t t = time;
- int s, tsel, ncoll, rem;
-
- if (ap->nfd > NOFILE)
- ap->nfd = NOFILE;
- if (ap->nfd < 0) {
- u.u_error = EBADF;
- return;
- }
- if (ap->rp && copyin((caddr_t)ap->rp,(caddr_t)&rd,sizeof(fd_set)))
- return;
- if (ap->wp && copyin((caddr_t)ap->wp,(caddr_t)&wr,sizeof(fd_set)))
- return;
-retry:
- ncoll = nselcoll;
- u.u_procp->p_flag |= SSEL;
- if (ap->rp)
- readable = selscan(ap->nfd, rd, &nfds, FREAD);
- if (ap->wp)
- writeable = selscan(ap->nfd, wr, &nfds, FWRITE);
- if (u.u_error)
- goto done;
- if (readable || writeable)
- goto done;
- rem = (ap->timo+999)/1000 - (time - t);
- if (ap->timo == 0 || rem <= 0)
- goto done;
- s = spl6();
- if ((u.u_procp->p_flag & SSEL) == 0 || nselcoll != ncoll) {
- u.u_procp->p_flag &= ~SSEL;
- splx(s);
- goto retry;
- }
- u.u_procp->p_flag &= ~SSEL;
- tsel = tsleep((caddr_t)&selwait, PZERO+1, rem);
- splx(s);
- switch (tsel) {