|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1982, 1986 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: * ! 6: * @(#)kern_subr.c 7.3 (Berkeley) 4/5/90 ! 7: */ ! 8: ! 9: #include "param.h" ! 10: #include "systm.h" ! 11: #include "user.h" ! 12: ! 13: uiomove(cp, n, uio) ! 14: register caddr_t cp; ! 15: register int n; ! 16: register struct uio *uio; ! 17: { ! 18: register struct iovec *iov; ! 19: u_int cnt; ! 20: int error = 0; ! 21: ! 22: if (uio->uio_rw != UIO_READ && uio->uio_rw != UIO_WRITE) ! 23: panic("uiomove: mode"); ! 24: while (n > 0 && uio->uio_resid) { ! 25: iov = uio->uio_iov; ! 26: cnt = iov->iov_len; ! 27: if (cnt == 0) { ! 28: uio->uio_iov++; ! 29: uio->uio_iovcnt--; ! 30: continue; ! 31: } ! 32: if (cnt > n) ! 33: cnt = n; ! 34: switch (uio->uio_segflg) { ! 35: ! 36: case UIO_USERSPACE: ! 37: case UIO_USERISPACE: ! 38: if (uio->uio_rw == UIO_READ) ! 39: error = copyout(cp, iov->iov_base, cnt); ! 40: else ! 41: error = copyin(iov->iov_base, cp, cnt); ! 42: if (error) ! 43: return (error); ! 44: break; ! 45: ! 46: case UIO_SYSSPACE: ! 47: if (uio->uio_rw == UIO_READ) ! 48: bcopy((caddr_t)cp, iov->iov_base, cnt); ! 49: else ! 50: bcopy(iov->iov_base, (caddr_t)cp, cnt); ! 51: break; ! 52: } ! 53: iov->iov_base += cnt; ! 54: iov->iov_len -= cnt; ! 55: uio->uio_resid -= cnt; ! 56: uio->uio_offset += cnt; ! 57: cp += cnt; ! 58: n -= cnt; ! 59: } ! 60: return (error); ! 61: } ! 62: ! 63: /* ! 64: * Give next character to user as result of read. ! 65: */ ! 66: ureadc(c, uio) ! 67: register int c; ! 68: register struct uio *uio; ! 69: { ! 70: register struct iovec *iov; ! 71: ! 72: again: ! 73: if (uio->uio_iovcnt == 0) ! 74: panic("ureadc"); ! 75: iov = uio->uio_iov; ! 76: if (iov->iov_len <= 0 || uio->uio_resid <= 0) { ! 77: uio->uio_iovcnt--; ! 78: uio->uio_iov++; ! 79: goto again; ! 80: } ! 81: switch (uio->uio_segflg) { ! 82: ! 83: case UIO_USERSPACE: ! 84: if (subyte(iov->iov_base, c) < 0) ! 85: return (EFAULT); ! 86: break; ! 87: ! 88: case UIO_SYSSPACE: ! 89: *iov->iov_base = c; ! 90: break; ! 91: ! 92: case UIO_USERISPACE: ! 93: if (suibyte(iov->iov_base, c) < 0) ! 94: return (EFAULT); ! 95: break; ! 96: } ! 97: iov->iov_base++; ! 98: iov->iov_len--; ! 99: uio->uio_resid--; ! 100: uio->uio_offset++; ! 101: return (0); ! 102: } ! 103: ! 104: strcat(src, append) ! 105: register char *src, *append; ! 106: { ! 107: ! 108: for (; *src; ++src) ! 109: /* void */; ! 110: while (*src++ = *append++) ! 111: /* void */; ! 112: } ! 113: ! 114: strcpy(to, from) ! 115: register char *to, *from; ! 116: { ! 117: ! 118: for (; *from = *to; ++from, ++to) ! 119: /* void */; ! 120: } ! 121: ! 122: strncpy(to, from, cnt) ! 123: register char *to, *from; ! 124: register int cnt; ! 125: { ! 126: ! 127: for (; cnt && (*to = *from); --cnt, ++from, ++to) ! 128: /* void */; ! 129: *to = '\0'; ! 130: } ! 131: ! 132: #ifdef notdef /* unused */ ! 133: /* ! 134: * Get next character written in by user from uio. ! 135: */ ! 136: uwritec(uio) ! 137: struct uio *uio; ! 138: { ! 139: register struct iovec *iov; ! 140: register int c; ! 141: ! 142: if (uio->uio_resid <= 0) ! 143: return (-1); ! 144: again: ! 145: if (uio->uio_iovcnt <= 0) ! 146: panic("uwritec"); ! 147: iov = uio->uio_iov; ! 148: if (iov->iov_len == 0) { ! 149: uio->uio_iov++; ! 150: if (--uio->uio_iovcnt == 0) ! 151: return (-1); ! 152: goto again; ! 153: } ! 154: switch (uio->uio_segflg) { ! 155: ! 156: case UIO_USERSPACE: ! 157: c = fubyte(iov->iov_base); ! 158: break; ! 159: ! 160: case UIO_SYSSPACE: ! 161: c = *iov->iov_base & 0377; ! 162: break; ! 163: ! 164: case UIO_USERISPACE: ! 165: c = fuibyte(iov->iov_base); ! 166: break; ! 167: } ! 168: if (c < 0) ! 169: return (-1); ! 170: iov->iov_base++; ! 171: iov->iov_len--; ! 172: uio->uio_resid--; ! 173: uio->uio_offset++; ! 174: return (c & 0377); ! 175: } ! 176: #endif /* notdef */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.