glibc  2.22
About: The GNU C Library ("system calls" and other basic facilities such as open, malloc, printf, exit ...).
  Fossies Dox: glibc-2.22.tar.gz  ("inofficial" and yet experimental doxygen-generated source code documentation)  

sendto.c
Go to the documentation of this file.
1 /* Copyright (C) 1994-2015 Free Software Foundation, Inc.
2  This file is part of the GNU C Library.
3 
4  The GNU C Library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Lesser General Public
6  License as published by the Free Software Foundation; either
7  version 2.1 of the License, or (at your option) any later version.
8 
9  The GNU C Library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Lesser General Public License for more details.
13 
14  You should have received a copy of the GNU Lesser General Public
15  License along with the GNU C Library; if not, see
16  <http://www.gnu.org/licenses/>. */
17 
18 #include <errno.h>
19 #include <sys/socket.h>
20 #include <sys/un.h>
21 #include <hurd.h>
22 #include <hurd/fd.h>
23 #include <hurd/ifsock.h>
24 #include <hurd/socket.h>
25 #include "hurd/hurdsocket.h"
26 
27 /* Send N bytes of BUF on socket FD to peer at address ADDR (which is
28  ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
29 ssize_t
30 __sendto (int fd,
31  const void *buf,
32  size_t n,
33  int flags,
34  const struct sockaddr_un *addr,
35  socklen_t addr_len)
36 {
37  addr_port_t aport = MACH_PORT_NULL;
38  error_t err;
39  size_t wrote;
40 
41  /* Get an address port for the desired destination address. */
42  error_t create_address_port (io_t port,
43  const struct sockaddr_un *addr,
44  socklen_t addr_len,
45  addr_port_t *aport)
46  {
47  error_t err_port;
48 
49  if (addr->sun_family == AF_LOCAL)
50  {
51  char *name = _hurd_sun_path_dupa (addr, addr_len);
52  /* For the local domain, we must look up the name as a file and talk
53  to it with the ifsock protocol. */
54  file_t file = __file_name_lookup (name, 0, 0);
55  if (file == MACH_PORT_NULL)
56  return errno;
57  err_port = __ifsock_getsockaddr (file, aport);
58  __mach_port_deallocate (__mach_task_self (), file);
59  if (err_port == MIG_BAD_ID || err_port == EOPNOTSUPP)
60  /* The file did not grok the ifsock protocol. */
61  err_port = ENOTSOCK;
62  }
63  else
64  {
65  err_port = __socket_create_address (port,
66  addr->sun_family,
67  (char *) addr,
68  addr_len,
69  aport);
70  }
71 
72  return err_port;
73  }
74 
75  err = HURD_DPORT_USE (fd,
76  ({
77  if (addr != NULL)
78  err = create_address_port (port, addr, addr_len,
79  &aport);
80  else
81  err = 0;
82  if (! err)
83  {
84  /* Send the data. */
85  err = __socket_send (port, aport,
86  flags, buf, n,
87  NULL,
88  MACH_MSG_TYPE_COPY_SEND, 0,
89  NULL, 0, &wrote);
90  }
91  err;
92  }));
93 
94  if (aport != MACH_PORT_NULL)
95  __mach_port_deallocate (__mach_task_self (), aport);
96 
97  return err ? __hurd_sockfail (fd, flags, err) : wrote;
98 }
99 
#define NULL
Definition: explodename.c:32
error_t err
Definition: tls.h:166
file_t __file_name_lookup(const char *file, int flags, mode_t mode)
#define weak_alias(name, aliasname)
Definition: libc-symbols.h:115
#define AF_LOCAL
Definition: socket.h:109
int int flags
Definition: unistd.h:86
#define HURD_DPORT_USE(fd, expr)
Definition: fd.h:105
int error_t
Definition: argp.h:66
mach_port_t() __mach_task_self(void)
ssize_t __sendto(int fd, const __ptr_t buf, size_t n, int flags, __CONST_SOCKADDR_ARG addr, socklen_t addr_len)
Definition: sendto.c:24
Definition: un.h:29
_HURD_FD_H_EXTERN_INLINE int __hurd_sockfail(int fd, int flags, error_t err)
Definition: fd.h:188
__ssize_t ssize_t
Definition: types.h:109
__thread int errno
Definition: errno.c:31
#define _hurd_sun_path_dupa(addr, len)
Definition: hurdsocket.h:27
__socklen_t socklen_t
Definition: socket.h:35
char buf[160]
size_t n
Definition: tst_swprintf.c:10
const void * addr
Definition: files-hosts.c:115
const char * file
ssize_t sendto(int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)