Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 1 Jun 2009 20:44:58 +0000 (UTC)
From:      Dmitry Chagin <dchagin@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r193263 - head/sys/compat/linux
Message-ID:  <200906012044.n51Kiwxd091373@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dchagin
Date: Mon Jun  1 20:44:58 2009
New Revision: 193263
URL: http://svn.freebsd.org/changeset/base/193263

Log:
  Implement a variation of the accept_common() which takes
  a flags argument.
  
  Do not preserve td_retval before kern_fcntl(F_SETFL) as it does not
  changed.
  
  Approved by:	kib (mentor)
  MFC after:	1 month

Modified:
  head/sys/compat/linux/linux_socket.c

Modified: head/sys/compat/linux/linux_socket.c
==============================================================================
--- head/sys/compat/linux/linux_socket.c	Mon Jun  1 20:42:27 2009	(r193262)
+++ head/sys/compat/linux/linux_socket.c	Mon Jun  1 20:44:58 2009	(r193263)
@@ -772,7 +772,10 @@ linux_accept_common(struct thread *td, i
 		struct sockaddr * __restrict name;
 		socklen_t * __restrict anamelen;
 	} */ bsd_args;
-	int error, fd;
+	int error;
+
+	if (flags & ~(LINUX_SOCK_CLOEXEC | LINUX_SOCK_NONBLOCK))
+		return (EINVAL);
 
 	bsd_args.s = s;
 	/* XXX: */
@@ -785,23 +788,27 @@ linux_accept_common(struct thread *td, i
 			return (EINVAL);
 		return (error);
 	}
-	if (addr) {
-		error = linux_sa_put(PTRIN(addr));
-		if (error) {
-			(void)kern_close(td, td->td_retval[0]);
-			return (error);
-		}
-	}
 
 	/*
 	 * linux appears not to copy flags from the parent socket to the
-	 * accepted one, so we must clear the flags in the new descriptor.
-	 * Ignore any errors, because we already have an open fd.
+	 * accepted one, so we must clear the flags in the new descriptor
+	 * and apply the requested flags.
 	 */
-	fd = td->td_retval[0];
-	(void)kern_fcntl(td, fd, F_SETFL, 0);
-	td->td_retval[0] = fd;
-	return (0);
+	error = kern_fcntl(td, td->td_retval[0], F_SETFL, 0);
+	if (error)
+		goto out;
+	error = linux_set_socket_flags(td, td->td_retval[0], flags);
+	if (error)
+		goto out;
+	if (addr)
+		error = linux_sa_put(PTRIN(addr));
+
+out:
+	if (error) {
+		(void)kern_close(td, td->td_retval[0]);
+		td->td_retval[0] = 0;
+	}
+	return (error);
 }
 
 struct linux_accept_args {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200906012044.n51Kiwxd091373>