Annotation of 43BSDReno/sys/kern/kern_subr.c, revision 1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.