diff options
author | phk <phk@FreeBSD.org> | 1996-02-24 13:38:28 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 1996-02-24 13:38:28 +0000 |
commit | 45a7f29691072258573e111c1034432e37e944f2 (patch) | |
tree | c2e95be8f2e89f3c4a7e2f1ecd65471c55e01cb8 /sys/kern/uipc_syscalls.c | |
parent | 4bcbc91c0c769ab35c42d986c2ec4a6f6cc51b8d (diff) | |
download | FreeBSD-src-45a7f29691072258573e111c1034432e37e944f2.zip FreeBSD-src-45a7f29691072258573e111c1034432e37e944f2.tar.gz |
Make getsockopt() capable of handling more than one mbuf worth of data.
Use this to read rules out of ipfw.
Add the lkm code to ipfw.c
Diffstat (limited to 'sys/kern/uipc_syscalls.c')
-rw-r--r-- | sys/kern/uipc_syscalls.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index f994a40..ac92bf2 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 - * $Id: uipc_syscalls.c,v 1.13 1996/01/28 23:41:40 dyson Exp $ + * $Id: uipc_syscalls.c,v 1.14 1996/02/13 18:16:21 wollman Exp $ */ #include "opt_ktrace.h" @@ -991,8 +991,8 @@ getsockopt(p, uap, retval) int *retval; { struct file *fp; - struct mbuf *m = NULL; - int valsize, error; + struct mbuf *m = NULL, *m0; + int op, i, valsize, error; error = getsock(p->p_fd, uap->s, &fp); if (error) @@ -1006,9 +1006,16 @@ getsockopt(p, uap, retval) valsize = 0; if ((error = sogetopt((struct socket *)fp->f_data, uap->level, uap->name, &m)) == 0 && uap->val && valsize && m != NULL) { - if (valsize > m->m_len) - valsize = m->m_len; - error = copyout(mtod(m, caddr_t), uap->val, (u_int)valsize); + op = 0; + while (m && !error && op < valsize) { + i = min(m->m_len, (valsize - op)); + error = copyout(mtod(m, caddr_t), uap->val, (u_int)i); + op += i; + uap->val += i; + m0 = m; + MFREE(m0,m); + } + valsize = op; if (error == 0) error = copyout((caddr_t)&valsize, (caddr_t)uap->avalsize, sizeof (valsize)); |