]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/ape/lib/bsd/bind.c
ape: Add mkstemp to /sys/src/ape/lib/ap/gen/mkfile
[plan9front.git] / sys / src / ape / lib / bsd / bind.c
index 040c62fa0a2430886796f1dabc1372c5bc73ac83..a4c7ae573ce3f4e0e2b8db4f9313e8a2a2e16577 100644 (file)
 int
 bind(int fd, void *a, int alen)
 {
-       int n, len, cfd;
+       int n, len, cfd, port;
+       struct sockaddr *sa;
        Rock *r;
        char msg[128];
-       struct sockaddr_in *lip;
 
        /* assign the address */
        r = _sock_findrock(fd, 0);
@@ -35,6 +35,11 @@ bind(int fd, void *a, int alen)
                errno = ENOTSOCK;
                return -1;
        }
+       sa = (struct sockaddr*)a;
+       if(sa->sa_family != r->domain){
+               errno = EAFNOSUPPORT;
+               return -1;
+       }
        if(alen > sizeof(r->addr)){
                errno = ENAMETOOLONG;
                return -1;
@@ -42,7 +47,7 @@ bind(int fd, void *a, int alen)
        memmove(&r->addr, a, alen);
 
        /* the rest is IP sepecific */
-       if (r->domain != PF_INET)
+       if (r->domain != PF_INET && r->domain != PF_INET6)
                return 0;
 
        cfd = open(r->ctl, O_RDWR);
@@ -50,9 +55,9 @@ bind(int fd, void *a, int alen)
                errno = EBADF;
                return -1;
        }
-       lip = (struct sockaddr_in*)&r->addr;
-       if(lip->sin_port > 0)
-               snprintf(msg, sizeof msg, "bind %d", ntohs(lip->sin_port));
+       port = _sock_inport(&r->addr);
+       if(port > 0)
+               snprintf(msg, sizeof msg, "bind %d", port);
        else
                strcpy(msg, "bind *");
        n = write(cfd, msg, strlen(msg));
@@ -62,9 +67,8 @@ bind(int fd, void *a, int alen)
                return -1;
        }
        close(cfd);
-
-       if(lip->sin_port <= 0)
-               _sock_ingetaddr(r, lip, &len, "local");
+       if(port <= 0)
+               _sock_ingetaddr(r, &r->addr, 0, "local");
 
        return 0;
 }