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);
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;
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);
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));
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;
}