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

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
sendto.c
Go to the documentation of this file.
1 /* Copyright (C) 1994-2014 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 
26 /* Send N bytes of BUF on socket FD to peer at address ADDR (which is
27  ADDR_LEN bytes long). Returns the number sent, or -1 for errors. */
28 ssize_t
29 __sendto (int fd,
30  const void *buf,
31  size_t n,
32  int flags,
33  const struct sockaddr_un *addr,
34  socklen_t addr_len)
35 {
36  addr_port_t aport = MACH_PORT_NULL;
37  error_t err;
38  size_t wrote;
39 
40  /* Get an address port for the desired destination address. */
41  error_t create_address_port (io_t port,
42  const struct sockaddr_un *addr,
43  socklen_t addr_len,
44  addr_port_t *aport)
45  {
46  error_t err_port;
47 
48  if (addr->sun_family == AF_LOCAL)
49  {
50  /* For the local domain, we must look up the name as a file and talk
51  to it with the ifsock protocol. */
52  file_t file = __file_name_lookup (addr->sun_path, 0, 0);
53  if (file == MACH_PORT_NULL)
54  return errno;
55  err_port = __ifsock_getsockaddr (file, aport);
56  __mach_port_deallocate (__mach_task_self (), file);
57  if (err_port == MIG_BAD_ID || err_port == EOPNOTSUPP)
58  /* The file did not grok the ifsock protocol. */
59  err_port = ENOTSOCK;
60  }
61  else
62  {
63  err_port = __socket_create_address (port,
64  addr->sun_family,
65  (char *) addr,
66  addr_len,
67  aport);
68  }
69 
70  return err_port;
71  }
72 
73  err = HURD_DPORT_USE (fd,
74  ({
75  if (addr != NULL)
76  err = create_address_port (port, addr, addr_len,
77  &aport);
78  else
79  err = 0;
80  if (! err)
81  {
82  /* Send the data. */
83  err = __socket_send (port, aport,
84  flags, buf, n,
85  NULL,
86  MACH_MSG_TYPE_COPY_SEND, 0,
87  NULL, 0, &wrote);
88  }
89  err;
90  }));
91 
92  if (aport != MACH_PORT_NULL)
93  __mach_port_deallocate (__mach_task_self (), aport);
94 
95  return err ? __hurd_sockfail (fd, flags, err) : wrote;
96 }
97 
#define NULL
Definition: explodename.c:34
file_t __file_name_lookup(const char *file, int flags, mode_t mode)
error_t err
Definition: tls.h:154
#define weak_alias(name, aliasname)
Definition: libc-symbols.h:96
const char * file
#define AF_LOCAL
Definition: socket.h:109
int int flags
Definition: unistd.h:83
#define HURD_DPORT_USE(fd, expr)
Definition: fd.h:105
int error_t
Definition: argp.h:64
mach_port_t() __mach_task_self(void)
unsigned long int n
Definition: dcigettext.c:414
char sun_path[108]
Definition: un.h:32
#define errno
Definition: errno.h:26
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
__socklen_t socklen_t
Definition: socket.h:35
char buf[160]
const void * addr
Definition: files-hosts.c:115
ssize_t sendto(int __fd, const void *__buf, size_t __n, int __flags, __CONST_SOCKADDR_ARG __addr, socklen_t __addr_len)