version 1.133, 2008/06/24 11:21:46 |
version 1.134, 2008/08/06 15:01:23 |
Line 887 sys_setsockopt(struct lwp *l, const stru |
|
Line 887 sys_setsockopt(struct lwp *l, const stru |
|
syscallarg(const void *) val; |
syscallarg(const void *) val; |
syscallarg(unsigned int) valsize; |
syscallarg(unsigned int) valsize; |
} */ |
} */ |
struct proc *p; |
struct sockopt sopt; |
struct mbuf *m; |
|
struct socket *so; |
struct socket *so; |
int error; |
int error; |
unsigned int len; |
unsigned int len; |
|
|
p = l->l_proc; |
len = SCARG(uap, valsize); |
m = NULL; |
if (len > 0 && SCARG(uap, val) == NULL) |
|
return (EINVAL); |
|
|
|
if (len > MCLBYTES) |
|
return (EINVAL); |
|
|
if ((error = fd_getsock(SCARG(uap, s), &so)) != 0) |
if ((error = fd_getsock(SCARG(uap, s), &so)) != 0) |
return (error); |
return (error); |
len = SCARG(uap, valsize); |
|
if (len > MCLBYTES) { |
sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), len); |
error = EINVAL; |
|
goto out; |
if (len > 0) { |
} |
error = copyin(SCARG(uap, val), sopt.sopt_data, len); |
if (SCARG(uap, val)) { |
if (error) |
m = getsombuf(so, MT_SOOPTS); |
|
if (len > MLEN) |
|
m_clget(m, M_WAIT); |
|
error = copyin(SCARG(uap, val), mtod(m, void *), len); |
|
if (error) { |
|
(void) m_free(m); |
|
goto out; |
goto out; |
} |
|
m->m_len = SCARG(uap, valsize); |
|
} |
} |
error = sosetopt(so, SCARG(uap, level), SCARG(uap, name), m); |
|
|
error = sosetopt(so, &sopt); |
|
|
out: |
out: |
|
sockopt_destroy(&sopt); |
fd_putfile(SCARG(uap, s)); |
fd_putfile(SCARG(uap, s)); |
return (error); |
return (error); |
} |
} |
Line 930 sys_getsockopt(struct lwp *l, const stru |
|
Line 929 sys_getsockopt(struct lwp *l, const stru |
|
syscallarg(void *) val; |
syscallarg(void *) val; |
syscallarg(unsigned int *) avalsize; |
syscallarg(unsigned int *) avalsize; |
} */ |
} */ |
|
struct sockopt sopt; |
struct socket *so; |
struct socket *so; |
struct mbuf *m; |
unsigned int valsize, len; |
unsigned int op, i, valsize; |
|
int error; |
int error; |
char *val = SCARG(uap, val); |
|
|
|
m = NULL; |
if (SCARG(uap, val) != NULL) { |
|
error = copyin(SCARG(uap, avalsize), &valsize, sizeof(valsize)); |
|
if (error) |
|
return (error); |
|
} else |
|
valsize = 0; |
|
|
if ((error = fd_getsock(SCARG(uap, s), &so)) != 0) |
if ((error = fd_getsock(SCARG(uap, s), &so)) != 0) |
return (error); |
return (error); |
if (val != NULL) { |
|
error = copyin(SCARG(uap, avalsize), |
sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), 0); |
&valsize, sizeof(valsize)); |
|
|
error = sogetopt(so, &sopt); |
|
if (error) |
|
goto out; |
|
|
|
if (valsize > 0) { |
|
len = min(valsize, sopt.sopt_size); |
|
error = copyout(sopt.sopt_data, SCARG(uap, val), len); |
|
if (error) |
|
goto out; |
|
|
|
error = copyout(&len, SCARG(uap, avalsize), sizeof(len)); |
if (error) |
if (error) |
goto out; |
goto out; |
} else |
|
valsize = 0; |
|
error = sogetopt(so, SCARG(uap, level), SCARG(uap, name), &m); |
|
if (error == 0 && val != NULL && valsize && m != NULL) { |
|
op = 0; |
|
while (m && !error && op < valsize) { |
|
i = min(m->m_len, (valsize - op)); |
|
error = copyout(mtod(m, void *), val, i); |
|
op += i; |
|
val += i; |
|
m = m_free(m); |
|
} |
|
valsize = op; |
|
if (error == 0) |
|
error = copyout(&valsize, |
|
SCARG(uap, avalsize), sizeof(valsize)); |
|
} |
} |
if (m != NULL) |
|
(void) m_freem(m); |
|
out: |
out: |
|
sockopt_destroy(&sopt); |
fd_putfile(SCARG(uap, s)); |
fd_putfile(SCARG(uap, s)); |
return (error); |
return (error); |
} |
} |