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 #include <sys/stat.h> 10*219b2ee8SDavid du Colombier #include <signal.h> 11*219b2ee8SDavid du Colombier 12*219b2ee8SDavid du Colombier /* socket extensions */ 13*219b2ee8SDavid du Colombier #include <sys/uio.h> 14*219b2ee8SDavid du Colombier #include <sys/socket.h> 15*219b2ee8SDavid du Colombier #include <netinet/in.h> 16*219b2ee8SDavid du Colombier #include <sys/un.h> 17*219b2ee8SDavid du Colombier 18*219b2ee8SDavid du Colombier /* plan 9 */ 19*219b2ee8SDavid du Colombier #include "lib.h" 20*219b2ee8SDavid du Colombier #include "sys9.h" 21*219b2ee8SDavid du Colombier 22*219b2ee8SDavid du Colombier #include "priv.h" 23*219b2ee8SDavid du Colombier 24*219b2ee8SDavid du Colombier int 25*219b2ee8SDavid du Colombier bind(int fd, void *a, int alen) 26*219b2ee8SDavid du Colombier { 27*219b2ee8SDavid du Colombier int n, len, cfd; 28*219b2ee8SDavid du Colombier Rock *r; 29*219b2ee8SDavid du Colombier char msg[128]; 30*219b2ee8SDavid du Colombier struct sockaddr_in *lip; 31*219b2ee8SDavid du Colombier 32*219b2ee8SDavid du Colombier /* assign the address */ 33*219b2ee8SDavid du Colombier r = _sock_findrock(fd, 0); 34*219b2ee8SDavid du Colombier if(r == 0){ 35*219b2ee8SDavid du Colombier errno = ENOTSOCK; 36*219b2ee8SDavid du Colombier return -1; 37*219b2ee8SDavid du Colombier } 38*219b2ee8SDavid du Colombier if(alen > sizeof(r->addr)){ 39*219b2ee8SDavid du Colombier errno = ENAMETOOLONG; 40*219b2ee8SDavid du Colombier return -1; 41*219b2ee8SDavid du Colombier } 42*219b2ee8SDavid du Colombier memmove(&r->addr, a, alen); 43*219b2ee8SDavid du Colombier 44*219b2ee8SDavid du Colombier /* the rest is IP sepecific */ 45*219b2ee8SDavid du Colombier if (r->domain != PF_INET) 46*219b2ee8SDavid du Colombier return 0; 47*219b2ee8SDavid du Colombier 48*219b2ee8SDavid du Colombier cfd = open(r->ctl, O_RDWR); 49*219b2ee8SDavid du Colombier if(cfd < 0){ 50*219b2ee8SDavid du Colombier errno = EBADF; 51*219b2ee8SDavid du Colombier return -1; 52*219b2ee8SDavid du Colombier } 53*219b2ee8SDavid du Colombier lip = (struct sockaddr_in*)&r->addr; 54*219b2ee8SDavid du Colombier if(lip->sin_port > 0) 55*219b2ee8SDavid du Colombier sprintf(msg, "bind %d", lip->sin_port); 56*219b2ee8SDavid du Colombier else 57*219b2ee8SDavid du Colombier sprintf(msg, "bind *"); 58*219b2ee8SDavid du Colombier n = write(cfd, msg, strlen(msg)); 59*219b2ee8SDavid du Colombier if(n < 0){ 60*219b2ee8SDavid du Colombier errno = EOPNOTSUPP; /* Improve error reporting!!! */ 61*219b2ee8SDavid du Colombier close(cfd); 62*219b2ee8SDavid du Colombier return -1; 63*219b2ee8SDavid du Colombier } 64*219b2ee8SDavid du Colombier close(cfd); 65*219b2ee8SDavid du Colombier 66*219b2ee8SDavid du Colombier if(lip->sin_port <= 0) 67*219b2ee8SDavid du Colombier _sock_ingetaddr(r, lip, &len, "local"); 68*219b2ee8SDavid du Colombier 69*219b2ee8SDavid du Colombier return 0; 70*219b2ee8SDavid du Colombier } 71