PCI: adds device-specific data pointer
[akaros.git] / user / bsd / 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 "priv.h"
25
26 int getpeername (int fd, __SOCKADDR_ARG addr,
27                         socklen_t *__restrict alen)
28 {
29         Rock *r;
30         int i;
31         struct sockaddr_in *rip;
32         struct sockaddr_un *runix;
33
34         r = _sock_findrock(fd, 0);
35         if(r == 0){
36                 errno = ENOTSOCK;
37                 return -1;
38         }
39
40         switch(r->domain){
41         case PF_INET:
42                 rip = (struct sockaddr_in*)&r->raddr;
43                 memmove(addr, rip, sizeof(struct sockaddr_in));
44                 *alen = sizeof(struct sockaddr_in);
45                 break;
46         case PF_UNIX:
47                 runix = (struct sockaddr_un*)&r->raddr;
48                 i = &runix->sun_path[strlen(runix->sun_path)] - (char*)runix;
49                 memmove(addr, runix, i);
50                 *alen = i;
51                 break;
52         default:
53                 errno = EAFNOSUPPORT;
54                 return -1;
55         }
56         return 0;
57 }