1*12792Ssam /* kern_subr.c 4.1 83/05/27 */ 2*12792Ssam 3*12792Ssam #include "../h/param.h" 4*12792Ssam #include "../h/systm.h" 5*12792Ssam #include "../h/dir.h" 6*12792Ssam #include "../h/user.h" 7*12792Ssam #include "../h/uio.h" 8*12792Ssam 9*12792Ssam uiomove(cp, n, rw, uio) 10*12792Ssam register caddr_t cp; 11*12792Ssam register int n; 12*12792Ssam enum uio_rw rw; 13*12792Ssam register struct uio *uio; 14*12792Ssam { 15*12792Ssam register struct iovec *iov; 16*12792Ssam u_int cnt; 17*12792Ssam int error = 0; 18*12792Ssam 19*12792Ssam while (n > 0 && uio->uio_resid) { 20*12792Ssam iov = uio->uio_iov; 21*12792Ssam cnt = iov->iov_len; 22*12792Ssam if (cnt == 0) { 23*12792Ssam uio->uio_iov++; 24*12792Ssam uio->uio_iovcnt--; 25*12792Ssam continue; 26*12792Ssam } 27*12792Ssam if (cnt > n) 28*12792Ssam cnt = n; 29*12792Ssam switch (uio->uio_segflg) { 30*12792Ssam 31*12792Ssam case 0: 32*12792Ssam case 2: 33*12792Ssam if (rw == UIO_READ) 34*12792Ssam error = copyout(cp, iov->iov_base, cnt); 35*12792Ssam else 36*12792Ssam error = copyin(iov->iov_base, cp, cnt); 37*12792Ssam if (error) 38*12792Ssam return (error); 39*12792Ssam break; 40*12792Ssam 41*12792Ssam case 1: 42*12792Ssam if (rw == UIO_READ) 43*12792Ssam bcopy((caddr_t)cp, iov->iov_base, cnt); 44*12792Ssam else 45*12792Ssam bcopy(iov->iov_base, (caddr_t)cp, cnt); 46*12792Ssam break; 47*12792Ssam } 48*12792Ssam iov->iov_base += cnt; 49*12792Ssam iov->iov_len -= cnt; 50*12792Ssam uio->uio_resid -= cnt; 51*12792Ssam uio->uio_offset += cnt; 52*12792Ssam cp += cnt; 53*12792Ssam n -= cnt; 54*12792Ssam } 55*12792Ssam return (error); 56*12792Ssam } 57*12792Ssam 58*12792Ssam /* 59*12792Ssam * Give next character to user as result of read. 60*12792Ssam */ 61*12792Ssam ureadc(c, uio) 62*12792Ssam register int c; 63*12792Ssam register struct uio *uio; 64*12792Ssam { 65*12792Ssam register struct iovec *iov; 66*12792Ssam 67*12792Ssam again: 68*12792Ssam if (uio->uio_iovcnt == 0) 69*12792Ssam panic("ureadc"); 70*12792Ssam iov = uio->uio_iov; 71*12792Ssam if (iov->iov_len <= 0 || uio->uio_resid <= 0) { 72*12792Ssam uio->uio_iovcnt--; 73*12792Ssam uio->uio_iov++; 74*12792Ssam goto again; 75*12792Ssam } 76*12792Ssam switch (uio->uio_segflg) { 77*12792Ssam 78*12792Ssam case 0: 79*12792Ssam if (subyte(iov->iov_base, c) < 0) 80*12792Ssam return (EFAULT); 81*12792Ssam break; 82*12792Ssam 83*12792Ssam case 1: 84*12792Ssam *iov->iov_base = c; 85*12792Ssam break; 86*12792Ssam 87*12792Ssam case 2: 88*12792Ssam if (suibyte(iov->iov_base, c) < 0) 89*12792Ssam return (EFAULT); 90*12792Ssam break; 91*12792Ssam } 92*12792Ssam iov->iov_base++; 93*12792Ssam iov->iov_len--; 94*12792Ssam uio->uio_resid--; 95*12792Ssam uio->uio_offset++; 96*12792Ssam return (0); 97*12792Ssam } 98*12792Ssam 99*12792Ssam #ifdef notdef 100*12792Ssam /* 101*12792Ssam * Get next character written in by user from uio. 102*12792Ssam */ 103*12792Ssam uwritec(uio) 104*12792Ssam struct uio *uio; 105*12792Ssam { 106*12792Ssam register struct iovec *iov; 107*12792Ssam register int c; 108*12792Ssam 109*12792Ssam again: 110*12792Ssam if (uio->uio_iovcnt <= 0 || uio->uio_resid <= 0) 111*12792Ssam panic("uwritec"); 112*12792Ssam iov = uio->uio_iov; 113*12792Ssam if (iov->iov_len == 0) { 114*12792Ssam uio->uio_iovcnt--; 115*12792Ssam uio->uio_iov++; 116*12792Ssam goto again; 117*12792Ssam } 118*12792Ssam switch (uio->uio_segflg) { 119*12792Ssam 120*12792Ssam case 0: 121*12792Ssam c = fubyte(iov->iov_base); 122*12792Ssam break; 123*12792Ssam 124*12792Ssam case 1: 125*12792Ssam c = *iov->iov_base & 0377; 126*12792Ssam break; 127*12792Ssam 128*12792Ssam case 2: 129*12792Ssam c = fuibyte(iov->iov_base); 130*12792Ssam break; 131*12792Ssam } 132*12792Ssam if (c < 0) 133*12792Ssam return (-1); 134*12792Ssam iov->iov_base++; 135*12792Ssam iov->iov_len--; 136*12792Ssam uio->uio_resid--; 137*12792Ssam uio->uio_offset++; 138*12792Ssam return (c & 0377); 139*12792Ssam } 140*12792Ssam #endif 141