xref: /plan9/sys/src/ape/lib/bsd/getpeername.c (revision 6ca6a3e703ee2ec4aed99c2177f71d7f127da6d9)
1 /* posix */
2 #include <sys/types.h>
3 #include <unistd.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <fcntl.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <sys/stat.h>
10 
11 /* bsd extensions */
12 #include <sys/uio.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <sys/un.h>
16 
17 #include "priv.h"
18 
19 int
getpeername(int fd,void * addr,int * alen)20 getpeername(int fd, void *addr, int *alen)
21 {
22 	Rock *r;
23 	int i;
24 	struct sockaddr_in *rip;
25 	struct sockaddr_un *runix;
26 
27 	r = _sock_findrock(fd, 0);
28 	if(r == 0){
29 		errno = ENOTSOCK;
30 		return -1;
31 	}
32 
33 	switch(r->domain){
34 	case PF_INET:
35 		rip = (struct sockaddr_in*)&r->raddr;
36 		memmove(addr, rip, sizeof(struct sockaddr_in));
37 		*alen = sizeof(struct sockaddr_in);
38 		break;
39 	case PF_UNIX:
40 		runix = (struct sockaddr_un*)&r->raddr;
41 		i = &runix->sun_path[strlen(runix->sun_path)] - (char*)runix;
42 		memmove(addr, runix, i);
43 		*alen = i;
44 		break;
45 	default:
46 		errno = EAFNOSUPPORT;
47 		return -1;
48 	}
49 	return 0;
50 }
51