summaryrefslogtreecommitdiffstats
path: root/sys/kern/uipc_syscalls.c
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>1996-02-24 13:38:28 +0000
committerphk <phk@FreeBSD.org>1996-02-24 13:38:28 +0000
commit45a7f29691072258573e111c1034432e37e944f2 (patch)
treec2e95be8f2e89f3c4a7e2f1ecd65471c55e01cb8 /sys/kern/uipc_syscalls.c
parent4bcbc91c0c769ab35c42d986c2ec4a6f6cc51b8d (diff)
downloadFreeBSD-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.c19
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));
OpenPOWER on IntegriCloud