about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/accept.c
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@schwinge.name>2012-05-10 12:53:02 -0700
committerRoland McGrath <roland@hack.frob.com>2012-05-10 15:57:22 -0700
commiteb43375f0f7640a32fd6c67b94291419acb872d8 (patch)
tree75a8f75ddd068870b245681466e908c8ec08e02a /sysdeps/mach/hurd/accept.c
parentbcf5524012216fee3a7668a3b43aad3243a083b0 (diff)
downloadglibc-eb43375f0f7640a32fd6c67b94291419acb872d8.tar.gz
glibc-eb43375f0f7640a32fd6c67b94291419acb872d8.tar.xz
glibc-eb43375f0f7640a32fd6c67b94291419acb872d8.zip
Hurd: accept4
Diffstat (limited to 'sysdeps/mach/hurd/accept.c')
-rw-r--r--sysdeps/mach/hurd/accept.c65
1 files changed, 5 insertions, 60 deletions
diff --git a/sysdeps/mach/hurd/accept.c b/sysdeps/mach/hurd/accept.c
index 78b5c67d81..52dfdf8baa 100644
--- a/sysdeps/mach/hurd/accept.c
+++ b/sysdeps/mach/hurd/accept.c
@@ -1,4 +1,5 @@
-/* Copyright (C) 1992,1993,1994,1997,1999,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1992-2012 Free Software Foundation, Inc.
+
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -15,72 +16,16 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <errno.h>
-#include <fcntl.h>
-#include <string.h>
 #include <sys/socket.h>
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/socket.h>
 
 /* Await a connection on socket FD.
    When a connection arrives, open a new socket to communicate with it,
-   set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
+   set *ADDRARG (which is *ADDR_LEN bytes long) to the address of the connecting
    peer and *ADDR_LEN to the address's actual length, and return the
    new socket's descriptor, or -1 for errors.  */
 int
-accept (fd, addrarg, addr_len)
-      int fd;
-      __SOCKADDR_ARG addrarg;
-      socklen_t *addr_len;
+accept (int fd, __SOCKADDR_ARG addrarg, socklen_t *addr_len)
 {
-  error_t err;
-  socket_t new;
-  addr_port_t aport;
-  struct sockaddr *addr = addrarg.__sockaddr__;
-  char *buf = (char *) addr;
-  mach_msg_type_number_t buflen;
-  int type;
-
-  if (err = HURD_DPORT_USE (fd, __socket_accept (port, &new, &aport)))
-    return __hurd_dfail (fd, err);
-
-  if (addr != NULL)
-    {
-      buflen = *addr_len;
-      err = __socket_whatis_address (aport, &type, &buf, &buflen);
-      if (err == EOPNOTSUPP)
-	/* If the protocol server can't tell us the address, just return a
-	   zero-length one.  */
-	{
-	  buf = (char *)addr;
-	  buflen = 0;
-	  err = 0;
-	}
-    }
-  __mach_port_deallocate (__mach_task_self (), aport);
-
-  if (err)
-    {
-      __mach_port_deallocate (__mach_task_self (), new);
-      return __hurd_dfail (fd, err);
-    }
-
-  if (addr != NULL)
-    {
-      if (*addr_len > buflen)
-	*addr_len = buflen;
-      
-      if (buf != (char *) addr)
-	{
-	  memcpy (addr, buf, *addr_len);
-	  __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen);
-	}
-
-      if (buflen > 0)
-	addr->sa_family = type;
-    }
-
-  return _hurd_intern_fd (new, O_IGNORE_CTTY, 1);
+  return __libc_accept4 (fd, addrarg, addr_len, 0);
 }
 libc_hidden_def (accept)