svn commit: r193263 - head/sys/compat/linux
Dmitry Chagin
dchagin at FreeBSD.org
Mon Jun 1 20:44:59 UTC 2009
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 {
More information about the svn-src-all
mailing list