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