]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/ape/lib/bsd/getsockname.c
ape: Add mkstemp to /sys/src/ape/lib/ap/gen/mkfile
[plan9front.git] / sys / src / ape / lib / bsd / getsockname.c
index aa22d3217fd9eb2ae6ac63eb620eac198ae6e907..87177228a8e27e3794ec910ba78e483c9ac5d9af 100644 (file)
@@ -19,8 +19,7 @@ int
 getsockname(int fd, struct sockaddr *addr, int *alen)
 {
        Rock *r;
-       int i;
-       struct sockaddr_in *lip;
+       int len, olen;
        struct sockaddr_un *lunix;
 
        r = _sock_findrock(fd, 0);
@@ -29,20 +28,29 @@ getsockname(int fd, struct sockaddr *addr, int *alen)
                return -1;
        }
 
+       len = 0;
        switch(r->domain){
        case PF_INET:
-               lip = (struct sockaddr_in*)addr;
-               _sock_ingetaddr(r, lip, alen, "local");
+       case PF_INET6:
+               _sock_ingetaddr(r, &r->addr, &len, "local");
                break;
        case PF_UNIX:
                lunix = (struct sockaddr_un*)&r->addr;
-               i = &lunix->sun_path[strlen(lunix->sun_path)] - (char*)lunix;
-               memmove(addr, lunix, i);
-               *alen = i;
+               len = &lunix->sun_path[strlen(lunix->sun_path)] - (char*)lunix;
                break;
        default:
                errno = EAFNOSUPPORT;
                return -1;
        }
+
+       if(alen != 0){
+               olen = *alen;
+               *alen = len;
+               if(olen < len)
+                       len = olen;
+       }
+       if(addr != 0 && len > 0)
+               memmove(addr, &r->addr, len);
+
        return 0;
 }