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