about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/recvmsg.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/mach/hurd/recvmsg.c')
-rw-r--r--sysdeps/mach/hurd/recvmsg.c146
1 files changed, 0 insertions, 146 deletions
diff --git a/sysdeps/mach/hurd/recvmsg.c b/sysdeps/mach/hurd/recvmsg.c
deleted file mode 100644
index 59038dd6d6..0000000000
--- a/sysdeps/mach/hurd/recvmsg.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Copyright (C) 2001-2017 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
-   modify it under the terms of the GNU Lesser General Public License as
-   published by the Free Software Foundation; either version 2.1 of the
-   License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If
-   not, see <http://www.gnu.org/licenses/>.  */
-
-#include <errno.h>
-#include <string.h>
-#include <sys/socket.h>
-
-#include <hurd.h>
-#include <hurd/fd.h>
-#include <hurd/socket.h>
-
-/* Receive a message as described by MESSAGE from socket FD.
-   Returns the number of bytes read or -1 for errors.  */
-ssize_t
-__libc_recvmsg (int fd, struct msghdr *message, int flags)
-{
-  error_t err;
-  addr_port_t aport;
-  char *data = NULL;
-  mach_msg_type_number_t len = 0;
-  mach_port_t *ports;
-  mach_msg_type_number_t nports = 0;
-  char *cdata = NULL;
-  mach_msg_type_number_t clen = 0;
-  size_t amount;
-  char *buf;
-  int i;
-
-  /* Find the total number of bytes to be read.  */
-  amount = 0;
-  for (i = 0; i < message->msg_iovlen; i++)
-    {
-      amount += message->msg_iov[i].iov_len;
-
-      /* As an optimization, we set the initial values of DATA and LEN
-         from the first non-empty iovec.  This kicks-in in the case
-         where the whole packet fits into that iovec buffer.  */
-      if (data == NULL && message->msg_iov[i].iov_len > 0)
-	{
-	  data = message->msg_iov[i].iov_base;
-	  len = message->msg_iov[i].iov_len;
-	}
-    }
-
-  buf = data;
-  if (err = HURD_DPORT_USE (fd, __socket_recv (port, &aport,
-					       flags, &data, &len,
-					       &ports, &nports,
-					       &cdata, &clen,
-					       &message->msg_flags, amount)))
-    return __hurd_sockfail (fd, flags, err);
-
-  if (message->msg_name != NULL && aport != MACH_PORT_NULL)
-    {
-      char *buf = message->msg_name;
-      mach_msg_type_number_t buflen = message->msg_namelen;
-      int type;
-
-      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 = message->msg_name;
-	  buflen = 0;
-	  err = 0;
-	}
-
-      if (err)
-	{
-	  __mach_port_deallocate (__mach_task_self (), aport);
-	  return __hurd_sockfail (fd, flags, err);
-	}
-
-      if (message->msg_namelen > buflen)
-	message->msg_namelen = buflen;
-
-      if (buf != message->msg_name)
-	{
-	  memcpy (message->msg_name, buf, message->msg_namelen);
-	  __vm_deallocate (__mach_task_self (), (vm_address_t) buf, buflen);
-	}
-
-      if (buflen > 0)
-	((struct sockaddr *) message->msg_name)->sa_family = type;
-    }
-  else if (message->msg_name != NULL)
-    message->msg_namelen = 0;
-
-  __mach_port_deallocate (__mach_task_self (), aport);
-
-  if (buf == data)
-    buf += len;
-  else
-    {
-      /* Copy the data into MSG.  */
-      if (len > amount)
-	message->msg_flags |= MSG_TRUNC;
-      else
-	amount = len;
-
-      buf = data;
-      for (i = 0; i < message->msg_iovlen; i++)
-	{
-#define min(a, b)	((a) > (b) ? (b) : (a))
-	  size_t copy = min (message->msg_iov[i].iov_len, amount);
-
-	  memcpy (message->msg_iov[i].iov_base, buf, copy);
-
-	  buf += copy;
-	  amount -= copy;
-	  if (len == 0)
-	    break;
-	}
-
-      __vm_deallocate (__mach_task_self (), (vm_address_t) data, len);
-    }
-
-  /* Copy the control message into MSG.  */
-  if (clen > message->msg_controllen)
-    message->msg_flags |= MSG_CTRUNC;
-  else
-    message->msg_controllen = clen;
-  memcpy (message->msg_control, cdata, message->msg_controllen);
-
-  __vm_deallocate (__mach_task_self (), (vm_address_t) cdata, clen);
-
-  return (buf - data);
-}
-
-weak_alias (__libc_recvmsg, recvmsg)
-weak_alias (__libc_recvmsg, __recvmsg)