Pushes the Plan 9 BSD shims into glibc (XCC)
[akaros.git] / tools / compilers / gcc-glibc / glibc-2.19-akaros / sysdeps / akaros / getpeername.c
1 /* 
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 /* posix */
10 #include <sys/types.h>
11 #include <unistd.h>
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <fcntl.h>
15 #include <string.h>
16 #include <errno.h>
17
18 /* bsd extensions */
19 #include <sys/uio.h>
20 #include <sys/socket.h>
21 #include <netinet/in.h>
22 #include <sys/un.h>
23
24 #include "plan9_sockets.h"
25
26 /* Put the address of the peer connected to socket FD into *ADDR
27    (which is *LEN bytes long), and its actual length into *LEN.  */
28 int __getpeername(int fd, __SOCKADDR_ARG addr, socklen_t * __restrict alen)
29 {
30         Rock *r;
31         int i;
32         struct sockaddr_in *rip;
33         struct sockaddr_un *runix;
34
35         r = _sock_findrock(fd, 0);
36         if (r == 0) {
37                 errno = ENOTSOCK;
38                 return -1;
39         }
40
41         switch (r->domain) {
42                 case PF_INET:
43                         rip = (struct sockaddr_in *)&r->raddr;
44                         memmove(addr.__sockaddr_in__, rip, sizeof(struct sockaddr_in));
45                         *alen = sizeof(struct sockaddr_in);
46                         break;
47                 case PF_UNIX:
48                         runix = (struct sockaddr_un *)&r->raddr;
49                         i = &runix->sun_path[strlen(runix->sun_path)] - (char *)runix;
50                         memmove(addr.__sockaddr_un__, runix, i);
51                         *alen = i;
52                         break;
53                 default:
54                         errno = EAFNOSUPPORT;
55                         return -1;
56         }
57         return 0;
58 }
59
60 weak_alias(__getpeername, getpeername)