Annotation of 43BSDReno/sys/kern/kern_subr.c, revision 1.1.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.