Module Name:    src
Committed By:   rjs
Date:           Tue Jul 31 13:00:14 UTC 2018

Modified Files:
        src/sys/kern: syscalls.master uipc_syscalls.c

Log Message:
Add getsockopt2() syscall.


To generate a diff of this commit:
cvs rdiff -u -r1.292 -r1.293 src/sys/kern/syscalls.master
cvs rdiff -u -r1.194 -r1.195 src/sys/kern/uipc_syscalls.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/syscalls.master
diff -u src/sys/kern/syscalls.master:1.292 src/sys/kern/syscalls.master:1.293
--- src/sys/kern/syscalls.master:1.292	Thu Jul 12 10:46:48 2018
+++ src/sys/kern/syscalls.master	Tue Jul 31 13:00:13 2018
@@ -1,4 +1,4 @@
-	$NetBSD: syscalls.master,v 1.292 2018/07/12 10:46:48 maxv Exp $
+	$NetBSD: syscalls.master,v 1.293 2018/07/31 13:00:13 rjs Exp $
 
 ;	@(#)syscalls.master	8.2 (Berkeley) 1/13/94
 
@@ -411,7 +411,8 @@
 			    struct stat12 *ub); } lstat12
 191	STD 	RUMP	{ long|sys||pathconf(const char *path, int name); }
 192	STD 	RUMP	{ long|sys||fpathconf(int fd, int name); }
-193	UNIMPL
+193	STD	RUMP	{ int|sys||getsockopt2(int s, int level, int name, \
+			    void *val, socklen_t *avalsize); }
 194	STD 	RUMP	{ int|sys||getrlimit(int which, \
 			    struct rlimit *rlp); }
 195	STD 	RUMP	{ int|sys||setrlimit(int which, \

Index: src/sys/kern/uipc_syscalls.c
diff -u src/sys/kern/uipc_syscalls.c:1.194 src/sys/kern/uipc_syscalls.c:1.195
--- src/sys/kern/uipc_syscalls.c:1.194	Fri May  4 08:47:55 2018
+++ src/sys/kern/uipc_syscalls.c	Tue Jul 31 13:00:13 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_syscalls.c,v 1.194 2018/05/04 08:47:55 christos Exp $	*/
+/*	$NetBSD: uipc_syscalls.c,v 1.195 2018/07/31 13:00:13 rjs Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.194 2018/05/04 08:47:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.195 2018/07/31 13:00:13 rjs Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_pipe.h"
@@ -1192,17 +1192,10 @@ sys_setsockopt(struct lwp *l, const stru
 	return error;
 }
 
-int
-sys_getsockopt(struct lwp *l, const struct sys_getsockopt_args *uap,
-    register_t *retval)
+static int
+getsockopt(struct lwp *l, const struct sys_getsockopt_args *uap,
+    register_t *retval, bool copyarg)
 {
-	/* {
-		syscallarg(int)			s;
-		syscallarg(int)			level;
-		syscallarg(int)			name;
-		syscallarg(void *)		val;
-		syscallarg(unsigned int *)	avalsize;
-	} */
 	struct sockopt	sopt;
 	struct socket	*so;
 	file_t		*fp;
@@ -1216,39 +1209,68 @@ sys_getsockopt(struct lwp *l, const stru
 	} else
 		valsize = 0;
 
-	if ((error = fd_getsock1(SCARG(uap, s), &so, &fp)) != 0)
-		return (error);
-
 	if (valsize > MCLBYTES)
 		return EINVAL;
 
+	if ((error = fd_getsock1(SCARG(uap, s), &so, &fp)) != 0)
+		return error;
+
 	sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), valsize);
+	if (copyarg && valsize > 0) {
+		error = copyin(SCARG(uap, val), sopt.sopt_data, valsize);
+		if (error)
+			goto out;
+	}
 
 	if (fp->f_flag & FNOSIGPIPE)
 		so->so_options |= SO_NOSIGPIPE;
 	else
 		so->so_options &= ~SO_NOSIGPIPE;
+
 	error = sogetopt(so, &sopt);
-	if (error)
+	if (error || valsize == 0)
 		goto out;
 
-	if (valsize > 0) {
-		len = min(valsize, sopt.sopt_retsize);
-		error = copyout(sopt.sopt_data, SCARG(uap, val), len);
-		if (error)
-			goto out;
-
-		error = copyout(&len, SCARG(uap, avalsize), sizeof(len));
-		if (error)
-			goto out;
-	}
+	len = min(valsize, sopt.sopt_retsize);
+	error = copyout(sopt.sopt_data, SCARG(uap, val), len);
+	if (error)
+		goto out;
 
+	error = copyout(&len, SCARG(uap, avalsize), sizeof(len));
  out:
 	sockopt_destroy(&sopt);
 	fd_putfile(SCARG(uap, s));
 	return error;
 }
 
+int
+sys_getsockopt(struct lwp *l, const struct sys_getsockopt_args *uap,
+    register_t *retval)
+{
+	/* {
+		syscallarg(int)			s;
+		syscallarg(int)			level;
+		syscallarg(int)			name;
+		syscallarg(void *)		val;
+		syscallarg(unsigned int *)	avalsize;
+	} */
+	return getsockopt(l, uap, retval, false);
+}
+
+int
+sys_getsockopt2(struct lwp *l, const struct sys_getsockopt2_args *uap,
+    register_t *retval)
+{
+	/* {
+		syscallarg(int)			s;
+		syscallarg(int)			level;
+		syscallarg(int)			name;
+		syscallarg(void *)		val;
+		syscallarg(unsigned int *)	avalsize;
+	} */
+	return getsockopt(l, (const struct sys_getsockopt_args *) uap, retval, true);
+}
+
 #ifdef PIPE_SOCKETPAIR
 
 int

Reply via email to