- 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;
+ int nd;
+ long *in;
+ long *ou;
+ long *ex;
+ struct timeval *tv;
+ } *uap = (struct uap *)u.u_ap;
+ int ibits[3], obits[3];
+ struct timeval atv;
+ int s, ncoll;
+ label_t lqsave;
+
+ obits[0] = obits[1] = obits[2] = 0;
+ if (uap->nd > NOFILE)
+ uap->nd = NOFILE; /* forgiving, if slightly wrong */
+
+#define getbits(name, x) \
+ if (uap->name) { \
+ u.u_error = copyin((caddr_t)uap->name, (caddr_t)&ibits[x], \
+ sizeof (ibits[x])); \
+ if (u.u_error) \
+ goto done; \
+ } else \
+ ibits[x] = 0;
+ getbits(in, 0);
+ getbits(ou, 1);
+ getbits(ex, 2);
+#undef getbits
+
+ if (uap->tv) {
+ u.u_error = copyin((caddr_t)uap->tv, (caddr_t)&atv,
+ sizeof (atv));
+ if (u.u_error)
+ goto done;
+ if (itimerfix(&atv)) {
+ u.u_error = EINVAL;
+ goto done;
+ }
+ s = spl7(); timevaladd(&atv, &time); splx(s);