Deleted Added
full compact
uipc_syscalls.c (36847) uipc_syscalls.c (38482)
1/*
2 * Copyright (c) 1982, 1986, 1989, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94
1/*
2 * Copyright (c) 1982, 1986, 1989, 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 17 unchanged lines hidden (view full) ---

26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94
34 * $Id: uipc_syscalls.c,v 1.39 1998/04/14 06:24:43 phk Exp $
34 * $Id: uipc_syscalls.c,v 1.40 1998/06/10 10:30:23 dfr Exp $
35 */
36
37#include "opt_compat.h"
38#include "opt_ktrace.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/sysproto.h>

--- 933 unchanged lines hidden (view full) ---

976 int s;
977 int level;
978 int name;
979 caddr_t val;
980 int valsize;
981 } */ *uap;
982{
983 struct file *fp;
35 */
36
37#include "opt_compat.h"
38#include "opt_ktrace.h"
39
40#include <sys/param.h>
41#include <sys/systm.h>
42#include <sys/sysproto.h>

--- 933 unchanged lines hidden (view full) ---

976 int s;
977 int level;
978 int name;
979 caddr_t val;
980 int valsize;
981 } */ *uap;
982{
983 struct file *fp;
984 struct mbuf *m = NULL;
984 struct sockopt sopt;
985 int error;
986
985 int error;
986
987 if (uap->val == 0 && uap->valsize != 0)
988 return (EFAULT);
989 if (uap->valsize < 0)
990 return (EINVAL);
991
987 error = getsock(p->p_fd, uap->s, &fp);
988 if (error)
989 return (error);
992 error = getsock(p->p_fd, uap->s, &fp);
993 if (error)
994 return (error);
990 if (uap->valsize > MCLBYTES)
991 return (EINVAL);
992 if (uap->val) {
993 m = m_get(M_WAIT, MT_SOOPTS);
994 if (m == NULL)
995 return (ENOBUFS);
996 if (uap->valsize > MLEN) {
997 MCLGET(m, M_WAIT);
998 if(!(m->m_flags & M_EXT)) {
999 m_free(m);
1000 return (ENOBUFS);
1001 }
1002 }
1003 error = copyin(uap->val, mtod(m, caddr_t), (u_int)uap->valsize);
1004 if (error) {
1005 (void) m_free(m);
1006 return (error);
1007 }
1008 m->m_len = uap->valsize;
1009 }
1010 return (sosetopt((struct socket *)fp->f_data, uap->level,
1011 uap->name, m, p));
995
996 sopt.sopt_dir = SOPT_SET;
997 sopt.sopt_level = uap->level;
998 sopt.sopt_name = uap->name;
999 sopt.sopt_val = uap->val;
1000 sopt.sopt_valsize = uap->valsize;
1001 sopt.sopt_p = p;
1002
1003 return (sosetopt((struct socket *)fp->f_data, &sopt));
1012}
1013
1014/* ARGSUSED */
1015int
1016getsockopt(p, uap)
1017 struct proc *p;
1018 register struct getsockopt_args /* {
1019 int s;
1020 int level;
1021 int name;
1022 caddr_t val;
1023 int *avalsize;
1024 } */ *uap;
1025{
1004}
1005
1006/* ARGSUSED */
1007int
1008getsockopt(p, uap)
1009 struct proc *p;
1010 register struct getsockopt_args /* {
1011 int s;
1012 int level;
1013 int name;
1014 caddr_t val;
1015 int *avalsize;
1016 } */ *uap;
1017{
1026 struct file *fp;
1027 struct mbuf *m = NULL, *m0;
1028 int op, i, valsize, error;
1018 int valsize, error;
1019 struct file *fp;
1020 struct sockopt sopt;
1029
1030 error = getsock(p->p_fd, uap->s, &fp);
1031 if (error)
1032 return (error);
1033 if (uap->val) {
1034 error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize,
1035 sizeof (valsize));
1036 if (error)
1037 return (error);
1021
1022 error = getsock(p->p_fd, uap->s, &fp);
1023 if (error)
1024 return (error);
1025 if (uap->val) {
1026 error = copyin((caddr_t)uap->avalsize, (caddr_t)&valsize,
1027 sizeof (valsize));
1028 if (error)
1029 return (error);
1030 if (valsize < 0)
1031 return (EINVAL);
1038 } else
1039 valsize = 0;
1032 } else
1033 valsize = 0;
1040 if ((error = sogetopt((struct socket *)fp->f_data, uap->level,
1041 uap->name, &m, p)) == 0 && uap->val && valsize && m != NULL) {
1042 op = 0;
1043 while (m && !error && op < valsize) {
1044 i = min(m->m_len, (valsize - op));
1045 error = copyout(mtod(m, caddr_t), uap->val, (u_int)i);
1046 op += i;
1047 uap->val += i;
1048 m0 = m;
1049 MFREE(m0,m);
1050 }
1051 valsize = op;
1052 if (error == 0)
1053 error = copyout((caddr_t)&valsize,
1054 (caddr_t)uap->avalsize, sizeof (valsize));
1034
1035 sopt.sopt_dir = SOPT_GET;
1036 sopt.sopt_level = uap->level;
1037 sopt.sopt_name = uap->name;
1038 sopt.sopt_val = uap->val;
1039 sopt.sopt_valsize = (size_t)valsize; /* checked non-negative above */
1040 sopt.sopt_p = p;
1041
1042 error = sogetopt((struct socket *)fp->f_data, &sopt);
1043 if (error == 0) {
1044 valsize = sopt.sopt_valsize;
1045 error = copyout((caddr_t)&valsize,
1046 (caddr_t)uap->avalsize, sizeof (valsize));
1055 }
1047 }
1056 if (m != NULL)
1057 (void) m_free(m);
1058 return (error);
1059}
1060
1061/*
1062 * Get socket name.
1063 */
1064/* ARGSUSED */
1065static int

--- 221 unchanged lines hidden ---
1048 return (error);
1049}
1050
1051/*
1052 * Get socket name.
1053 */
1054/* ARGSUSED */
1055static int

--- 221 unchanged lines hidden ---