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